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

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Orlando Ramirez <orlan2_r(at)yahoo(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Date: 2007-05-17 22:49:14
Message-ID: 20070517224914.GW28701@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Este problema seria mucho menos malo si la manera de especificar la
jerarquia fuera especificando el padre de cada registro mas
explicitamente, y no tuvieras que usar el horrible substring() para eso.
En realidad ese es el principal problema del modelo.

Para ver si alguien se interesa en la salida de EXPLAIN ANALYZE de 8.3,
la pego abajo. Tiene dos diferencias con versiones anteriores:
1. muestra el uso de disco/memoria en los Sort
2. muestra los nombres de las columnas en algunos nodos que necesitan
mostrar columnas (versiones anteriores dicen "inner".foo = "outer".bar,
aca dice exactamente que columna y que expresion se esta calculando)

alvherre=# explain analyze 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;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Group (cost=181905.21..193306.86 rows=912132 width=52) (actual time=1551.356..1624.042 rows=1082 loops=1)
-> Sort (cost=181905.21..184185.54 rows=912132 width=52) (actual time=1551.347..1585.564 rows=15360 loops=1)
Sort Key: ((("substring"((a.cod_cta)::text, 1, 8)))), b.des_cta
Sort Method: external sort Disk: 1160kB
-> Merge Join (cost=4072.13..29253.24 rows=912132 width=52) (actual time=769.400..1161.176 rows=15360 loops=1)
Merge Cond: ((("substring"((a.cod_cta)::text, 1, 8))) = (((b.cod_cta)::text)))
-> Sort (cost=1097.01..1116.50 rows=7798 width=21) (actual time=356.254..426.288 rows=20348 loops=1)
Sort Key: ("substring"((a.cod_cta)::text, 1, 8))
Sort Method: external merge Disk: 912kB
-> Seq Scan on cuentas a (cost=0.00..592.91 rows=7798 width=21) (actual time=0.026..80.879 rows=20348 loops=1)
Filter: (length(cod_cta) > 8)
-> Sort (cost=2975.13..3033.61 rows=23394 width=52) (actual time=413.105..508.041 rows=37669 loops=1)
Sort Key: ((b.cod_cta)::text)
Sort Method: external sort Disk: 1992kB
-> Seq Scan on cuentas b (cost=0.00..475.94 rows=23394 width=52) (actual time=0.034..75.988 rows=23394 loops=1)
Total runtime: 1633.384 ms
(16 rows)

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Arturo Munive 2007-05-17 23:13:38 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Previous Message Arturo Munive 2007-05-17 22:05:37 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres