約450万行のPostgresテーブルがあります。列は基本的にちょうどです
low BIGINT,
high BIGINT,
data1,
data2,
...
このテーブルをクエリすると、長整数があり、その値を含むとの間の範囲に対応するデータを検索する必要がありlow
ますhigh
。高速ルックアップのためにこのテーブルにインデックスを付けるための最良の方法は何でしょうか?
約450万行のPostgresテーブルがあります。列は基本的にちょうどです
low BIGINT,
high BIGINT,
data1,
data2,
...
このテーブルをクエリすると、長整数があり、その値を含むとの間の範囲に対応するデータを検索する必要がありlow
ますhigh
。高速ルックアップのためにこのテーブルにインデックスを付けるための最良の方法は何でしょうか?
ソート順が逆の複数列インデックス:
CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);
このようにして、インデックスを十分に高い場所まで前方にスキャンしてから、低くなりすぎるlow
まですべての行を取得できます。すべて1回のスキャンで実行できます。これが、インデックスの並べ替え順序が最初に実装されるhigh
主な理由です。つまり、異なる順序の複数列インデックスで異なる並べ替え順序を組み合わせるためです。基本的に、bツリーインデックスは実質的に同じ速度で両方向にトラバースできるため、単一列インデックスには/はほとんど必要ありません。ASC
DESC
PostgreSQL9.2の新しい範囲タイプにも興味があるかもしれません。次のようなGiSTインデックスでインデックスを作成できます。
CREATE INDEX tbl_idx ON tbl USING gist (low_high);
このフォームのクエリを非常に高速に実行する必要があります。
SELECT * FROM tbl WHERE my_value <@ low_high;
<@
「要素は」演算子に含まれています。