Linguagens procedurais do PostgreSQL - diferenças entre PL / pgSQL e SQL

20

Alguém pode resumir as diferenças entre:

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

e

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

?

Pontos principais:

  • diferenças conceituais
  • dada uma família problemática, conveniência de uso
  • questões políticas
Gismo Ranas
fonte
11
Primeiramente, as funções SQL (também conhecidas como linguagem de consulta) não envolvem nenhuma das linguagens processuais do PostgreSQL. Em segundo lugar, você já encontrou a melhor fonte onde se pode encontrar as respostas para suas perguntas (com exceção da última -? O que exatamente youmean por 'questões políticas')
Dezso
Pedi para resumir todos os principais problemas, não necessariamente usando a documentação que colei, mas também usando impressões pessoais. Esses links existem apenas para garantir que todos entendam do que se trata a questão.
Gismo Ranas
Não tome isso como um ataque, mas uma vez que você os tenha lido, você pode resumir você mesmo :) Caso contrário, sua pergunta é um pouco ampla, mas, com um pouco de tempo, tentarei reunir alguns pensamentos.
Dezso
11
Não negligencie as outras linguagens processuais. Em particular, o PL / Perl é extremamente útil para áreas onde o PL / PgSQL é muito limitado; O PL / Pythonu faz o trabalho se você preferir o Python, mas não oferece um modelo de segurança como o PL / Perl. Há também o PL / V8 (JavaScript) como complemento.
Craig campainha
11
Olá cataldo - Gostaria de recebê-lo no site, pois esta é sua primeira pergunta aqui. Obrigado por postar e espero que você fique por aqui.
Jack Douglas

Respostas:

27

As funções PL / PgSQL e SQL simples fazem parte de um conjunto de ferramentas maior e devem ser visualizadas nesse contexto. Costumo pensar nisso em termos de uma escala crescente de poder combinada com complexidade e custo crescentes, onde você deve usar a ferramenta mais simples que fará o trabalho bem:

  • Use visualizações sempre que possível
  • Onde uma visualização não é adequada, use uma função SQL
  • Onde uma função SQL não é adequada, use PL / PgSQL.
  • Onde o PL / PgSQL for muito limitado ou pouco expressivo, use PL / Perl, PL / Python, PL / V8, PL / Java ou qualquer que seja sua preferência
  • ... e onde nenhum PL fará o trabalho, use um programa externo e, possivelmente, LISTENe NOTIFYconverse com ele.

Com muita frequência, uma visualização é suficiente quando você acha que uma função é necessária. Mesmo que seja extremamente caro para SELECTtoda a exibição, as WHEREcláusulas na consulta que faz referência à exibição geralmente são inseridas na exibição e podem resultar em planos de consulta muito diferentes. Muitas vezes, tive grandes melhorias de desempenho ao converter funções SQL em visualizações.

O horário principal em que você descobre que não pode usar uma visualização e deve considerar uma função SQL é quando:

  • Parâmetros que não podem ser expressos como WHEREcláusulas simples são necessários, como um parâmetro dentro de uma WITHexpressão
  • Você deseja uma barreira de segurança por meio de uma SECURITY DEFINERfunção, e as security_barriervisualizações no PostgreSQL 9.2 e superior não são suficientes para suas necessidades;
  • Você precisa de parâmetros que não sejam incluídos em sub-cláusulas de uma exibição pelo otimizador e deseja controlá-la mais diretamente; ou
  • Existem muitos parâmetros ou muitas repetições, portanto, é impraticável escrever a consulta como uma visualização.

Para a maioria dessas tarefas, uma função SQL simples funciona bem e geralmente é mais fácil de ler do que PL / PgSQL. As funções SQL declaradas STABLEou IMMUTABLE(e também não declaradas STRICTou SECURITY DEFINER) também podem ser incorporadas na instrução de chamada. Isso elimina a sobrecarga da chamada de função e às vezes também pode resultar em enormes benefícios de desempenho quando uma condição WHERE na função de chamada é empurrada para baixo na função SQL pelo otimizador. Use funções SQL sempre que forem suficientes para a tarefa.

O principal momento em que as funções SQL não funcionam é quando você precisa de muita lógica. Se / then / else operações que você não pode expressar como CASEinstruções, muita reutilização de resultados calculados, criação de valores a partir de partes, manipulação de erros, etc. O PL / PgSQL é útil então. Escolha PL / PgSQL quando não puder usar funções SQL ou elas não são adequadas, como para:

  • SQL dinâmico e DDL dinâmico por meio da EXECUTEinstrução
  • Quando você deseja RAISEerros / avisos para os logs ou clientes
  • Quando você precisa de tratamento de exceções - pode interceptar e manipular erros com EXCEPTIONblocos, em vez de a transação inteira terminar com erro
  • Lógica condicional complexa que não se encaixa CASE ... WHENmuito bem
  • Muita reutilização de valores calculados que você não pode ajustar WITHe CTEs
  • Construindo registros dinâmicos
  • Você precisa executar uma ação após produzir o conjunto de resultados

Com expressões comuns de tabela (CTEs), especialmente CTEs graváveis, WITH RECURSIVEacho que uso o PL / PgSQL muito menos do que costumava, porque o SQL é muito mais expressivo e poderoso. Eu uso modos de exibição e funções simples do SQL muito mais agora. Vale lembrar que funções simples do SQL podem conter mais de uma instrução; a última instrução é o resultado da função.

Craig Ringer
fonte
Muito bem dito! (um adicional se bem que virtual de um para mencionar CTE graváveis)
Dezso
Essas respostas também explicam por que algumas funções precisam de otimização .
Eonil
8

plpgsqlé uma linguagem processual completa, com variáveis, construções em loop, etc. Uma SQLfunção é simplesmente uma subconsulta. Uma função SQL, se declarada STABLEou IMMUTABLEnão, também STRICTpode ser incorporada na consulta de chamada, como se estivesse gravada em cada referência.

kgrittn
fonte