Ho confermato che l'indice funziona come previsto.
Ho ricreato i dati casuali, solo che questa volta ho impostato diet_glutenfree
a random() > 0.9
quindi c'è solo il 10% di possibilità di un on
bit.
Ho quindi ricreato gli indici e riprovato la query.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Resi:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
E:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Resi:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Sembra che il mio primo tentativo sia stato inquinato poiché PG stima che sia più veloce scansionare l'intera tabella piuttosto che raggiungere l'indice se deve comunque caricare più della metà delle righe.
Tuttavia, penso che otterrei questi risultati esatti su un indice completo della colonna. C'è un modo per verificare il numero di righe indicizzate in un indice parziale?
AGGIORNAMENTO
L'indice è di circa 40k. Ho creato un indice completo della stessa colonna e supera i 200.000, quindi sembra decisamente parziale.