部分インデックス
PostgreSQL の部分インデックスとは?
部分インデックスは WHERE 条件に一致する行だけを対象とするため、クエリがテーブルの明確に定義された一部を対象とする場合に、小さく高速なインデックスになります。
部分インデックスは、CREATE INDEX ... WHERE の条件で定義される、テーブルの一部の行に対して作成するインデックスです。条件を満たす行だけがインデックスエントリを持ちます。
部分インデックスが効果を発揮するのは、未完了のタスクや未払いの注文のように、クエリがテーブルの小さな一部に集中し、大半の行はほとんどクエリされない場合です。オプティマイザがこのインデックスを使えるのは、クエリの WHERE 句がインデックスの条件を含意すると証明できる場合に限られるため、クエリの条件はインデックスの条件に合わせて書いてください。部分一意インデックスを使えば、その部分集合の中だけで一意性を強制することもできます。
例
この例では、完了していない 1% のタスクだけにインデックスを作成します。EXPLAIN では、未完了タスクを取得するクエリが tasks_open_idx を使っていることがわかります。
CREATE TABLE tasks (id int PRIMARY KEY, done boolean NOT NULL, title text);
INSERT INTO tasks
SELECT g, g % 100 <> 0, 'task ' || g FROM generate_series(1, 100000) AS g;
CREATE INDEX tasks_open_idx ON tasks (id) WHERE NOT done;
ANALYZE tasks;
EXPLAIN SELECT id, title FROM tasks WHERE NOT done;拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。