PostgreSQL のインデックスはデフォルトで IS NULL 句に使用されない

表題の通り hoge テーブルの fuga 列にインデックスを作成しても

CREATE INDEX hoge_fuga ON hoge(fuga);

条件に IS NULL を含む検索ではインデックスは利用されません。

SELECT * FROM hoge WHERE fuga IS NULL;

結果、上の SQL はレコード数が増えると低速になる可能性が高まります。

このような場合、部分インデックスを利用するとうまく動きます(PostgreSQL の場合 7.0.0 以降の対応です)。

CREATE INDEX hoge_fuga_null ON hoge(fuga) WHERE fuga IS NULL;