Jeg har bekræftet, at indekset fungerer som forventet.
Jeg genskabte de tilfældige data, men denne gang indstillede jeg diet_glutenfree
til random() > 0.9
så der er kun 10 % chance for en on
lidt.
Jeg genoprettede derefter indekserne og prøvede forespørgslen igen.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Returnerer:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
Og:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Returnerer:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Det ser ud til, at mit første forsøg var forurenet, da PG vurderer, at det er hurtigere at scanne hele tabellen i stedet for at ramme indekset, hvis den alligevel skal indlæse over halvdelen af rækkerne.
Jeg tror dog, at jeg ville få disse nøjagtige resultater på et fuldt indeks af kolonnen. Er der en måde at verificere antallet af rækker, der er indekseret i et delvist indeks?
OPDATERING
Indekset er omkring 40k. Jeg oprettede et fuldt indeks over den samme kolonne, og det er over 200.000, så det ser ud til, at det helt sikkert er delvist.