|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Bonjour,
Je teste une procédure écrite en pl/pgsql, et c'est vraiment très lent alors qu'à priori il y a des index qui devraient permettre des requêtes assez rapides. J'ai exécuté quelques SELECT, présents dans la procédure, directement sous psql et ils sont très rapides. Est-ce qu'il y a un moyen d'avoir des détails sur la manière dont les requêtes sont exécutées dans la procédure. J'ai lu qu'on ne pouvait pas utiliser explain sur une fonction. Et je ne vois pas de moyen d'aller "voir sous le capot". J'utilise des FOR .. IN SELECT .. et des SELECT INTO .. n'ayant que très peu de résultats, par contre le nombre total de lignes de mes tables est énorme. Merci d'avance, je ne vois pas du tout où chercher. |
|
00
|
|
|
#2 | ||
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
En plpgsql, les requêtes sont préparées, donc pour voir leur plan d'exécution de l'extérieur, il faut procéder en deux temps, par exemple:
Code :
|
||
|
|
10
|
|
|
#3 | |||
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
A vrai dire je débute et je n'ai pas lu PREPARE dans la doc ou les exemples, j'appelle directement les requêtes comme ceci (c'est un extrait seulement):
Code sql :
Et en cherchant comment utiliser le PREPARE je suis tombé sur ce message : Citation:
|
|||
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Je me suis peut-être mal exprimé.
Je ne suggère pas d'ajouter des PREPARE à l'intérieur de plpgsql, car justement l'interpréteur du langage le fait tout seul, donc ça ne servirait à rien. Ce que je voulais dire, c'est que pour voir de l'extérieur de plgpsql le plan d'exécution tel que va l'exécuter l'interpréteur plpgsql, il faut utiliser PREPARE. |
|
|
00
|
|
|
#5 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Autant pour moi j'avais compris de travers ! Merci pour cette indication, j'ai pu voir ce que donne mes SELECT, par contre à propos des boucles FOR .. IN SELECT, Est-ce que le SELECT utilisé peut être analysé de la même manière qu'un SELECT normal ? (en fait, est-ce que le plan prévu pour la requête sera le même qu'avec la boucle utilisant cette requête)
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Essayez de travailler en ensembliste au maximum. Faire X boucles sur X requêtes dans une procédure stockée est contre performant, en plus d'être moins lisible.
Normalement vous pouvez faire un simple : Code :
|
||
|
|
00
|
|
|
#7 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
En effet je n'avais pas pensé comme ça, je n'ai pas la logique ensembliste, merci pour la remarque
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Vérifiez quand même que la nouvelle forme que je propose donne le bon résultat, j'ai fait ça vite
.Pour info, si vous ne connaissez pas déjà, cette requête utilise une sous requête corrélée qui remplace avantageusement des boucles imbriquees. |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com