J'ai confirmé que l'index fonctionne comme prévu.
J'ai recréé les données aléatoires, mais cette fois, définissez diet_glutenfree
à random() > 0.9
il n'y a donc que 10 % de chances d'avoir un on
peu.
J'ai ensuite recréé les index et réessayé la requête.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Renvoie :
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
Et :
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Renvoie :
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Il semble que ma première tentative ait été polluée puisque PG estime qu'il est plus rapide d'analyser toute la table plutôt que d'atteindre l'index s'il doit de toute façon charger plus de la moitié des lignes.
Cependant, je pense que j'obtiendrais ces résultats exacts sur un index complet de la colonne. Existe-t-il un moyen de vérifier le nombre de lignes indexées dans un index partiel ?
MISE À JOUR
L'indice est d'environ 40k. J'ai créé un index complet de la même colonne et il dépasse 200 000, il semble donc qu'il soit définitivement partiel.