Eu sou novato em coisas de DB. E meu conhecimento de banco de dados é muito antigo (em torno de MSSQL2000). Tudo o que me lembro é que os procedimentos armazenados são mais rápidos do que as consultas comuns porque evitam a compilação e a otimização da consulta.
Eu sei que o PG tem dois tipos de opções de cache de consulta. Instrução preparada (consulta em cache temporária) e função (consulta em cache persistente, que é um procedimento armazenado no MSSQL).
Enfim, hoje ouvi o conceito de cerca de otimização . Qual é o otimizador que vê as funções como uma caixa preta opaca, portanto não pode otimizar o interior. Conceitualmente, pode estar certo.
Isso é verdade mesmo que as funções sejam totalmente escritas apenas com PL/pgSQL? Ou apenas uma limitação apenas para linguagens não SQL? Tenho alguma chance de obter melhor desempenho usando PL/pgSQL?
Funções escritas em linguagem
SQL
podem sob certas condições (por exemplo, sem efeitos colaterais) ser "inlined" (a critério do otimizador), caso em que farão parte da otimização do plano de consulta. As funções escritas em todas as outras linguagens (incluindo PL/pgSQL) não farão parte da otimização da consulta principal, portanto, elas são de fato cercas de otimização, como você as chama.Por outro lado, uma consulta executada por uma função PL/pgSQL será compilada e preparada na primeira vez em que for executada, portanto as chamadas subsequentes dessa função (mesmo como parte da mesma consulta de nível superior) serão mais rápidas. As funções SQL não preparam implicitamente as consultas que executam, portanto, se o inlining de uma função SQL falhar, as chamadas repetidas provavelmente serão mais lentas.
Na prática, depende das circunstâncias específicas que é mais rápido. Geralmente, sigo a regra básica de usar
LANGUAGE SQL
quando é possível eLANGUAGE plpgsql
somente quando preciso do poder expressivo adicional. Mas é definitivamente uma estratégia de microotimização útil comparar implementações nas duas linguagens.