sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué el planificador obtiene diferentes resultados para funciones con diferentes volatilidades?

Estima 1000 filas

1000 filas estimadas es un valor predeterminado documentado en CREATE FUNCTION :

Cuando una función se declara volátil, solicita no estar en línea, por lo que este valor predeterminado para result_rows retiene.

Por otro lado, cuando se inserta en una consulta como en su segunda prueba, la cantidad de filas se estimará como si el cuerpo de la función se hubiera movido a la consulta y la declaración de la función no existiera. Esto lleva en la segunda prueba a una estimación exacta ya que los VALUES cláusula se puede evaluar directamente.

¿Qué hace exactamente el planificador aquí y dónde puedo leer documentación sobre él?

En general, las estrategias de optimización del planificador no se explican en la documentación principal. Se discuten en las listas de correo y se mencionan en los comentarios del código fuente, que afortunadamente tienden a ser excepcionalmente claros y bien escritos (en comparación con el código fuente promedio). En el caso de la inserción de funciones, creo en los comentarios de inline_set_returning_functions y inline_set_returning_function revelar la mayoría de las reglas que impulsan esta optimización en particular. (Advertencia:los enlaces anteriores están en la rama principal actual, que está sujeta a cambios o variaciones en cualquier momento).