Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres

From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>
Cc: "Orlando Ramirez" <orlan2_r(at)yahoo(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Date: 2007-05-18 02:42:12
Message-ID: c2d9e70e0705171942k1a9ef3f9l620982f84bb32b8b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 5/17/07, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Orlando Ramirez escribió:
> > Gracias por tu interes Alvaro.
> >
> > Lo que hace el Postgress es recorrer la tabla CUENTAS secuencialmente y por cada registro de esta consulta vuelve a recorrer una instancia de la misma tabla tambien secuencialmente.
> >
> > Si gustas te he preparado un archivo SQL que crea una tabla e inserta los registros correspondientes para efectos de prueba en otras BD. Lo puedes descargar de:
> >
> > http://www.http-peru.com/prueba/cuentas.sql
>
> Hmm, una idea es convertir el Subplan en un join ... creo que esto hace
> lo que quieres:
>
> SELECT codigo, des_cta
> FROM (select substring(a.cod_cta from 1 for 8) as codigo, b.des_cta
> from CUENTAS a, cuentas b
> WHERE length(a.cod_cta) > 8 and
> substring(a.cod_cta from 1 for 8) = b.cod_cta
> ) as foo
> GROUP BY 1, 2;
>
> La verdad es que el plan sigue siendo bastante malo, y las estimaciones
> fallan muchisimo; mas aun, tuvo que usar tres pasos de Sort, usando 4 MB
> en disco, para resolver esta consulta! Pero se demora 1.6 segundos, lo
> cual supongo que es medianamente aceptable.
>

el plan mejora en algo si haces un set enable_mergejoin=off;

QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
Group (cost=255656.36..267058.01 rows=912132 width=52) (actual
time=368.261..425.734 rows=1082 loops=1)
-> Sort (cost=255656.36..257936.69 rows=912132 width=52) (actual
time=368.247..392.925 rows=15360 loops=1)
Sort Key: ("substring"((a.cod_cta)::text, 1, 8)), b.des_cta
Sort Method: external merge Disk: 1096kB
-> Hash Join (cost=678.38..106119.39 rows=912132 width=52)
(actual time=86.187..251.804 rows=15360 loops=1)
Hash Cond: ((b.cod_cta)::text =
"substring"((a.cod_cta)::text, 1, 8))
-> Seq Scan on cuentas b (cost=0.00..463.94
rows=23394 width=52) (actual time=0.035..15.945 rows=23394 loops=1)
-> Hash (cost=580.91..580.91 rows=7798 width=21)
(actual time=85.999..85.999 rows=20348 loops=1)
-> Seq Scan on cuentas a (cost=0.00..580.91
rows=7798 width=21) (actual time=0.022..33.218 rows=20348 loops=1)
Filter: (length(cod_cta) > 8)
Total runtime: 437.343 ms
(11 rows)

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2007-05-18 02:44:08 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Previous Message Jaime Casanova 2007-05-18 02:38:07 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres