Volatilidade da função

No Spanner, as funções, incluindo SQL integrado e funções definidas pelo usuário, são classificadas de acordo com a volatilidade. A categoria de volatilidade indica se uma função retorna o mesmo resultado quando é chamada com os mesmos argumentos. Essa classificação afeta como o otimizador de consultas processa a função e onde ela pode ser usada, como em expressões de colunas geradas ou definições de índice. Entender a volatilidade da função ajuda você a escrever consultas e esquemas mais previsíveis e eficientes no Spanner.

Existem três categorias de volatilidade, que são semelhantes a conceitos em sistemas como o PostgreSQL:

  • Imutável: uma função é imutável se retornar os mesmos resultados quando for chamada com os mesmos valores de argumento. Esse comportamento significa que o resultado da função depende apenas dos argumentos de entrada, e não do estado do banco de dados, das configurações da sessão ou de fatores externos. A maioria das funções matemáticas é imutável. Confira alguns exemplos:

    • ABS

    • LENGTH

    • Funções de manipulação de strings, como CONCAT e LOWER

    • Funções de formatação de data e hora com entradas explícitas

    As funções que dependem de configurações configuráveis no tempo de execução, como fuso horário, não são imutáveis porque os resultados podem variar em diferentes configurações de banco de dados ou de sessão.

  • Estável: uma função é estável se retornar os mesmos resultados para os mesmos valores de argumento em uma única execução de instrução. No entanto, o resultado pode mudar em diferentes instruções SQL. Funções como CURRENT_TIMESTAMP, CURRENT_DATE e outras semelhantes baseadas em tempo são estáveis. Por exemplo, várias chamadas para CURRENT_TIMESTAMP na mesma instrução SELECT geram o mesmo carimbo de data/hora, mas instruções subsequentes podem produzir um carimbo diferente.

  • Volátil: uma função é volátil se o valor dela puder mudar mesmo em uma única execução de instrução com os mesmos argumentos. Por exemplo, a função GENERATE_UUID que gera um ID exclusivo é volátil.

Implicações da volatilidade

A categoria de volatilidade de uma função determina onde ela pode ser usada no esquema do banco de dados e como as consultas que contêm a função são otimizadas:

  • Colunas geradas:as expressões que definem colunas geradas precisam ser imutáveis. Isso garante que o valor armazenado seja determinista com base nas outras colunas da linha. O Spanner gera um erro se você tentar definir uma coluna gerada com uma expressão que não é imutável.

  • Indexação:não é possível criar índices em expressões que envolvem funções voláteis. O Spanner gera um erro se você tentar criar um índice em uma expressão que envolve funções voláteis.

  • Otimização de consultas:o otimizador de consultas usa informações de volatilidade para realizar otimizações. Por exemplo, o otimizador de consultas pré-calcula chamadas para funções imutáveis com argumentos constantes. O otimizador geralmente armazena em cache os resultados de funções estáveis no escopo da execução de uma única instrução.