As funções do Postgres são declaradas com classificação de volatilidade VOLATILE, STABLEouIMMUTABLE . Sabe-se que o projeto é muito rigoroso com esses rótulos para funções internas. E por uma boa razão. Exemplo proeminente: os índices de expressão permitem apenas IMMUTABLEfunções e essas precisam ser realmente imutáveis para evitar resultados incorretos.
As funções definidas pelo usuário ainda estão livres para serem declaradas como o proprietário escolher. O manual aconselha:
Para obter melhores resultados de otimização, você deve rotular suas funções com a categoria de volatilidade mais estrita que é válida para elas.
... e adiciona uma extensa lista de coisas que podem dar errado com um rótulo de volatilidade incorreto.
Ainda assim, há casos em que fingir imutabilidade faz sentido. Principalmente quando você sabe que a função é imutável dentro do seu escopo. Exemplo:
Além de todas as possíveis implicações na integridade dos dados , qual é o efeito no desempenho? Pode-se supor que declarar uma função IMMUTABLEsó pode ser benéfico para o desempenho . É assim mesmo?
A declaração da volatilidade da função pode IMMUTABLE prejudicar o desempenho?
Vamos assumir o Postgres 10 atual para reduzi-lo, mas todas as versões recentes são de interesse.
FORCEé suposto fazer com que os índices de expressão aceitem funções não imutáveis (enquanto os marcam como possíveis pontos de falha). Sim, isso pareceria uma solução mais elegante do que invólucros imutáveis de funções.
FORCEeles de qualquer maneira. 100% dos DBAs experientes do PostgreSQL mentem para contornar essa interface do usuário com funções de wrapper. Pelo menosFORCE, não precisaríamos de invólucros e não precisaríamos mentir sobre a volatilidade declarada do fn.