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
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 |