Indice Parziale
Partial Index
Un indice parziale (partial index) è un indice PostgreSQL che copre solo un sottoinsieme delle righe della tabella, definito con una clausola WHERE nella CREATE INDEX. Le righe che non soddisfano la condizione non vengono indicizzate e non occupano spazio nell’indice.
Come funziona #
La sintassi è semplice:
CREATE INDEX idx_attivi
ON ordini (data_creazione)
WHERE stato = 'attivo';
L’indice contiene solo le righe con stato = 'attivo'. Tutte le altre vengono ignorate. Il planner usa questo indice solo per query che includono la stessa condizione WHERE stato = 'attivo' (o una condizione più restrittiva).
A cosa serve #
Risolve uno scenario comunissimo: la maggior parte delle query operative filtra sempre per una condizione (es. attivo = true, archiviato = false, data > x), e le righe che non soddisfano quella condizione non vengono mai cercate. Indicizzarle è uno spreco.
I benefici concreti:
- Spazio: l’indice è più piccolo, a volte molto. Su una tabella dove il 35% delle righe è “attivo”, l’indice parziale occupa il 35% dello spazio.
- Manutenzione: meno lavoro per il VACUUM, meno write-amplification su INSERT/UPDATE delle righe escluse.
- Performance: l’indice è più piccolo da scorrere e tende a stare più facilmente in cache.
Quando si usa #
Si usa quando:
- Le query operative filtrano sistematicamente per una condizione binaria
- Le righe che non soddisfano la condizione sono molte (>50%) e non rilevanti per il workload caldo
- Le query sull’altro sottoinsieme sono rare e vanno bene anche con un seq scan
Da non usare se le query filtrano per condizioni dinamiche o variabili: il planner non userà mai l’indice parziale.