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

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.

In response to

Responses

Browse pgsql-es-ayuda by date

  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