From: | Alfredo Rico <alfredorico(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
Cc: | Martín Marqués <martin(at)2ndquadrant(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL |
Date: | 2014-05-05 17:08:06 |
Message-ID: | CAGWUuq0VwtwHJ9-Sn-YqFdintzeEJ+7XtozWW3-s80cLC5ivSg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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 <alvherre(at)2ndquadrant(dot)com>:
> 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.
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2014-05-05 18:21:00 | Re: Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL |
Previous Message | Alvaro Herrera | 2014-05-05 16:10:20 | Re: Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL |