Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Como optimizo esta consulta SQL

Estas en el tema de Como optimizo esta consulta SQL en el foro de Bases de Datos General en Foros del Web. Hola a todos, estoy utilizando una base de datos en Pervasive, si no lo conocen es muy similar a SQL Server. Necesito hacer una consulta ...
  #1 (permalink)  
Antiguo 16/04/2009, 15:26
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Busqueda Como optimizo esta consulta SQL

Hola a todos, estoy utilizando una base de datos en Pervasive, si no lo conocen es muy similar a SQL Server.

Necesito hacer una consulta sobre dos tablas. La primera de las tablas se llama Referencias, me interesan de ella los campos referencia,descripcion... entre otros.
La otra tabla se llama Historico de Trans. que guarda todas las transacciones hechas con las referencias, por lo que estas dos tablas se enlazarían por el campo referencia presente en ambas tablas. Además están allí el año, mes y día de los movimientos y la cantidad del movimiento. Con los datos de esta tabla debo realizar un promedio de consumos por mes del último año (es decir, sumar los consumos de cada uno de los últimos 12 meses y dividirlos por 12).

Hasta ahora le he hecho así:

Código:
SELECT referencia,
descripcion,
"Punto Minimo",
"Punto Maximo",
("Saldo Inicial Mes"+"Entradas Mes"-"Salidas Mes") as Saldo,
(SELECT TOP 1 ROUND((SUM ("Cantidad")/12),2) as 'CPM'
FROM "Historico de Trans" 
WHERE "Bodega" = '01' 
AND "Tipo Transaccion" = '17' 
AND "Referencia" = Referencias.referencia
AND (
	("Anno Documento" = '2009' AND "Mes Documento" < '04' ) 
	OR 
	("Anno Documento" = '2008' AND "Mes Documento" >= '04' )
))
FROM Referencias  
WHERE bodega ='01'
Pero se tarda un eternidad en hacer esto, y los usuarios se quejan de lentitud, por lo que necesito optimizarla de alguna forma.

Si alguien me puede guiar con este asunto le estaré altamente agradecido... Saludos.
  #2 (permalink)  
Antiguo 17/04/2009, 05:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Como optimizo esta consulta SQL

Eso funcina!!!???

Nos tendrias que pistar mas...

TablaX
CampoX1
CampoX2
...


TabaY
CampoY1
CampoY2
....

Así podriamos ver mejor como hacer la consulta....

Quim
  #3 (permalink)  
Antiguo 17/04/2009, 07:12
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Como optimizo esta consulta SQL

Hola gracias por la respuesta.

Sí. La consulta así como está funciona. acá te dejo la descripción de las tablas:

Tabla Referencias:
- referencia
- descripcion
- Punto Minimo (sí con espacio, por eso uso las columnas dobles)
- Punto Maximo
- Saldo Inicial Mes
- Entradas Mes
- Salidas Mes
- Bodega

Tabla Historico de Trans:
- Cantidad
- Referencia
- Anno Documento
- Mes Documento
- Bodega
- Tipo Transaccion

Gracias de antemano. Saludos.
  #4 (permalink)  
Antiguo 20/04/2009, 02:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Como optimizo esta consulta SQL

Código sql:
Ver original
  1. SELECT Referencias.referencia,
  2. Referencias.descripcion,
  3. "Punto Minimo",
  4. "Punto Maximo",
  5. ("Saldo Inicial Mes"+"Entradas Mes"-"Salidas Mes") AS Saldo,
  6. ifnull(sbc.CPM,0) AS 'CPM'
  7. FROM Referencias  LEFT JOIN
  8.       (SELECT TOP 1 ROUND((SUM ("Cantidad")/12),2) AS 'CPM'
  9.        FROM "Historico de Trans" AS HT
  10.        WHERE HT.Bodega = '01'
  11.              AND "Tipo Transaccion" = '17'
  12.              AND (("Anno Documento" = '2009' AND "Mes Documento" < '04' )
  13.                      OR
  14.                  ("Anno Documento" = '2008' AND "Mes Documento" >= '04' ))
  15.         ) AS sbc
  16. ON sbc.Referencia = Referencias.referencia
  17. WHERE Referencias.bodega ='01'


No se si será mejor.... con probar no pierdes nada... si si tendria que ser mas ràpida....

ifnull(sbc.CPM,0) AS 'CPM' no se si tendrás la función IFNULL en tu motor si no cambiala por una equivalente (lo que hace es poner un zero quando la media sea nula)...

Quim
  #5 (permalink)  
Antiguo 20/04/2009, 05:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Como optimizo esta consulta SQL

Error.. Errorrr

Esta seria la buena

Código sql:
Ver original
  1. SELECT Referencias.referencia,
  2.       Referencias.descripcion,
  3.       "Punto Minimo",
  4.       "Punto Maximo",
  5.       ("Saldo Inicial Mes"+"Entradas Mes"-"Salidas Mes") AS Saldo,
  6.       ifnull(sbc.CPM,0) AS 'CPM'
  7.       FROM Referencias  LEFT JOIN
  8.             (SELECT HT.Referencia, ROUND((SUM ("Cantidad")/12),2) AS 'CPM'
  9.              FROM "Historico de Trans" AS HT
  10.              WHERE HT.Bodega = '01'
  11.                   AND "Tipo Transaccion" = '17'
  12.                   AND (("Anno Documento" = '2009' AND "Mes Documento" < '04' )
  13.                           OR
  14.                        ("Anno Documento" = '2008' AND "Mes Documento" >= '04' ))
  15.               GROUP BY HT.Referencia) AS sbc
  16.       ON sbc.Referencia = Referencias.referencia
  17.       WHERE Referencias.bodega ='01'

Perdón

Quim
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:37.