私はPostgreSQL 8.1を使用しており、3つの要素の複合主キーと他のインデックスのないテーブルがあります: PRIMARY KEY (el1, el2, el3)
SELECT * FROM table WHERE el1 IN (...) のような選択操作を行う場合、操作は主キーに el1 が含まれていることを考慮しますか、それとも役立つインデックスがないために処理が遅くなりますか?
ありがとう。
私はPostgreSQL 8.1を使用しており、3つの要素の複合主キーと他のインデックスのないテーブルがあります: PRIMARY KEY (el1, el2, el3)
SELECT * FROM table WHERE el1 IN (...) のような選択操作を行う場合、操作は主キーに el1 が含まれていることを考慮しますか、それとも役立つインデックスがないために処理が遅くなりますか?
ありがとう。
PostgreSQLのドキュメントによると:
複数列の B ツリー インデックスは、インデックスの列の任意のサブセットを含むクエリ条件で使用できますが、インデックスは先頭 (一番左) の列に制約がある場合に最も効率的です。正確なルールは、スキャンされるインデックスの部分を制限するために、先行する列の等価制約と、等価制約を持たない最初の列の不等制約が使用されるということです。
また、クエリで説明プランを実行して、この動作を判断することもできます。
Postgres (および私が知っているすべての SQL エンジン) は、複数フィールド インデックスの最初の 1 つまたは複数のフィールドを使用できます。あなたのケースでは、インデックスが(el1、el2、el3)にある場合、「where el1=x」または「where el1=x and el2=y」のようなクエリにインデックスを使用できます。
el1 の値を指定しないと、インデックスを使用できません。「select ... where el2=y」のように、インデックスは役に立ちません。