1

Y a-t-il une différence? Je sais que les requêtes SQL ont leurs plans d'exécution mis en cache tout aussi bien que les fonctions.Performances PostgreSQL des fonctions SQL vs ad-hoc

Je Foud someone telling:

Performance est un problème, et nous soupçonnons la planification de la requête pourrait être une cause sous-jacente . J'ai réécrit les scripts de SQL ad-hoc à une fonction Postgres (CREATE FUNCTION) et nous avons vu la charge du serveur descendre un peu .

Mais pourquoi?

Répondre

1

Le plan de requête pour les requêtes ad-hoc est et non mis en cache, uniquement pour prepared statements. Et les fonctions PL/pgSQL gèrent toutes les instructions SQL comme des instructions préparées en interne. (À l'exception notable de SQL dynamique avec EXECUTE.) Chacun pour la portée de la session en cours, pas au-delà. Par conséquent, les fonctions PL/pgSQL (et non les fonctions SQL!) Peuvent faciliter l'exécution répétée de requêtes sophistiquées au sein d'une même session. Tout comme les déclarations préparées.

Le logiciel client utilise peut-être des instructions préparées par défaut. Ou le "extended query" protocol, dans le même effet.

connexes:

La réponse connexe qui a commencé the thread on pgsql-general vous faites référence:

également co Voir le chapitre Plan Caching pour PL/pgSQL dans le manuel.

+0

on m'a dit que les requêtes obtenir leur plan d'exécution mises en cache [ici] (https://stackoverflow.com/questions/46677509/postgresql-function-execution-plan-cache-principle/46678190?noredirect=1#comment80305222_46678190) –

+0

@YevgeniyAfanasyev: C'est un malentendu. Le plan de requête pour les instructions SQL ad-hoc n'est pas mis en cache. Seulement pour les déclarations préparées. –

+0

Droite. Je supposais que vous utilisiez des instructions préparées, car si vous réfléchissiez aux détails de la mise en cache des plans dans les fonctions, vous auriez déjà fait cela comme première étape pour réduire les coûts de planification. En outre, si la fonction appelée est une fonction SQL inlineable, elle peut être mise en cache indirectement lors de l'appel de fonctions plpgsql. –