2013-02-23 3 views
6

Ist es möglich, einen Index für ein bestimmtes Feld eines zusammengesetzten Typs zu haben? Nehmen wir zum Beispiel, ich habe eine ArtPostgreSQL: Erstellen Sie einen Index für Felder innerhalb eines zusammengesetzten Typs?

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

erstellen und möchte ein haben (vor allem Hash/GIST/GIN) Index über r und über i, das möglich wäre?

Ähnlich, ist es möglich, einen Index über das erste, das zweite, das dritte, ... Element eines Array-Feldes zu haben?

Angenommen ich complex[], wäre es möglich, einen Index über alle complex[0] zu haben, über alle complex[1] usw.

+1

Erweiterte Indexnutzung, möglicherweise ein Kandidat für die Migration zu [dba.SE] (http://dba.stackexchange.com/). –

Antwort

17

Ja, absolut möglich. Verwenden Sie eine index on an expression. Der knifflige Teil ist der syntax for composite types.

B-Baum-Index auf einem Element eines komplexen Typs:

CREATE TABLE tbl (tbl_id serial, co complex); 

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

SQL Fiddle mit EXPLAIN ANALYZE.
Die gleiche Sache funktioniert für Elemente eines Arrays, auch für eine Reihe von Verbundtyp:

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

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

Beachten Sie, dass der Ausdruck-Index nur für Abfragen verwendet werden kann, wenn der Ausdruck buchstäblich mehr oder weniger angepasst ist.

Aber das macht keinen Sinn mit einem GIN Index, wie Sie erwähnen. :

GIN steht für Generalized Inverted Index. GIN wurde für Fälle entwickelt, in denen die zu indizierenden Elemente zusammengesetzte Werte sind, und die vom Index zu bearbeitenden Abfragen müssen nach Element Werten suchen, die in den zusammengesetzten Elementen erscheinen.

Ein GIN Index würde Sinn auf eine Reihe von komplexen Typ als Ganzes, machen Sie innerhalb eines Elements suchen zu lassen. Aber Sie brauchen eine Implementierung für Ihren speziellen Typ. Hier ist eine list of examples in standard Postgres (zusätzlich zur Grundunterstützung für alle eindimensionalen Arrays).

+0

Danke für Ihre sehr detaillierte und gute Antwort! Danke auch für den Hinweis bezüglich _GIN_, du bist völlig richtig da! – navige

Verwandte Themen