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

From: Arturo Munive <arturomunive(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-17 23:13:38
Message-ID: 464CE1A2.8000104@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alvaro Herrera escribió:
> 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)
>

Bueno , yo he resuelto esta consulta agregando una columna a la
tabla que menciona orlando...
no se si entiendo bien o no la consulta que el hace
el quiere mostrar todas las cuentas de mas 8 digitos o mas mostrando
solo los 8 primeros caracteres de cada código

es asi o me equivoco????
por que si es asi la consulta que yo hize (un select de los mas simples)
demora 0.17 segundos sin nigun tipo de indices en la tabla

pero aun no coloco la solucion por que no se si entendi bien el
problema, no quiero hacer el ridículo je je

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2007-05-17 23:24:40 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres
Previous Message Alvaro Herrera 2007-05-17 22:49:14 Re: Como convertir los SELECT que usan AS en otros manejadores a Postrgres