2016-05-16 5 views
1

J'ai eu une énorme requête en cours d'exécution sur postgres et l'une des tables de jointure a toujours fait un balayage séquentiel. L'index sur la colonne existe et postgres ne l'a tout simplement pas utilisé. J'ai fait une analyse de vide, puis le plan de requête postgres change immédiatement pour faire un scan d'index. Ma question est quelle est la façon la plus efficace de faire une analyse de vide. Verrouille-t-il les tables? Si c'est le cas, comment analyser les tables de production en direct?Comment aspirer efficacement les tables dans Postgres

+0

'et l'un des les tables de jointure effectuaient toujours un balayage séquentiel. L'index sur la colonne existe et postgres ne l'a pas utilisé. »Ceci n'est pas lié à VACUUM. – wildplasser

+0

Peut-être que ce n'est pas lié. Mais le plan a changé après que j'ai analysé le vide. Serait plus utile si vous pourriez suggérer une réponse plus significative que de dire ce qu'elle n'a pas de rapport avec. – Ramanan

+0

Oui, VACUUM ANALYZE met à jour les statistiques, ce qui peut entraîner le choix d'un autre plan. Normalement, cela n'a d'importance que si la table a changé (par exemple en ajoutant un index, ou en important de nouvelles données dans une nouvelle table) (désolé: j'avais oublié la partie ANALYZE) – wildplasser

Répondre

1

Vous pouvez exécuter l'analyse uniquement, pas besoin d'exécuter le vide également. Sintax sera:

ANALYZE [ VERBOSE ] [ table_name [ (column_name [, ...]) ] ] 

Dans la documentation, il déclare:

ANALYZE requires only a read lock on the target table, so it can run in parallel with other activity on the table. 

Vous trouverez plus d'informations ici:

http://www.postgresql.org/docs/9.4/static/sql-analyze.html

https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT