Linguaggi procedurali PostgreSQL - differenze tra PL / pgSQL e SQL


20

Qualcuno può riassumere le differenze tra:

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

e

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

Punti principali:

  • differenze concettuali
  • data una famiglia problematica, praticità d'uso
  • problemi politici

1
Innanzitutto, le funzioni SQL (alias. Query language) non coinvolgono nessuno dei linguaggi procedurali PostgreSQL. In secondo luogo, hai già trovato la migliore fonte in cui è possibile trovare le risposte alle tue domande (ad eccezione dell'ultima - che cosa esattamente si fa per "questioni politiche"?)
dezso

Ho chiesto di riassumere tutti i problemi principali, non necessariamente utilizzando la documentazione che ho incollato, ma anche usando le impressioni personali. Questi collegamenti sono lì solo per essere sicuri che tutti capiscano di cosa si tratta.
Gismo Ranas,

Non prenderlo come un assalto, ma una volta che hai letto quelli che puoi riassumere tu stesso :) Altrimenti, la tua domanda è un po 'ampia, ma dato un po' di tempo proverò a raccogliere alcuni pensieri.
dezso,

1
Non trascurare le altre lingue procedurali. In particolare PL / Perl è estremamente utile per le aree in cui PL / PgSQL è troppo limitato; PL / Pythonu fa il lavoro se preferisci Python ma non offre un modello di sicurezza come PL / Perl. C'è anche PL / V8 (JavaScript) come componente aggiuntivo.
Craig Ringer,

1
Ciao cataldo - Vorrei solo darti il ​​benvenuto sul sito in quanto questa è la tua prima domanda qui. Grazie per la pubblicazione e spero che rimani in giro.
Jack Douglas,

Risposte:


27

Le funzioni PL / PgSQL e SQL semplice fanno entrambe parte di un set di strumenti più ampio e devono essere visualizzate in tale contesto. Tendo a pensarci in termini di una scala crescente di potenza abbinata a complessità e costi crescenti, dove dovresti usare lo strumento più semplice che farà bene il lavoro:

  • Usa le viste ove possibile
  • Dove una vista non è adatta, utilizzare una funzione SQL
  • Dove una funzione SQL non è adatta, utilizzare PL / PgSQL.
  • Laddove PL / PgSQL è troppo limitato o non sufficientemente espressivo, utilizzare PL / Perl, PL / Python, PL / V8, PL / Java o qualunque sia la tua preferenza
  • ... e dove nessun PL farà il lavoro, usa un programma esterno e possibilmente LISTENe NOTIFYper parlarci.

Molto spesso una vista è sufficiente quando si ritiene che sia necessaria una funzione. Anche se è estremamente costoso per SELECTl'intera vista, le WHEREclausole nella query che fanno riferimento alla vista vengono generalmente trasferite nella vista e possono comportare piani di query molto diversi. Ho spesso avuto grandi miglioramenti delle prestazioni dalla conversione delle funzioni SQL in visualizzazioni.

Il momento principale in cui trovi che non puoi usare una vista e dovresti considerare una funzione SQL è quando:

  • Sono necessari parametri che non possono essere espressi come semplici WHEREclausole, come un parametro all'interno di WITHun'espressione
  • Volete una barriera di sicurezza tramite una SECURITY DEFINERfunzione e le security_barrierviste in PostgreSQL 9.2 e versioni successive non sono sufficienti per le vostre esigenze;
  • Sono necessari parametri che non vengono inseriti nelle sotto-clausole di una vista dall'ottimizzatore e che si desidera controllarlo più direttamente; o
  • Ci sono molti parametri o c'è molta ripetizione dei parametri, quindi non è pratico scrivere la query come vista.

Per la maggior parte di questi compiti, una semplice funzione SQL funziona bene ed è spesso più facile da leggere rispetto a PL / PgSQL. Le funzioni SQL dichiarate STABLEo IMMUTABLE(e non anche dichiarate STRICTo SECURITY DEFINER) possono anche essere incorporate nell'istruzione chiamante. Ciò elimina l'overhead della chiamata di funzione e talvolta può comportare enormi vantaggi in termini di prestazioni quando una condizione WHERE nella funzione di chiamata viene trasferita nella funzione SQL dall'ottimizzatore. Utilizzare le funzioni SQL ogni volta che sono sufficienti per l'attività.

Il momento principale in cui le funzioni SQL non eseguono il lavoro è quando è necessaria molta logica. Se / allora / else operazioni che non è possibile esprimere come CASEistruzioni, un sacco di riutilizzo dei risultati calcolati, creazione di valori da blocchi, gestione degli errori, ecc., PL / PgSQL risulta utile. Scegli PL / PgSQL quando non puoi utilizzare le funzioni SQL o sono inadatte, come per:

  • SQL dinamico e DDL dinamico tramite l' EXECUTEistruzione
  • Quando si desidera RAISEerrori / avvisi per i registri o il client
  • Quando è necessaria la gestione delle eccezioni, è possibile intercettare e gestire gli errori con i EXCEPTIONblocchi anziché interrompere l'intera transazione in caso di errore
  • Logica condizionale complessa che non si adatta CASE ... WHENmolto bene
  • Un sacco di riutilizzo di valori calcolati che non è possibile inserire WITHe CTE
  • Creazione di record dinamici
  • È necessario eseguire un'azione dopo aver prodotto il set di risultati

Con le espressioni di tabella comuni (CTE), in particolare i CTE scrivibili, WITH RECURSIVEtrovo che utilizzo PL / PgSQL molto meno di quanto non fossi prima perché SQL è molto più espressivo e potente. Uso molto di più viste e semplici funzioni SQL. Vale la pena ricordare che le semplici funzioni SQL possono contenere più di un'istruzione; l'ultima affermazione è il risultato della funzione.


Davvero ben detto! (un ulteriore +1 virtuale anche se menzionato CTE scrivibile)
dezso

Questa risposta spiega anche perché alcune funzioni necessitano di una recinzione di ottimizzazione .
Eonil,

8

plpgsqlè un linguaggio procedurale a tutti gli effetti, con variabili, costrutti ciclici, ecc. Una SQLfunzione è semplicemente una sottoquery. Una funzione SQL, se viene dichiarata STABLEo IMMUTABLEmeno STRICT, può essere spesso incorporata nella query chiamante, come se fosse scritta su ogni riferimento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.