Un index partiel est une bonne idée pour exclure la moitié des lignes du tableau dont vous n'avez évidemment pas besoin. Plus simple :
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;
Assurez-vous d'exécuter la ANALYZE table
après la création de l'index. (Autovacuum le fait automatiquement après un certain temps si vous ne le faites pas manuellement, mais si vous testez juste après la création, votre test échouera.)
Ensuite, pour convaincre le planificateur de requêtes qu'un index partiel particulier peut être utilisé, répétez le WHERE
condition dans la requête - même si elle semble complètement redondante :
SELECT col1,col2, .. colN
FROM table
WHERE text_col = 'my_value'
AND text_col IS NOT NULL; -- repeat condition
Voilà.
Par documentation :
Cependant, gardez à l'esprit que le prédicat doit correspondre aux conditions utilisées dans les requêtes censées bénéficier de l'index. Pour être précis, un index partiel ne peut être utilisé dans une requête que si le système peut reconnaître que le
WHERE
la condition de la requête implique mathématiquement le prédicat de l'index. PostgreSQL ne dispose pas d'un démonstrateur de théorème sophistiqué capable de reconnaître des expressions mathématiquement équivalentes écrites sous différentes formes. (Non seulement un tel démonstrateur de théorème général est extrêmement difficile à créer, mais il serait probablement trop lent pour être réellement utile.) Le système peut reconnaître de simples implications d'inégalité, par exemple "x <1" implique "x <2" ; la condition doit correspondre exactement à une partie duWHERE
de la requête condition ou l'index ne sera pas reconnu comme utilisable. La correspondance a lieu au moment de la planification de la requête, pas au moment de l'exécution. Par conséquent, les clauses de requête paramétrées ne fonctionnent pas avec un index partiel.
Comme pour les requêtes paramétrées :encore une fois, ajoutez le prédicat (redondant) de l'index partiel en tant que WHERE
constant supplémentaire état, et ça marche très bien.
Une mise à jour importante dans Postgres 9.6 améliore largement les chances d'analyses d'index uniquement (ce qui peut rendre les requêtes moins chères et le planificateur de requêtes choisira plus facilement de tels plans de requête). Connexe :
- PostgreSQL n'utilise pas l'index pendant le comptage(*)