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!
fuente
Para STABLE, la parte que debe poner en negrita es 'el resultado podría cambiar en las declaraciones SQL'
Se supone que las cosas INMUTABLES nunca cambiarán. Incluso si reinicia el servidor de base de datos, ejecución
yum update
(pero por supuesto no puede haber errores!), Cambiar la configuración (comodatestyle
,timezone
,default_text_search_config
,extra_float_digits
, etc.), o reemplazar el hardware del servidor por completo (de la misma arquitectura que el hardware antiguo, por lo los archivos binarios siguen siendo compatibles).Las funciones que describe suenan como ESTABLES, porque dentro de una sola instrucción SQL ejecutarán sus consultas utilizando la misma instantánea que tiene la consulta externa, por lo que cualquier cambio concurrente que haya realizado en esas otras tablas no sería visible. Ahora, si sus funciones abren una nueva conexión al servidor y ejecutan sus consultas dentro de esa conexión independiente, eso haría que la función sea volátil, ya que estarían usando diferentes instantáneas.
fuente
IMMUTABLE
y colaciones. Confía en queglibc
(o, en la Pg más reciente, iconv) no cambiará las definiciones de intercalación. En realidad, lo hacen, y no proporcionan forma de detectar tales cambios. Puede conducir a la corrupción silenciosa del índice :(. Es principalmente un problema al replicar entre diferentes versiones del sistema operativo, etc.