Re: no aplica constraint_exclusion con concadenacion de parametros

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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