Hola Jaime

Muchas gracias por la respuesta.... Pues esta tabla se emplea en muchas
consultas (reportes) con diferentes joins y condiciones, por lo tanto no
seria factible una función, voy a ver que podemos hacer desde jasper para
enviar la fecha como una constante

El 7 de marzo de 2017, 19:35, Jaime Casanova<jaime.casan...@2ndquadrant.com>
escribió:

> On 7 March 2017 at 18:02, Hellmuth Vargas <hiv...@gmail.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
>



-- 
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate

Responder a