PREPARE
PREPARE — prépare une instruction pour exécution
Synopsis
PREPARE nom [ (type_donnees [, ...] ) ] AS instruction
Description
PREPARE
crée une
instruction préparée. Une instruction préparée est un objet côté
serveur qui peut être utilisé pour optimiser les performances.
Quand l'instruction
PREPARE
est exécutée,
l'instruction spécifiée est analysée, réécrite et planifiée. Quand
une commande
EXECUTE
est lancée par la suite, l'instruction préparée a seulement besoin
d'être exécutée. Du coup, les étapes d'analyse, de réécriture et de
planification sont réalisées une seule fois, à la place de chaque
fois que l'instruction est exécutée.
Les instructions préparées peuvent prendre des paramètres : les
valeurs sont substituées dans l'instruction lorsqu'elle est
exécutée. Lors de la création de l'instruction préparée, faites
référence aux paramètres suivant leur position, $1, $2, etc. Une liste
correspondante des types de données des paramètres peut être
spécifiée si vous le souhaitez. Quand le type de donnée d'un
paramètre n'est pas indiqué ou est déclaré comme inconnu
(unknown), le type est inféré à partir du
contexte dans lequel le paramètre est utilisé (si possible). Lors
de l'exécution de l'instruction, indiquez les valeurs réelles de
ces paramètres dans l'instruction
EXECUTE
. Référez-vous à EXECUTE pour
plus d'informations à ce sujet.
Les instructions préparées sont seulement stockées pour la durée de
la session en cours. Lorsque la session se termine, l'instruction
préparée est oubliée et, du coup, elle doit être recréée avant
d'être utilisée de nouveau. Ceci signifie aussi qu'une seule
instruction préparée ne peut pas être utilisée par plusieurs
clients de bases de données simultanément ; néanmoins, chaque
client peut créer sa propre instruction préparée à utiliser.
L'instruction préparée peut être supprimés manuellement en
utilisant la commande DEALLOCATE.
Les instructions préparées sont principalement intéressantes quand
une seule session est utilisée pour exécuter un grand nombre
d'instructions similaires. La différence de performances est
particulièrement significative si les instructions sont complexes à
planifier ou à réécrire, par exemple, si la requête implique une
jointure de plusieurs tables ou requiert l'application de
différentes règles. Si l'instruction est relativement simple à
planifier ou à réécrire mais assez coûteuse à exécuter, l'avantage
de performance des instructions préparées est moins net.
Paramètres
-
nom
-
Un nom quelconque donné à cette instruction préparée
particulière. Il doit être unique dans une session et est
utilisé par la suite pour exécuter ou désallouer cette
instruction préparée.
-
type_donnees
-
Le type de données d'un paramètre de l'instruction préparée.
Si le type de données d'un paramètre particulier n'est pas
spécifié ou est spécifié comme étant inconnu (unknown), il sera inferré à partir du contexte
dans lequel le paramètre est utilisé. Pour référencer les
paramètres de l'instruction préparée, utilisez $1, $2, etc.
-
instruction
-
Toute instruction
SELECT
,
INSERT
,
UPDATE
,
DELETE
ou
VALUES
.
Notes
Dans certaines situations, le plan de requête produit par une
instruction préparée est inférieur au plan qui aurait été produit
si l'instruction avait été soumise et exécutée normalement. C'est
parce que, quand l'instruction est planifiée et que le
planificateur tente de déterminer le plan de requête optimal, les
valeurs réelles de tous les paramètres spécifiés dans l'instruction
ne sont pas disponibles. PostgreSQL™ récupère les statistiques de
la distribution des données dans la table et peut utiliser les
valeurs constantes dans une instruction pour deviner le résultat
probable de l'exécution de l'instruction. Comme cette donnée n'est
pas disponible lors de la planification d'instructions préparées
avec paramètres, le plan choisi pourrait ne pas être optimal. Pour
examiner le plan de requête que PostgreSQL™ a choisi pour une
instruction préparée, utilisez EXPLAIN.
Pour plus d'informations sur la planification de la requête et les
statistiques récupérées par PostgreSQL™ dans ce but, voir la
documentation de ANALYZE.
Vous pouvez voir toutes les instructions préparées disponibles
d'une session en exécutant une requête sur la vue système
pg_prepared_statements
.
Exemples
Crée une instruction préparée pour une instruction
INSERT
, puis l'exécute :
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Crée une instruction préparée pour une instruction
SELECT
, puis l'exécute :
PREPARE usrrptplan (int) AS
SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
AND l.date = $2;
EXECUTE usrrptplan(1, current_date);
Note that the data type of the second parameter is not specified,
so it is inferred from the context in which $2 is used.
Compatibilité
Le standard SQL inclut une instruction
PREPARE
mais il est seulement
utilisé en SQL embarqué. Cette version de l'instruction
PREPARE
utilise aussi
une syntaxe quelque peu différente.