Alvaro muchas gracias por tu respuesta, en efecto el tiempo se reduce en
prácticamente 1 segundo con el query propuesto.

QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=121401.96..121401.98 rows=1 width=38) (actual
time=3331.908..3331.908 rows=1 loops=1)
   ->  WindowAgg  (cost=0.00..106689.35 rows=980841 width=11) (actual
time=1323.382..2522.707 rows=1037011 loops=1)
         ->  Index Scan using idx_rm_cuentas_vistas_fecha_snapshot on
rm_cuentas_vistas  (cost=0.00..89524.63 rows=980841 width=11) (actual
time=0.037..428.830 rows=1037011 loops=1)
               Index Cond: (fecha_snapshot = '2014-03-11'::date)
 Total runtime: 3333.872 ms

Por que el CTE resultará más lento que el subselect?..




2014-05-05 11:40 GMT-04:30 Alvaro Herrera <[email protected]>:

> Alfredo Rico escribió:
>
> > Query:
> > explain analyze
> >   with CTE as (
> >    select saldo_contable, saldo_contable * tasa_interes /
> > (sum(saldo_contable) over ()) as tasa
> >     from rm_cuentas_vistas where fecha_snapshot = '2014-03-17'
> > ) select 'Depósitos a la vista' as partida, sum(saldo_contable) as
> > total_saldo, round(sum(tasa),4) as total_tasa from CTE
> > ;
> >
> > Explain analyze
> >
> >            QUERY PLAN
> >
> >
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> >  Aggregate  (cost=166739.23..166739.25 rows=1 width=52) (actual
> > time=4324.532..4324.532 rows=1 loops=1)
> >    CTE cte
> >      ->  WindowAgg  (cost=0.00..135537.58 rows=1248066 width=11) (actual
> > time=1580.507..2891.732 rows=1043549 loops=1)
> >            ->  Index Scan using idx_rm_cuentas_vistas_fecha_snapshot on
> > rm_cuentas_vistas  (cost=0.00..113696.43 rows=1248066 width=11) (actual
> > time=64.275..741.755 rows=1043549 loops=1)
> >                  Index Cond: (fecha_snapshot = '2014-03-17'::date)
> >    ->  CTE Scan on cte  (cost=0.00..24961.32 rows=1248066 width=52)
> (actual
> > time=1580.522..3412.303 rows=1043549 loops=1)
> >  Total runtime: 4336.805 ms
>
> Hmm, yo creo que lo que aquí necesitas es un índice Minmax.  Lástima que
> aún no estén implementados ..
>
> Más en serio, yo intentaría usar un subselect en vez de un CTE.  Con ese
> CTE tan grande, estás pagando un sobrecosto bien alto.
>
> Algo de este tipo:
>
>  select 'Depósitos a la vista' as partida,
>       sum(saldo_contable) as total_saldo,
>       round(sum(tasa),4) as total_tasa
>    from
>  (
>     select saldo_contable,
>          saldo_contable * tasa_interes / (sum(saldo_contable) over ()) as
> tasa
>       from rm_cuentas_vistas
>      where fecha_snapshot = '2014-03-17'
>  ) f
>
> Me parece que debería mejorar algo, aunque ese WindowAgg .. hmm.
>
> --
> Álvaro Herrera                http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Training & Services
>



-- 
Saludos Cordiales.-
Alfredo Rico.
San Cristóbal - Venezuela.

Responder a