Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Combinare indici multipli
PrecedenteIndici e ORDER BYIndici uniqueSuccessivo

11.5. Combinare indici multipli

Una singola scansione di indice può usare solamente clausule di query che utilizzano le colonne dell'indice con operatori della sua classe di operatori e che sono unite con AND. Per esempio, dato un indice su (a, b) una condizione di query tipo WHERE a = 5 AND b = 6 potrebbe utilizzare l'indice, ma una query tipo WHERE a = 5 OR b = 6 non potrebbe utilizzare direttamente l'indice.

Forunatamente, PostgreSQL™ ha la capacità di combinare indici multipli (compresi usi multipli dello stesso indice) per gestire casi che non possono essere implementati con una singola scansione dell'indice. Il sistema può formare condizioni AND e OR tramite diverse scansioni dell'indice. Per esempio, una query tipo WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 può essere suddivisa in quattro separate scansioni di un indice su x, ogni scansione userà una delle quattro clausule. I risultati di queste scansioni vengono poi sottoposti ad OR per produrre il risultato. Un altro esempio è che, se si hanno indici separati su x e y, una possibile implementazione di una query tipo WHERE x = 5 AND y = 6 è di usare ogni indice con la appropriata clausula della query e quindi sottoporre a AND i due risultati di indice per identificare le righe risultanti.

Per combinare indici multipli, il sistema scansiona ogni indice necessario e pepara una mappa di bit in memoria con le locazioni delle righe della tabella che sono riportate come corrispondenti alle condizioni di quell'indice. Le mappe di bit sono quindi sottoposte a AND od OR come richiesto dalla query. Infine, le righe effettive della tabella sono visitate e restituite. Le righe della tabella sono visitate in ordine fisico, perchè così è descritta la mappa di bit; Questo significa che ogni ordinamento degli indici originali viene perso, e quindi un passo di ordinamento separato sarà necessario se la query ha una clausola ORDER BY. Per questa ragione, e siccome ogni scansione di indice addizionale aggiunge tempo extra, il planner a volte sceglierà di usare una scansione di indice semplice, sebbene indici addizionali siano disponibili e possono essere stati usati.

In tutte le applicazioni, ci sono diverse combinazioni di indici che possono essere utilizzate e lo sviluppatore del database deve accettare un compromesso per decidere quali indici utilizzare. A volte gli indici multicolonna sono i migliori, altre volte è meglio creare indici separati e contare sulla caratteristica di combinazione degli indici. Per esempio, se il proprio carico di lavoro comprende un insieme di query che qualche volta coinvolgono solo la colonna x, qualche volta solo la colonna y ed altre volte ambedue le colonne, si potrebbe scegliere di creare due indici separati su x e y, contando sulla combinazione di indici per trattare le query che utilizzano ambedue le colonne. Si potrebbe anche creare un indice multicolonna su (x, y). Questo indice sarebbe normalmente più efficace della combinazione di indici per le query che coinvolgono entrambe le colonne, ma come spiegato in Sezione 11.3, «Indici multicolonna», sarebbe quasi inutile per le query che coinvologono solo y, per cui non dovrebbe essere l'unico indice. Una combinazione di un indice multicolonna e di un indice separato su y funzionerebbe abbastanza bene. Per le query che coinvolgono solo x, si potrebbe anche usare l'indice multicolonna, nonstante sia più grande e quindi più lento di un indice sulla sola x. L'ultima alternativa è di creare tutti e tre gli indici, ma questo è probabilmente accettabile solo se la tabella viene cercata molto più spesso di quanto viene aggiornata e se tutti e tre i tipi di query sono comuni. Se uno dei tre tipi di query è molto meno comune degli altri, probabilmente basterà creare solo i due indici che meglio confronteranno i tipi comuni.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Indici > Combinare indici multipli
PrecedenteIndici e ORDER BYIndici uniqueSuccessivo