Certamente è. Ne abbiamo discusso in dettaglio sotto questa domanda correlata:
Lo spazio è allocato in multipli di MAXALIGN
, che in genere è 8 byte su un sistema operativo a 64 bit o (molto meno comune) 4 byte su un sistema operativo a 32 bit. Se non sei sicuro, controlla pg_controldata
. Dipende anche dai tipi di dati delle colonne indicizzate (alcune richiedono il riempimento di allineamento) e dal contenuto effettivo.
Un indice su, diciamo, due integer
colonne (4 byte ciascuno) in genere finisce per essere esattamente grande come un indice su uno solo, dove altri 4 byte vengono persi per il riempimento di allineamento.
In tal caso, non esiste davvero un aspetto negativo per il pianificatore di query in cui utilizzare un indice (a,b)
, rispetto a un indice solo (a)
. Ed è generalmente preferibile che più query utilizzino lo stesso indice. La possibilità che risieda (o parti di essa) nella cache (veloce) aumenta quando viene condivisa.
Se hai già un indice attivo (a,b)
, non ha senso creare un altro indice solo (a)
se non è sostanzialmente più piccolo. Lo stesso non vale per (b,a)
contro (a)
. Segui il link nella prima riga per ulteriori informazioni al riguardo.
Provenendo dalla direzione opposta, quando hai bisogno di un indice aggiuntivo come quello su (a,b)
, quindi considera di far cadere un indice esistente solo (a)
- se possibile. Spesso non è possibile in quanto è l'indice di un PK o UNIQUE
vincolo. Da Postgres 11 potresti invece semplicemente accodare b
la definizione del vincolo con la INCLUDE
clausola. Dettagli nel manuale.
Oppure crea il nuovo indice su (b,a)
invece di coprire le query solo in b
aggiunta. Per le sole condizioni di uguaglianza, l'ordine delle espressioni dell'indice negli indici btree non ha importanza. Lo fa, tuttavia, quando coinvolge condizioni di portata. Vedere:
Ci sono potenziali svantaggi nell'includere colonne aggiuntive in un indice, anche se questo utilizza solo spazio altrimenti perso per il riempimento di allineamento:
- Ogni volta che la colonna aggiuntiva viene aggiornata, anche l'indice ha bisogno di un aggiornamento, il che potrebbe aggiungere costi per le operazioni di scrittura e creare un maggiore gonfiamento dell'indice.
- Gli aggiornamenti HOT (Heap Only Tuple) sulla tabella non sono possibili mentre è coinvolta qualsiasi colonna di indice.
Altre informazioni sugli aggiornamenti HOT:
Come misurare le dimensioni degli oggetti: