2016-08-02 37 views
0

我正在使用PostgreSQL。我創建了一個索引指定列:Postgres不會從文本/ varchar列獲取索引

# CREATE INDEX sampleidx ON fake_organizations (objectable_type) ; 
CREATE INDEX 

領域objectable_typevarchar類型。當我按字段選擇記錄時,它使用SeqScan進行顯式類型轉換,並且不選取索引。

# explain analyze select * from fake_organizations where objectable_type = 'Lot' LIMIT 10; 
QUERY PLAN              
---------------------------------------------------------------------------------------------------------------------- 
Limit (cost=0.00..2.01 rows=10 width=493) (actual time=0.001..0.001 rows=0 loops=1) 
-> Seq Scan on fake_organizations (cost=0.00..11.88 rows=59 width=493) (actual time=0.000..0.000 rows=0 loops=1) 
    Filter: ((objectable_type)::text = 'Lot'::text) 
Planning time: 0.765 ms 
Execution time: 0.027 ms 
(5 строк) 

當列的類型爲text時,發生同樣的情況,但沒有類型轉換。

所以問題是:爲什麼?

+0

表中有多少行? – joop

+0

@joop測試env沒有記錄,在戰場env〜10M。 –

回答

1

看起來你的桌子是空的或幾乎是空的。沒有必要使用索引。掃描更容易。當您必須對2個對象進行排序時,不要使用複雜的算法。出於同樣的原因,Postgres不使用樹遍歷算法。

+0

空表僅用於快速目的。相同的情況適用於填表(大約10M記錄)。 –

+0

記錄是否不同(返回多少條記錄)?數據庫使用統計分佈來準備執行計劃。 –

+0

絕對毫無意義地使用空表或僅有幾百行的表來預測10m記錄表上的性能。 – e4c5