12

複合型の特定のフィールドにインデックスを持つことは可能ですか? たとえば、型を作成するとします。

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);

(特にHash / GIST / GIN)インデックスをr1つ以上iにしたいのですが、それは可能ですか?

同様に、配列フィールドの 1 番目、2 番目、3 番目、... の要素にインデックスを設定することは可能ですか?

を使用すると仮定すると、すべてのインデックス、すべてのインデックスなどcomplex[]を持つことは可能でしょうか?complex[0]complex[1]

4

1 に答える 1

33

はい、絶対に可能です。式インデックスを使用します。複雑な部分は、複合型の構文です

複合型の要素の B ツリー インデックス:

CREATE TABLE tbl (tbl_id serial, co complex);

CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!

db<>fiddle here -EXPLAIN ANALYZE
古いsqlfiddleを使用

複合型の配列であっても、配列の事前定義された要素に対して同じことが機能します (配列全体ではありません!)。

CREATE TABLE tbl2 (tbl2_id serial, co complex[]);

CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!

expression-index は、式が多かれ少なかれ文字どおりに一致する場合にのみクエリに使用できることに注意してください。

しかし、それはあなたが言及したようなGINインデックスでは意味がありません。マニュアル:

GINはGeneralized Inverted Indexの略です。GIN は、インデックスが作成されるアイテムが複合値であり、インデックスによって処理されるクエリが複合アイテム内に現れる要素値を検索する必要がある場合を処理するように設計されています。

GIN インデックスは、複合型の配列全体で意味があり、その中の要素を検索できます。ただし、特定のタイプの実装が必要です。標準 Postgres の例のリストを次に示します(すべての 1 次元配列の基本的なサポートに加えて)。

于 2013-02-23T13:34:11.003 に答える