2016-04-14 11 views
1

テーブルmy_tableとフィールドkind:stringがあり、このフィールドにインデックスがあります。PostgresでOR条件を使用すると、クエリプランのインデックスがスキップされる

私はPostgresは、クエリのための2つの異なるクエリ・プランを構築することに気付きました:

SELECT * FROM my_table 
WHERE kind = 'kind1' OR kind IS NULL; 

SELECT * FROM my_table 
WHERE kind = 'kind1'; 

秒1が行うのに対し、最初のものはインデックスを使用しません。どうして?

私はインデックスが使用されるかどうかについて多くの条件があることを知っており、クエリプランについて多くのことを読んだことがありますが、このケースは依然として私には分かりません。

+3

実際に 'kind IN( 'kind1'、NULL)'は 'kind = 'kind1''に等しいです。 – Abelisto

+0

@Abelisto、ばかげた質問、編集済み –

答えて

1

Abelistoは、クエリの2つのバージョンが同じではないと説明しています。 SQLエンジン(一般的に)は、ORのインデックスを使用することができません。 NULLの値が非常に多い可能性があります。つまり、Postgresは、NULLと比較するとインデックスが有用であるとは思っていません。それはデータに依存します。

あなたのようにクエリを書き換えてみてくださいすることができます

SELECT * 
FROM my_table 
WHERE kind = 'type1' 
UNION ALL 
SELECT * 
FROM my_table 
WHERE kind IS NULL; 

Postgresは、彼らがデータに適している場合、各サブクエリのインデックスを使用することを選択するかもしれません。

+0

このようなこのようなクエリを書き換えることはできません。それは巨大なものの一部です –

関連する問題