ルックアップのパフォーマンスを改善しようとしています。テーブルがあると仮定して
CREATE TABLE tab (
id SERIAL, -- PRIMARY KEY
code VARCHAR(20),
....
....
);
このように、「コード」で「id」(PK) 値のみを検索する必要があります (そのテーブルの他のフィールドは必要ありません)。
SELECT id FROM tab WHERE code IN ('a', 'b', 'c').
次のように、「コード」に単純なインデックスを作成できます。
CREATE INDEX tab_code_idx ON tab USING btree(code);
また、クエリで参照されるすべてのフィールドがインデックスに含まれている場合、PostgreSQL 9.2+ はインデックスのみのスキャンを実装していることも知っています。だから私の質問はこれです。「コード」と「ID」の両方を含むインデックスを作成するメリットはありますか?
CREATE INDEX tab_code_id_idx ON tab USING btree(code, id);
検索したところ、PK 値がそのテーブルの他のインデックスに含まれているかどうかに関する情報を見つけることができました。PK がすべてのインデックスに含まれている場合は、「id」値を検索するために「コード」にインデックスを付けるだけで済みます。