Volatilidad de la función

En Spanner, las funciones, incluidas las funciones integradas de SQL y las definidas por el usuario, se clasifican según su volatilidad. La categoría de volatilidad indica si una función muestra el mismo resultado cuando la llamas con los mismos argumentos. Esta clasificación afecta la forma en que el optimizador de consultas controla la función y dónde puedes usarla, por ejemplo, en expresiones de columnas generadas o definiciones de índice. Comprender la volatilidad de las funciones te ayuda a escribir consultas y esquemas más predecibles y con mejor rendimiento en Spanner.

Existen tres categorías de volatilidad, que son similares a los conceptos de sistemas como PostgreSQL:

  • Inmutable: Una función es inmutable si muestra los mismos resultados cuando la llamas con los mismos valores de argumentos. Este comportamiento significa que el resultado de la función depende solo de sus argumentos de entrada y no del estado de la base de datos, la configuración de la sesión ni factores externos. La mayoría de las funciones matemáticas son inmutables. Las siguientes funciones son ejemplos:

    • ABS

    • LENGTH

    • Funciones para manipular cadenas, como CONCAT y LOWER

    • Funciones de formato de fecha y hora con entradas explícitas

    Las funciones que dependen de parámetros configurables en el tiempo de ejecución, como la zona horaria, no son inmutables porque sus resultados pueden variar en diferentes configuraciones de bases de datos o sesiones.

  • Estable: Una función es estable si muestra los mismos resultados para los mismos valores de argumentos dentro de una sola ejecución de instrucción. Sin embargo, su resultado puede cambiar en diferentes instrucciones de SQL. Las funciones como CURRENT_TIMESTAMP, CURRENT_DATE, y otras funciones similares basadas en el tiempo son estables. Por ejemplo, varias llamadas a CURRENT_TIMESTAMP dentro de la misma sentencia SELECT producen la misma marca de tiempo, pero las sentencias posteriores podrían producir una marca de tiempo diferente.

  • Volátil: Una función es volátil si su valor puede cambiar incluso dentro de una sola ejecución de instrucción con los mismos argumentos. Por ejemplo, la GENERATE_UUID función, que genera un ID único, es volátil.

Implicaciones de la volatilidad

La categoría de volatilidad de una función determina dónde se puede usar en el esquema de la base de datos y cómo se optimizan las consultas que contienen la función:

  • Columnas generadas: Las expresiones que definen columnas generadas deben ser inmutables. Esto garantiza que el valor almacenado sea determinista según las otras columnas de la fila. Spanner produce un error si intentas definir una columna generada con una expresión que no es inmutable.

  • Indexación: No puedes crear índices en expresiones que involucren funciones volátiles. Spanner produce un error si intentas crear un índice en una expresión que involucre funciones volátiles.

  • Optimización de consultas: El optimizador de consultas usa información de volatilidad para realizar optimizaciones. Por ejemplo, el optimizador de consultas precalcula las llamadas a funciones inmutables con argumentos constantes. El optimizador suele almacenar en caché los resultados de las funciones estables dentro del alcance de la ejecución de una sola instrucción.