J'ai le tableau suivant:Postgres - Est-ce la bonne façon de créer un index partiel sur une colonne booléenne?
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
La plupart de chaque ligne sera mis à FALSE
à moins que quelqu'un arrive avec une nouvelle alimentation sans gluten fou qui balaie le pays.
Je dois pouvoir interroger très rapidement les lignes où cette valeur est vraie. J'ai créé l'index:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
Il semble fonctionner, mais je ne peux pas comprendre comment dire si en effet il est que les lignes indexation où la valeur est vrai. Je veux m'assurer que ce n'est pas quelque chose de stupide comme indexer des lignes avec n'importe quelle valeur.
Dois-je ajouter un opérateur à la clause WHERE
ou cette syntaxe est-elle parfaitement valide? J'espère que ce n'est pas l'une de ces questions RTFM super facile qui sera downviewée 30 fois.
MISE À JOUR:
Je suis allé de l'avant et ajouté 10.000 lignes à RecipeMetadata avec des valeurs aléatoires. J'ai ensuite fait un ANALYZE sur la table et un REINDEX juste pour être sûr. Quand je lance la requête:
select recipeid from RecipeMetadata where diet_glutenfree;
Je reçois:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'
Ainsi, il semble faire une analyse séquentielle sur la table, même si seulement la moitié des lignes ont ce drapeau. L'index est ignoré.
Si je fais:
select recipeid from RecipeMetadata where not diet_glutenfree;
je reçois:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'
Donc, peu importe quoi, cet indice n'est pas utilisé.
Veuillez ajouter un lien vers votre message de la liste de diffusion PostgreSQL à partir des archives pour que les utilisateurs puissent relier cette discussion à celle-ci. Ce serait bien si vous postez un suivi à votre message de la liste de diffusion avec un lien vers ceci, aussi. Si vous devez effectuer des post-croquis à plusieurs endroits, veuillez le dire pour éviter que les gens ne se répètent. –
Pas de problème, je vais le faire à l'avenir (je ne poste généralement pas dans les deux endroits) .. –
BTW, je pense que la réponse à votre question est "Oui" ... mais si vous êtes concerné , remplissez une table avec des données factices, 'ANALYZE' la table, puis utilisez' EXPLAIN ANALYZE' pour examiner les plans de certaines requêtes qui devraient toucher l'index partiel. –