Postgres può utilizzare colonne non iniziali in un indice b-tree, ma in una modalità molto meno efficiente.
Se la prima colonna è molto selettiva (solo poche righe per A
) allora difficilmente noterai una differenza di prestazioni poiché entrambi i metodi di accesso (anche una scansione sequenziale sul set ridotto) sono economici. L'aumento delle prestazioni aumenta con il numero di righe per A
.
Per il caso che descrivi ti consiglio di creare l'indice su (A, C, B)
o (C, A, B)
(assicurati solo che B
viene per ultimo) per ottimizzare le prestazioni. In questo modo ottieni le migliori prestazioni per le query su (A, B, C)
e su (A, C)
allo stesso modo.
A differenza della sequenza di colonne nell'indice, la sequenza di predicati nella query non ha importanza.
Ne abbiamo discusso in dettaglio su dba.SE:
Tieni presente che non importa se guidi con A, C
o C, A
per il caso in questione:
Ci sono anche altre considerazioni, ma la tua domanda non ha tutti i dettagli rilevanti.