Enquanto observava vários exemplos de pl/python
and pl/pgsql
, vi muitos - mas não todos - usando volatile cost
.
ou seja:
CREATE OR REPLACE FUNCTION my_function()
RETURNS setof record AS
$BODY$
-- code
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Procurando mais informações sobre volatile cost
, descobri (à primeira vista) que aproximadamente pelo menos 90% dos exemplos da web estão usando volatile cost 100
, e às vezes às vezes volatile cost 1
. ( rows
pois é 1000).
Pelo que entendi, essa indicação ajuda o otimizador do plano de consulta a decidir como definir prioridades em operações booleanas de curto-circuito.
É uma otimização prematura se eu começar a dar uma estimativa cost
ou rows
para cada um dos meus procedimentos armazenados? Devo fazer isso apenas quando quiser otimizar determinada consulta? É uma arte escolher o bom valor do custo?
Eu sei sobre o comando explain
, que ainda não aprendi. Este comando é útil para estimar cost
?
VOLATILE
é completamente independente deCOST
.O primeiro define a volatilidade da função e
VOLATILE
é o padrão, portanto pode ser omitido. As alternativas sãoSTABLE
eIMMUTABLE
.Este último só é válido em combinação com um
COST
parâmetro, comoCOST 500
. O padrão éCOST 100
qual, novamente, pode ser omitido. Ele declara o custo por linha do resultado, que é utilizado pelo planejador de consulta para encontrar o plano mais barato. Se você não sabe exatamente o que está fazendo, deixe-o como padrão.Leia o manual muito bom , começando no capítulo
CREATE FUNCTION
.