From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
---|---|
To: | Alfredo Rico <alfredorico(at)gmail(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 16:10:20 |
Message-ID: | 20140505161020.GI6018@eldon.alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
From | Date | Subject | |
---|---|---|---|
Next Message | Alfredo Rico | 2014-05-05 17:08:06 | Re: Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL |
Previous Message | Alfredo Rico | 2014-05-05 15:52:16 | Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL |