No tengo claro el verdadero significado en las definiciones de funciones INMUTABLES, VOLÁTILES y ESTABLES.
Leí la documentación, específicamente las definiciones de cada uno.
INMUTABLE indica que la función no puede modificar la base de datos y siempre devuelve el mismo resultado cuando se le dan los mismos valores de argumento ; es decir, no realiza búsquedas en la base de datos ni utiliza información que no está directamente presente en su lista de argumentos. Si se da esta opción, cualquier llamada de la función con argumentos totalmente constantes puede reemplazarse inmediatamente con el valor de la función.
ESTABLE indica que la función no puede modificar la base de datos, y que dentro de un escaneo de una sola tabla devolverá de manera consistente el mismo resultado para los mismos valores de argumento , pero que su resultado podría cambiar en las declaraciones SQL. Esta es la selección apropiada para funciones cuyos resultados dependen de búsquedas en la base de datos, variables de parámetros (como la zona horaria actual), etc. (No es apropiado para los desencadenadores DESPUÉS que desean consultar filas modificadas por el comando actual). Tenga en cuenta también que La familia de funciones current_timestamp califica como estable, ya que sus valores no cambian dentro de una transacción.
VOLATILE indica que el valor de la función puede cambiar incluso dentro de un escaneo de una sola tabla, por lo que no se pueden realizar optimizaciones. Relativamente pocas funciones de la base de datos son volátiles en este sentido; Algunos ejemplos son random (), currval (), timeofday (). Pero tenga en cuenta que cualquier función que tenga efectos secundarios debe clasificarse como volátil, incluso si su resultado es bastante predecible, para evitar que las llamadas se optimicen. Un ejemplo es setval ().
Mi confusión viene con la condición de INMUTABLE y ESTABLE de que la función SIEMPRE o CONSISTENTE devuelve el mismo resultado dados los mismos argumentos.
La definición INMUTABLE establece que la función no busca en la base de datos ni utiliza información que no está directamente presente en su lista de argumentos. Entonces, para mí, eso significa que tales funciones se utilizan para manipular los datos proporcionados por el cliente, y no deberían tener sentencias SELECT ... aunque eso me parece un poco extraño.
Con STABLE, la definición es similar en el sentido de que dice que debería devolver constantemente el mismo resultado. Entonces, para mí, eso significa que cada vez que se llama a la función con los mismos argumentos, debería devolver los mismos resultados (las mismas filas exactas, cada vez).
Entonces, para mí ... eso significa que cualquier función que realice una SELECCIÓN en una tabla o tablas que se puedan actualizar, solo debería ser volátil.
Pero, de nuevo ... eso no me suena bien.
Llevando esto de vuelta a mi caso de uso, estoy escribiendo funciones que realizan sentencias SELECT con múltiples JOIN en tablas que se agregan constantemente, por lo que se espera que las llamadas a funciones devuelvan resultados diferentes cada vez que se llama, incluso con los mismos argumentos .
Entonces, ¿eso significa que mis funciones deberían ser VOLÁTILES? ¿Aunque la documentación indica que relativamente pocas funciones de la base de datos son volátiles en este sentido ?
¡Gracias!