Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Optimizar consulta con Union ALL (https://www.clubdelphi.com/foros/showthread.php?t=70202)

chinosoft 06-10-2010 16:58:05

Optimizar consulta con Union ALL
 
Buenas:

¿Como podria optimizar esta consulta?.

Me demora casi 2hs en devolverme el resultado.

¡Cualquier sugerencia sera bienvenida!

Desde ya ¡Muchas Gracias!

Código SQL [-]
Select 
  Acumulados.Codigo, Sum(Kilos) As TotalKilos 
From 
  (Select codigomaster1 Codigo, Sum(kilosmaster1) As Kilos 
    From 
      preparacion Group By codigomaster1 
        Union ALL 
          Select codigomaster2 Codigo, Sum(kilosmaster2) As Kilos From preparacion Group By codigomaster2 
            Union ALL Select codigomaster3 Codigo, Sum(kilosmaster3) As Kilos From preparacion Group By codigomaster3) As Acumulados Group By Acumulados.Codigo

Luis F. Orjuela 06-10-2010 17:12:54

La experiencia dice que: "divide y vencerás...".

Por lo tanto utiliza procedimientos almacenados dentro de la base de datos para que éstos te hagan calculos intermedios y por último generas la consulta con los resultados obtenidos...

Recuerda que todo lo que se haga dentro del motor de base de datos será mil veces más rápido que cuando se hace desde el cliente.

Cordialmente::)

guillotmarc 06-10-2010 18:02:19

A la vista de la consulta, los únicos índices que veo que vale la pena tener son 3 índices para la tabla Praparacion, uno para CodigoMaster1, otro índice para CodigoMaster2 y un tercer índice para CodigoMaster3.

NOTA: Si tienes una tabla con los Codigos, seguramente se ejecutará mas rápido esta consulta (que da el mismo resultado):

Código SQL [-]
select codigo,
         coalesce((select sum(kilosmaster1) from preparacion where codigomaster1 = codigo), 0) +
         coalesce((select sum(kilosmaster2) from preparacion where codigomaster2 = codigo), 0) +
         coalesce((select sum(kilosmaster3) from preparacion where codigomaster3 = codigo), 0) as kilos        
from codigos

Naturalmente sigues necesitado un índice independiente para cada campo codigomaster1/2/3

Saludos.


La franja horaria es GMT +2. Ahora son las 08:33:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi