PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi PostgreSQL traite-t-il ma requête différemment dans une fonction ?

Mise à jour dans PostgreSQL 9.2

Il y a eu une amélioration majeure, je cite les notes de version ici :

Réponse originale pour PostgreSQL 9.1 ou version antérieure

Une fonction plpgsql a un effet similaire à PREPARE déclaration :les requêtes sont analysées et le plan de requête est mis en cache.

L'avantage est qu'une certaine surcharge est économisée pour chaque appel.
L'inconvénient est que le plan de requête n'est pas optimisé pour les valeurs de paramètre particulières avec lesquelles il est appelé.

Pour les requêtes sur des tables avec une distribution de données uniforme, cela ne posera généralement aucun problème et les fonctions PL/pgSQL fonctionneront un peu plus rapidement que les requêtes SQL brutes ou les fonctions SQL. Mais si votre requête peut utiliser certains index en fonction des valeurs réelles dans le WHERE clause ou, plus généralement, choisi un meilleur plan de requête pour les valeurs particulières, vous pouvez vous retrouver avec un plan de requête sous-optimal. Essayez une fonction SQL ou utilisez SQL dynamique avec EXECUTE pour forcer la requête à être replanifiée pour chaque appel. Pourrait ressembler à ceci :

CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN        
    RETURN QUERY EXECUTE
        'SELECT *
         FROM   table_name
         where  id = $1'
    USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;

Modifier après commentaire :

Si cette variante ne change pas le temps d'exécution, il doit y avoir d'autres facteurs en jeu que vous avez peut-être manqués ou que vous n'avez pas mentionnés. Base de données différente ? Différentes valeurs de paramètre ? Vous auriez à poster plus de détails.

J'ajoute une citation du manuel pour sauvegarder mes déclarations ci-dessus :