2016-08-02 5 views
0

私はPostgreSQLを使用しています。Postgresはtext/varcharカラムのインデックスを取得しません

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

フィールドobjectable_typevarcharの種類があります:私は指定された列のインデックスを作成しました。フィールドでレコードを選択すると、明示的な型キャストでSeqScanが使用され、インデックスは取得されません。カラムはtextのタイプを有する場合

# 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 строк) 

同じケースが、型キャストせずに起こっています。

質問はなぜですか?

+0

テーブルには何行ありますか? – joop

+0

@ jaop on test env戦闘中env〜10M。 –

答えて

1

テーブルが空であるか、ほとんど空であるようです。インデックスを使用する必要はありません。スキャンする方が簡単です。 2つのオブジェクトをソートする必要がある場合、複雑なアルゴリズムは使用しません。 Postgresは同じ理由でツリートラバーサルアルゴリズムを使用しません。

+0

空のテーブルは、迅速性の目的でのみ使用されます。同じ場合が塗りつぶしテーブルに適用されます(約10Mレコード)。 –

+0

レコードは区別されます(返されるレコード数)?データベースは統計分布を使用して実行計画を作成します。 –

+0

10mのレコード表にどのような性能があるかを予測するために、数百行しかない空の表または表を使用することは絶対に無意味です。 – e4c5

関連する問題