Optimizar consulta

From: Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com>
To: "'pgsql-es-ayuda(at)postgresql(dot)org'" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Optimizar consulta
Date: 2005-05-20 19:31:03
Message-ID: 428E3AF7.4090509@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola lista.
Tengo un problema.
Sucede que tengo que recorrer varias tablas según un parámetro, en este
caso rut.
He aquí la sentencia (mas pequeña que la real, pero lo importante es que
se entienda)

SELECT *
FROM (
SELECT * ,
(fact.compra.sum_valor_fc + fact_gasto.sum_valor_fg) AS
sum_valor
FROM sx_prov prov,
-- fact_compra
-- recorro la tabla sx_fact_compra segun el rut
-- para obtener a cuanto ascienden las factura de compra
(
SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS
sum_valor_fc
FROM sx_fact_compra
WHERE rut = $1
) AS fact_compra,
-- fact_gasto
-- analogo a la sx_fact_compra
(
SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS
sum_valor_fg
FROM sx_fact_gasto
WHERE rut = $1
) AS fact_gasto
WHERE prov.rut = $1
GROUP BY
--- los GROUP BY necesarios
) AS tabla
ORDER BY sum_valor DESC

Actualmente esto lo programo desde el lenguaje de programación (Java), o
sea obtengo todos los rut's y luego uno a uno voy obteniendo los datos.
Funcionaba bien hasta que lo probamos en un entorno real donde habían
muchos datos. Y claro, el tiempo de espera se hizo eterno (6 minutos mas
o menos), ocupa toda la CPU, entre otros problemas. Ahí el cuello de
botella estaría (a grueso modo) en abrir la conexion, obtener los datos
y cerrar la conexion por cada parametro.

Como se ve, deseo obtener a cuánto han ascendido las compras de la
empresa para un proveedor especificado. Para ello tengo que entrar a
diferentes tablas donde están los distintos documentos asociados:
factura de compra, factura de gasto, notas de credito (omitida en la sql
por simplicidad), notas de debito (omitida en la sql por simplicidad).

Para un solo proveedor funciona, pero cuando la trate de hacer para que
me devolviese una lista de todos con sus 'sum_valor', me entregaba
informacion erronea de 'sum_valor' sumando varias veces, o sumando otros
valores (lo hice hace tiempo, asi que no recuerdo bien los detalles,
pero de que no salian los datos bien, no salian :'( ).

Entonces hice lo que comente en el 1er mail (Obtener todos los rut de la
tabla de proveedores y despues uno por uno calcular su 'sum_valor')

Ahora hay dos posibles soluciones, a mi modo de ver:
Hacer eso de obtener todos los rut de la tabla de proveedores y
despues calcular uno por uno su 'sum_valor' pero ahora solo desde un
procedimiento almacenado; o,
Mejorar el procedimiento almacenado anterior de manera que si funcione
entregando los datos de los proveedores y su correspondiente 'sum_valor'

Salu2.
PD: Se que esto lo pregunte antes, pero al no recibir respuesta pues el
mail anterior mostraba muy difusamente la sentencia SQL, decidi
reenviarla como otra consulta a la lista

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario Soto Cordones 2005-05-20 19:36:11 Re: Optimizar consulta
Previous Message FENALCO - Mauricio Henao 2005-05-20 19:21:02 Ayuda con fechas