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

Comment comprendre une EXPLAIN ANALYZE

Bien qu'il ne soit pas aussi utile pour un plan simple comme celui-ci, http://explain.depesz.com est vraiment utile. Voir http://explain.depesz.com/s/t4fi. Notez l'onglet "Statistiques" et le menu déroulant "Options".

À noter à propos de ce forfait :

  • Le nombre de lignes estimé (183) est raisonnablement comparable au nombre de lignes réel (25). Ce n'est pas des centaines de fois plus, ni 1. Vous êtes plus intéressé par les ordres de grandeur en ce qui concerne les estimations du nombre de lignes, ou les problèmes "1 contre pas 1". (Vous n'avez même pas besoin d'une précision "assez proche pour le travail du gouvernement" - "assez proche pour la comptabilité des contrats militaires" fera l'affaire). L'estimation de la sélectivité et les statistiques semblent raisonnables.

  • Il utilise l'index partiel à deux colonnes fourni (index scan using index_cars_onsale_on_brand_and_model_name ), il correspond donc à la condition d'index partiel. Vous pouvez le voir dans le Filter: has_auto_gear . La condition de recherche d'index est également affichée.

  • Les performances de la requête semblent raisonnables étant donné que le nombre de lignes de la table signifie que l'index est assez volumineux, d'autant plus qu'il s'étend sur deux colonnes. Les lignes correspondantes seront dispersées, il est donc probable que chaque ligne nécessitera également une lecture de page distincte.

Je vois rien de mal ici. Cependant, cette requête bénéficiera probablement grandement des analyses d'index uniquement de PostgreSQL 9.2.

Il est possible qu'il y ait un gonflement de la table ici, mais étant donné l'index à 2 colonnes et le nombre de lignes, le temps de réponse n'est pas entièrement déraisonnable, en particulier pour une table avec 170 (!!) colonnes susceptibles de contenir relativement peu de tuples dans chacun page. Si vous pouvez vous permettre un temps d'arrêt, essayez VACUUM FULL pour réorganiser la table et reconstruire l'index. Cela verrouillera exclusivement la table pendant un certain temps pendant qu'elle la reconstruira. Si vous ne pouvez pas vous permettre le temps d'arrêt, consultez pg_reorg et/ou CREATE INDEX CONCURRENTLY et ALTER INDEX ... RENAME TO .

Vous pourriez trouver EXPLAIN (ANALYZE, BUFFERS, VERBOSE) plus informatif parfois, car il peut montrer les accès au tampon, etc.

Une option qui peut rendre cette requête plus rapide (bien qu'elle risque de ralentir quelque peu les autres requêtes) consiste à partitionner la table sur brand et activez constraint_exclusion . Voir partitionnement.