2017-04-18 2 views
0

J'exécute des tests de benchmarks sur beaucoup de requêtes. J'ai un ensemble de requêtes et elles seront exécutées plusieurs fois après l'autre. Je sais que PostgreSQL met en cache des plans de requête, c'est donc important à prendre en compte, mais pour autant que je sache, cela n'arrive pas toujours.PostgreSQL approchant la mise en cache de plan sur des requêtes identiques?

J'ai donc deux approches. Je considère soit (a) forcer le plan de requête à être généré chaque fois que j'exécute une requête, soit (b) à 'réchauffer' un peu afin qu'un plan soit mis en cache et qu'il soit réutilisé à chaque fois. Comment puis-je effectuer l'une ou l'autre ou quelles précautions puis-je prendre pour que l'un ou l'autre se produise?

Ce serait génial si je pouvais surveiller les plans dans le cache mais je ne suis pas sûr que ce soit possible. MISE À JOUR: Mes requêtes sont des SELECT complexes pour récupérer des données, pas de DELETE/INSERT, etc. Est-ce que cela signifie que je ne devrais pas donner autant de respect au planificateur de requêtes dans les benchmarks?

Répondre

1

PostgreSQL met en cache uniquement les plans de requête si

  • vous utilisez des instructions préparées
  • l'instruction est exécutée dans une fonction PL/pgSQL

Donc, si vous voulez référence combien plus rapidement vos requêtes deviennent si vous évitez le surcoût de la planification, vous devez créer une instruction préparée et l'exécuter au moins six fois (car les cinq premières exécutions génèrent toujours un plan personnalisé). Si vos requêtes sont complexes, vous risquez même de perdre si vous mettez en cache des plans de requête, en particulier si l'exécution des requêtes est longue. Dans ce cas, il est généralement préférable de consacrer plus d'efforts à la planification de chaque requête. La plus grande victoire avec les instructions préparées est lorsque le temps d'exécution des requêtes est faible.

+0

Merci! Vous proposez l'analyse comparative sans frais généraux de planification à l'aide d'états préparés. Vous dites également que PostgreSQL met en cache des plans de requête via les fonctions PL/pgSQL. Cela implique que je peux m'attendre au même comportement: si j'utilise une procédure PL/pgSQL et que je l'exécute au moins 5 fois, le 6ème passage? – Zeruno

+0

Oui, vous l'avez bien compris - dans la plupart des cas. Parfois, PostgreSQL décidera que le plan générique n'est pas assez bon et continuera à générer des plans personnalisés. Pour tester, vous pouvez utiliser 'EXPLAIN EXECUTE prepared_statement' ou auto_explain pour les instructions à l'intérieur des fonctions. Si vous voyez "$ 1", un plan générique est utilisé. Les déclarations sans paramètres utiliseront bien entendu toujours le plan générique. –

+0

Merci pour vos réponses bien expliquées! Très utile. – Zeruno