Re: Como sé si mi hardware ya no me permite ejecutar más rapidamente una setencia SELECT en PostgreSQL

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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