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?
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
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. –
Merci pour vos réponses bien expliquées! Très utile. – Zeruno