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

¿Por qué PostgreSQL trata mi consulta de manera diferente en una función?

Actualización en PostgreSQL 9.2

Hubo una mejora importante, cito las notas de la versión aquí :

Respuesta original para PostgreSQL 9.1 o anterior

Una función plpgsql tiene un efecto similar al PREPARE declaración:las consultas se analizan y el plan de consulta se almacena en caché.

La ventaja es que se ahorra algo de gastos generales para cada llamada.
La desventaja es que el plan de consulta no está optimizado para los valores de parámetros particulares con los que se llama.

Para consultas en tablas con distribución uniforme de datos, esto generalmente no será un problema y las funciones PL/pgSQL se ejecutarán un poco más rápido que las consultas SQL sin formato o las funciones SQL. Pero si su consulta puede usar ciertos índices dependiendo de los valores reales en WHERE cláusula o, de manera más general, eligió un mejor plan de consulta para los valores particulares, puede terminar con un plan de consulta subóptimo. Pruebe una función SQL o use SQL dinámico con EXECUTE para forzar que la consulta se vuelva a planificar para cada llamada. Podría verse así:

CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN        
    RETURN QUERY EXECUTE
        'SELECT *
         FROM   table_name
         where  id = $1'
    USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;

Editar después del comentario:

Si esta variante no cambia el tiempo de ejecución, debe haber otros factores en juego que puede haber pasado por alto o que no mencionó. ¿Diferente base de datos? ¿Diferentes valores de parámetros? Tendrías que publicar más detalles.

Agrego una cita del manual para respaldar mis declaraciones anteriores: