Quelqu'un peut-il résumer les différences entre:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
et
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
Points principaux:
- différences de conception
- étant donné une famille problématique, commodité d'utilisation
- problèmes politiques
postgresql
stored-procedures
plpgsql
Gismo Ranas
la source
la source
Réponses:
Les fonctions PL / PgSQL et plain SQL font toutes deux partie d'un ensemble d'outils plus large et doivent être considérées dans ce contexte. J'ai tendance à y penser en termes d'échelle de puissance ascendante assortie d'une complexité et d'un coût croissants, où vous devriez utiliser l'outil le plus simple qui fera bien le travail:
LISTEN
etNOTIFY
pour lui parler.Très souvent, une vue est suffisante lorsque vous pensez qu'une fonction est nécessaire. Même si cela coûte extrêmement cher à
SELECT
la vue entière, lesWHERE
clauses de la requête faisant référence à la vue sont généralement poussées vers le bas dans la vue et peuvent entraîner des plans de requête très différents. J'ai souvent eu de grandes améliorations des performances de la conversion des fonctions SQL en vues.La principale fois où vous constatez que vous ne pouvez pas utiliser une vue et que vous devez envisager une fonction SQL est lorsque:
WHERE
clauses sont nécessaires, comme un paramètre dans uneWITH
expressionSECURITY DEFINER
fonction, et lessecurity_barrier
vues dans PostgreSQL 9.2 et supérieur ne sont pas suffisantes pour vos besoins;Pour la plupart de ces tâches, une simple fonction SQL fonctionne correctement et est souvent plus facile à lire que PL / PgSQL. Les fonctions SQL déclarées
STABLE
ouIMMUTABLE
(et non également déclaréesSTRICT
ouSECURITY DEFINER
) peuvent également être insérées dans l'instruction appelante. Cela supprime la surcharge des appels de fonction et peut parfois entraîner d'énormes avantages en termes de performances lorsqu'une condition WHERE dans la fonction appelante est poussée dans la fonction SQL par l'optimiseur. Utilisez les fonctions SQL chaque fois qu'elles sont suffisantes pour la tâche.La principale fois où les fonctions SQL ne feront pas le travail, c'est quand vous avez besoin de beaucoup de logique. Si / alors / sinon les opérations que vous ne pouvez pas exprimer sous forme d'
CASE
instructions, beaucoup de réutilisation des résultats calculés, la création de valeurs à partir de morceaux, la gestion des erreurs, etc. PL / PgSQL est alors très pratique. Choisissez PL / PgSQL lorsque vous ne pouvez pas utiliser les fonctions SQL ou qu'elles ne conviennent pas, comme pour:EXECUTE
instructionRAISE
erreurs / avertissements pour les journaux ou le clientEXCEPTION
blocs au lieu de terminer la transaction en cas d'erreurCASE ... WHEN
très bienWITH
et CTEAvec les expressions de table communes (CTE), en particulier les CTE inscriptibles et
WITH RECURSIVE
je trouve que j'utilise PL / PgSQL beaucoup moins qu'auparavant parce que SQL est beaucoup plus expressif et puissant. J'utilise beaucoup plus les vues et les fonctions SQL simples. Il convient de se rappeler que les fonctions SQL simples peuvent contenir plusieurs instructions; la dernière instruction est le résultat de la fonction.la source
plpgsql
est un langage procédural à part entière, avec des variables, des constructions en boucle, etc. UneSQL
fonction est simplement une sous-requête. Une fonction SQL, si elle est déclaréeSTABLE
ouIMMUTABLE
nonSTRICT
, peut également être insérée dans la requête appelante, comme si elle était écrite sur chaque référence.la source