PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL n'utilise pas d'index partiel

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 du WHERE 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(*)