From: | Jaime Casanova <jaime(dot)casanova(at)2ndquadrant(dot)com> |
---|---|
To: | Hellmuth Vargas <hivs77(at)gmail(dot)com> |
Cc: | Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: no aplica constraint_exclusion con concadenacion de parametros |
Date: | 2017-03-08 00:35:54 |
Message-ID: | CAJGNTeNpQ0RxNbX4LxdYqANi3Vr+XnyiwcLbTm2eEi62qU0GKg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On 7 March 2017 at 18:02, Hellmuth Vargas <hivs77(at)gmail(dot)com> wrote:
>
> Tengo un servidor PostgreSQL 9.6 en le cual implemente particionamiento (por
> fecha) sobre una tabla, pues sobre esta tabla se generan reportes mensuales
> de gran cantidad de registros, ajuste el parámetro constraint_exclusion = on
> para qeu excluyera las tablas que no estan en le rango, Hice una prueba y
> funciona como se espera:
>
[...]
>
> Pero si cambio el formato de la fechas (porque realmente esta consulta esta
> dentro de un jasper y las fechas son parámetros y por lo tanto se
> concadenan):
>
Esto funciona así desde siempre y la explicación es que postgres
decide que particiones leer antes de llegar al executor (no recuerdo
si en tiempo de parsing o planning, creería que en el segundo).
Debido a que la consulta aun no empieza a ejecutarse (porque eso
ocurre, obviamente, en el executor) postgres no ha resuelto funciones
ni expresiones y por lo tanto no puede decidir eliminar particiones
basándose en eso.
La condición para que excluya particiones *tiene* que ser una
constante. La única solución real, si es que no puedes enviar la fecha
armada, es que escondas la consulta en una función almacenada usando
SQL dinamico y concatenes lo que envias como una constante usando algo
parecido a una función como la que te pongo de ejemplo (la cual tiene
cabos sueltos):
CREATE OR REPLACE FUNCTION consulta_dinamica(v_fecha_i text, v_hora_i
text, v_fecha_f text, v_hora_f text)
RETURNS algo AS
$$
begin
EXECUTE 'SELECT q.evento,count(*)
FROM queue_log q
WHERE q.fecha BETWEEN cast(' || v_fecha_i || '
' || v_hora_i || ' as timestamp )
AND cast('
|| v_fecha_f || ' ' || v_hora_f || ' as timestamp )
GROUP BY 1';
end;
$$
LANGUAGE 'plpgsql';
--
Jaime Casanova www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
From | Date | Subject | |
---|---|---|---|
Next Message | Alejandro Carrillo | 2017-03-08 05:21:24 | Control de excepcion |
Previous Message | Hellmuth Vargas | 2017-03-07 23:02:22 | no aplica constraint_exclusion con concadenacion de parametros |