2013-02-23 13 views
6

複合型の特定のフィールドにインデックスを付けることはできますか?例えば、私はそれが可能になり、タイプPostgreSQL:複合型内のフィールドのインデックスを作成しますか?

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

を作成し、riの上で1つ上(特にハッシュ/ GIST/GIN)のインデックスを持ちたい、と仮定?

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

+1

インデックスの高度な使用方法は、[dba.SE](http://dba.stackexchange.com/)への移行候補になる可能性があります。 –

答えて

17

はい、絶対に可能性など、すべてのcomplex[1]の上に、すべてのcomplex[0]上のインデックスを持つことが可能であろう、私はcomplex[]を使うと仮定します。 index on an expressionを使用します。トリッキーな部分はsyntax for composite typesです。複合型の要素に

B-treeインデックス:EXPLAIN ANALYZE

CREATE TABLE tbl (tbl_id serial, co complex); 

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

SQL Fiddle
同じことがあっても、複合型の配列のために、配列の要素のために働く:

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

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

注発現が多かれ少なかれ文字通り一致した場合表現インデックスのみを照会するために使用することができます。

しかし、これはあなたが言及したようにGINインデックスでは意味をなさない。 Per documentation

GINは一般化反転インデックスの略です。 GINは、インデックス化されるアイテムがコンポジット値である の取り扱いのために設計されており、インデックスによって処理されるクエリは の複合アイテム内の値を検索する必要があります。

GINインデックスを使用すると、内の要素を検索できるように、全体として複合型の配列に意味をなさないと思います。しかし、特定のタイプの実装が必要です。 list of examples in standard Postgresがあります(すべての1次元配列の基本サポートに加えて)。

+0

あなたの非常に詳細で良い答えをありがとう! _GIN_に関するヒントもありがとうございます、あなたは完全にそこにいます! – navige

関連する問題