Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Indici multicolonna
PrecedenteTipi di indiceIndici e ORDER BYSuccessivo

11.3. Indici multicolonna

Un indice può essere definito su più di una colonna di una tabella. Per esempio, avendo una tabella di questo tipo:

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);

(Supponendo di avere la propria directory /dev in un database....) ed effettuando frequentemente query del tipo:

SELECT name FROM test2 WHERE major = constant AND minor = constant;

then it might be appropriate to define an index on the columns major and minor together, e.g.:

CREATE INDEX test2_mm_idx ON test2 (major, minor);

Attualmente, solo gli indici di tipo B-tree e gist supportano gli indici multicolonna. Possono essere specificate fino a 32 colonne. (Questo limite può essere modificato quando si configura PostgreSQL™; Consultare il file pg_config_manual.h.)

Un indice B-tree multicolonna può essere usato con query che coinvolgono qualsiasi sottoinsieme delle colonne dell'indice, ma l'indice è molto più efficiente quando ci sono vincoli sulle colonne in testa (all'estrema sinistra). La regola esatta è che vincoli di uguaglianza sulle colonne in testa, più tutti i vincoli di diseguaglianza sulla prima colonna che non ha un vincolo di uguaglianza, saranno usati per limitare la porzione dell'indice che viene scandita. I vincoli sulle colonne alla destra di queste colonne sono controllati nell'indice, per cui essi risparmiano consultazioni alla propria tabella, ma non riducono la porzione dell'indice che deve essere scandita. Per esempio, dato un indice su (a, b, c) e una condizione della query WHERE a = 5 AND b >= 42 AND c < 77, l'indice dovrebbe essere scandito dalla prima voce con a = 5 e b = 42 e superiori fino all'ultima voce con a = 5. Le voci dell'indice con c >= 77 verrebbero saltate, ma dovranno tuttavia essere scandite. Questo indice potrebbe in linea di principio essere usato per query che hanno vincoli su b e/o c e senza nessun vincolo su a -- ma l'intero indice dovrà essere scandito, per cui nella maggior parte dei casi il planner preferirebbe una scansione sequenziale della tabella all'utilizzo dell'indice.

Un indice gist multicolonna può essere usato con query che coinvolgono qualunque sottoinsieme delle colonne dell'indice. Condizioni su colonne supplementari restringono le voci restituite dall'indice, ma la condizione sulla prima colonna è quella più importante per determinare quanta parte dell'indice deve essere scandita. Un indice gist sarà relativamente inefficace se la sua prima colonna ha solo alcuni valori distinti, anche se ci sono molti valori distinti nelle colonne supplementari.

Un indice gin multicolonna può essere usato con query che coinvolgono qualsiasi sottoinsieme di colonne di indice. A differenza dei B-Tree o dei gist, l'efficienza dell'indice di ricerca è la stessa qualunque colonna/e indice venga usata dalla query.

Naturalmente, ogni colonna dovrà essere usata con operatori appropriati al tipo di indice; Clausule che coinvolgono altri operatori non dovranno essere considerate.

Gli indici multicolonna dovranno essere usati con parsimonia. Nella maggiorf parte delle situazioni, un indice su una singola colonna è sufficiente e salva spazio e tempo. Gli indici con più di tre colonne è improbabile che vengano usati a meno che l'utilizzo della tabella non sia estremamente stilizzato. Consultare anche Sezione 11.5, «Combinare indici multipli» per ulteriori discussioni in merito alle diverse impostazioni degli indici.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Indici multicolonna
PrecedenteTipi di indiceIndici e ORDER BYSuccessivo