PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Diferença entre linguagem sql e linguagem plpgsql em funções do PostgreSQL

Funções SQL


... são a melhor escolha:

  • Para consultas escalares simples . Não há muito o que planejar, melhor economizar qualquer sobrecarga.

  • Para chamadas únicas (ou muito poucas) por sessão . Nada a ganhar com o cache do plano por meio de instruções preparadas que o PL/pgSQL tem a oferecer. Ver abaixo.

  • Se eles são normalmente chamados no contexto de consultas maiores e são simples o suficiente para serem inline .

  • Por falta de experiência com qualquer linguagem procedural como PL/pgSQL. Muitos conhecem bem o SQL e isso é tudo o que você precisa para funções SQL. Poucos podem dizer o mesmo sobre PL/pgSQL. (Embora seja bastante simples.)

  • Um código um pouco mais curto. Sem sobrecarga de bloco.

Funções PL/pgSQL


... são a melhor escolha:

  • Quando você precisar de elementos de procedimento ou variáveis que não estão disponíveis em funções SQL, obviamente.

  • Para qualquer tipo de SQL dinâmico , onde você cria e EXECUTE declarações dinamicamente. Cuidados especiais são necessários para evitar injeção de SQL. Mais detalhes:
    • Funções do Postgres x consultas preparadas

  • Quando você tem computadores que pode ser reutilizado em vários lugares e um CTE não pode ser esticado para o efeito. Em uma função SQL você não tem variáveis ​​e seria forçado a computar repetidamente ou escrever em uma tabela. Esta resposta relacionada no dba.SE tem exemplos de código lado a lado para resolver o mesmo problema usando uma função SQL / uma função plpgsql / uma consulta com CTEs:
    • Como passar um parâmetro para uma função

As atribuições são um pouco mais caras do que em outras linguagens procedurais. Adapte um estilo de programação que não use mais atribuições do que o necessário.

  • Quando uma função não pode ser embutida e é chamada repetidamente. Ao contrário das funções SQL, os planos de consulta podem ser armazenados em cache para todas as instruções SQL dentro de funções PL/pgSQL; eles são tratados como declarações preparadas , o plano é armazenado em cache para chamadas repetidas dentro da mesma sessão (se o Postgres espera que o plano em cache (genérico) tenha um desempenho melhor do que o replanejamento todas as vezes. Essa é a razão pela qual as funções PL/pgSQL são normalmente mais rápidas após as primeiras ligações nesses casos.

    Aqui está um tópico no pgsql-performance discutindo alguns desses itens:
    • Re:funções pl/pgsql superam as funções sql?

  • Quando você precisa capturar erros .

  • Para funções de gatilho .

  • Ao incluir instruções DDL alterando objetos ou alterando catálogos do sistema de qualquer maneira relevante para comandos subsequentes - porque todas as instruções nas funções SQL são analisadas de uma só vez enquanto as funções PL/pgSQL planejam e executam cada instrução sequencialmente (como uma instrução preparada). Ver:
    • Por que as funções PL/pgSQL podem ter efeito colateral, enquanto as funções SQL não podem?

Considere também:
  • Desempenho do procedimento armazenado do PostgreSQL

Para realmente retornar de uma função PL/pgSQL, você poderia escrever:
CREATE FUNCTION f2(istr varchar)
  RETURNS text AS
$func$
BEGIN
   RETURN 'hello! ';  -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;

Existem outras maneiras:
  • Posso fazer uma função plpgsql retornar um inteiro sem usar uma variável?
  • O manual sobre "Retornando de uma função"