Re: Consulta con Subselect

From: "Eduardo Arenas C(dot)" <edomax(at)gmail(dot)com>
To: Victor Báez <victor(dot)baez(at)mickey(dot)com(dot)py>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta con Subselect
Date: 2012-02-03 18:00:32
Message-ID: CAEe4h9ricLwjLzTfe1ewU-nXPy1HXq4JTc=ZSO+xMMqnF8nPNQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Victor,

A simple vista en cada sub consulta por periodo estas haciendo el calculo x
zona y n veces por cada registro consultado de la tabla zonas.
es decir por cada registro calculas todo el peso de un periodo para hacer
el join pero solo con ese registro, luego vuelves a hacer lo mismo con cada
uno de los registros de tu tabla.

Ahora si estás consultando todas las zonas, no será mejor hacer una sola
sub consulta de calculo de pesos totales??? la que puedes unir n veces con
sigo misma de acuerdo a la cantidad de periodos de calculo.

Me hice un mini ejemplo en mi servidor (IBM balde center intel xeon 8 core
2.0, 2GB RAM linux redhat 32 bit, postgresql 9.0 , hdd raid 0), consultando
una tabla de 3 millones de registro en periodos de 1 mes (aprox 38 mil
registros x mes). , utilice solo una tabla consultando a si misma pero con
la misma estrucutra que tu utilizaste para hacer los join, es decir meter
una sub query como un campo mas en una query.

Con tu estructura de calculo se demora 32 segundos. con mi estructura 3
seg. te envio mis dos script espero te sirvan.

++++++++++++++++++++++++++++++++++++++++++++++++
++ script ( con tu estructura de calculo).
++++++++++++++++++++++++++++++++++++++++++++++++

select a.med_centro,a.med_cargo,a.med_codigo
, (
select count(*)
from datamart_agenda.cuboagenda3 bb
where bb.age_fecha_cita between '20110101' and '20110131'
and a.med_codigo = bb.med_codigo
and a.med_centro = bb.med_centro

) as q1
from datamart_agenda.cuboagenda3 as a
where a.age_fecha_cita between '20110101' and '20110131'
group by 1,2,3

++++++++++++++++++++++++++++++++++++++++++++++++
++ Mi script
++++++++++++++++++++++++++++++++++++++++++++++++

select a.med_centro,a.med_cargo,a.med_codigo,sum(q1) as q1_sum
from
(
select a.med_centro,a.med_cargo,a.med_codigo,b.q1
from datamart_agenda.cuboagenda3 as a
left join (
select a.med_centro,a.med_codigo,count(*) as q1
from datamart_agenda.cuboagenda3 as a
where a.age_fecha_cita between '20110101' and '20110131'
group by 1,2
) as b on a.med_centro=b.med_centro and a.med_codigo = b.med_codigo
where a.age_fecha_cita between '20110101' and '20110131'
) as a
group by 1,2,3

saludos

eduardo.

<http://www.saluduc.cl>

Eduardo Arenas Castillo
Ancora UC
Red de Centros de Salud Familiar
of. + 56 2 5814 740 - cel. +56 9 6629 161
Get a signature like this.
<http://r1.wisestamp.com/r/landing?promo=19&dest=http%3A%2F%2Fwww.wisestamp.com%2Femail-install%3Futm_source%3Dextension%26utm_medium%3Demail%26utm_campaign%3Dpromo_19>
CLICK
HERE.<http://r1.wisestamp.com/r/landing?promo=19&dest=http%3A%2F%2Fwww.wisestamp.com%2Femail-install%3Futm_source%3Dextension%26utm_medium%3Demail%26utm_campaign%3Dpromo_19>

2012/2/3 Victor Báez <victor(dot)baez(at)mickey(dot)com(dot)py>

> Hola amigos. Tengo inconveniente por la lentitud de esta consulta si me
> podrían ayudar.****
>
> ** **
>
> Lo que hace la consulta es seleccionar todas las zonas y nos interesa la
> cant en peso de los productos, el precio total dentro de un periodo de
> fecha y según otros parámetros. Resulta que es muy lento con esta ****
>
> ** **
>
> SELECT z.dizonas, z.zona, z.idvendedor, ****
>
> (SELECT SUM(fd.cantidad*p.peso) ****
>
> From facturas_detalle fd LEFF JOIN
> (factaru f LEFT JOIN clients c ON f.cliente=c.cliente) ON
> f.difactura=fd.factura****
>
>
> LEFT JOIN productos p ON fd.codigoproducto=p.codigoproducto****
>
> WHERE c.idzonas=z.idzonas AND f.fecha between ?fecha1_p1 AND fecha1_p1
> )::numeric (18,4) as peso_total_periodo1,****
>
> (SELECT SUM(fd.cantidad*p.peso) ****
>
> From facturas_detalle fd LEFF JOIN
> (factaru f LEFT JOIN clients c ON f.cliente=c.cliente) ON
> f.difactura=fd.factura****
>
>
> LEFT JOIN productos p ON fd.codigoproducto=p.codigoproducto****
>
> WHERE c.idzonas=z.idzonas AND f.fecha between ?fecha1_p2 AND fecha1_p2
> )::numeric (18,4) as peso_total_periodo2****
>
> FROM zonas z****
>
> GROUP BY z.dizonas, z.zona, z.idvendedor****
>
> ORDER BY z.idzonas****
>
> ** **
>
> Notese que aqui ay 2 subconsulta para 2 columna solo para peso de
> diferente periodo y si quiero agregar importe, cantidad en undad me
> aumentara en 6 subconsulta.****
>
> ** **
>
> Tablas usadas****
>
> Zonas****
>
> Clientes****
>
> Factura – Encabezado****
>
> Factura_detalle****
>
> Productos****
>
> Ay otras tablas mas pero probando con esto ya es lento, pienso que por los
> sub select que hace para cada columna que va agregando, ****
>
> Mi pregunta es si ay alguna forma de traer varias columna de una vez en
> una sola subconsulta.****
>
> ** **
>
> Haciendo directo from facturas_detalle y voy agregando los join es rápido
> pero solo me trae la zona que tienen ventas y yo necesito que me traiga
> todas las zonas por mas q no tenga venta****
>
> ** **
>
> ** **
>

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martin Li Causi 2012-02-03 18:46:34 Re: Leer una tabla en Oracle desde Postgres
Previous Message Anthony 2012-02-03 17:16:26 Re: Consulta con Subselect