Sum(campo) lento.

28/05/2004 - 20:05 por Manolo Zepeda | Informe spam
Que tal compañeros..!!

Tengo la siguiente consulta en la cual obtengo las sumas
de unas tablas que se relacionan con una principal, las
tablas tienen alrededor de 500 registros, y se tarda
muchisimo para sacar los totales, alrededor de 18 seg.,
tengo 4 indices en cada tabla y no se a que se deba.

En un mismo indice tengo 2 campos, no se si esto este bien
hecho, o deberia poner un nombre de indice para cada campo.

Quisiera saber si puedo poner indices en las Fechas,en los
campos de Bit, en los campos de texto, incluso tambien en
los campos numericos para agilizar los SUM.

este es el procedure.

Alter Procedure Acumulado_Cv
@Pc char(15)
AS
SELECT C.Id_Chofer,C.Nombre
Chofer,Fleteros.Id_Fletero,Fleteros.Nombre Fletero,isnull
(e.embanques,0) Embanques,ISNULL(en.abonos,0) Abonos,ISNULL
(ent2.Combustibles,0) Combustibles,
Isnull(f.fletes,0)Fletes
FROM Choferes C

LEFT JOIN
(Select Id_Chofer,Sum(Volumen*.55)Fletes from Fletes WHERE
No_tarja<>'si' AND Convert(char(1),pagado)=0
GROUP BY Id_Chofer)f
on C.Id_Chofer = f.Id_Chofer

LEFT JOIN (Select Id_Chofer,sum(Volumen*Precio)Embanques
from Embanques
INNER JOIN Parajes ON
Parajes.Id_Paraje=Embanques.Id_Paraje
WHERE Quincena<>'SI' AND Convert(char
(1),Pagado)=0
GROUP BY Id_Chofer)e
ON C.Id_Chofer=e.Id_Chofer

LEFT JOIN
( select Id_Chofer,sum(cantidad)abonos from
Entregas where concepto<>'si' AND Convert(char(1),pagado)=0
GROUP BY Id_chofer) en
on C.Id_Chofer = en.Id_Chofer

LEFT JOIN
( select Id_chofer, sum(cantidad)combustibles
from Entregas2 where concepto<>'si' AND convert(char
(1),pagado)=0
GROUP By Id_Chofer) ent2
on C.Id_Chofer = ent2.Id_Chofer

INNER JOIN
Fleteros ON C.Id_Fletero=Fleteros.Id_Fletero
WHERE c.id_chofer IN(Select Id_Chofer from Choferes_Rel
WHERE NombrePc=@Pc)
 

Leer las respuestas

#1 ulises
28/05/2004 - 21:07 | Informe spam
A primera vista: en las condiciones WHERE de los SELECT
trata de usar condiciones por las cuales pueda hacer uso
de los índices, una condición de tipo "x <> 0" hará un
table scan o un index scan a la tabla, si puedes cambialo
por un campo en particular, algo como "x = 1", lo mismo
ocurre con el la función CONVERT (¿son necesarios?),
realiza esas modificaciones y si todavía tienes problemas
envia tus resultados ...

Saludos,
Ulises

Que tal compañeros..!!

Tengo la siguiente consulta en la cual obtengo las sumas
de unas tablas que se relacionan con una principal, las
tablas tienen alrededor de 500 registros, y se tarda
muchisimo para sacar los totales, alrededor de 18 seg.,
tengo 4 indices en cada tabla y no se a que se deba.

En un mismo indice tengo 2 campos, no se si esto este


bien
hecho, o deberia poner un nombre de indice para cada


campo.

Quisiera saber si puedo poner indices en las Fechas,en


los
campos de Bit, en los campos de texto, incluso tambien en
los campos numericos para agilizar los SUM.

este es el procedure.

Alter Procedure Acumulado_Cv
@Pc char(15)
AS
SELECT C.Id_Chofer,C.Nombre
Chofer,Fleteros.Id_Fletero,Fleteros.Nombre Fletero,isnull
(e.embanques,0) Embanques,ISNULL(en.abonos,0)


Abonos,ISNULL
(ent2.Combustibles,0) Combustibles,
Isnull(f.fletes,0)Fletes
FROM Choferes C

LEFT JOIN
(Select Id_Chofer,Sum(Volumen*.55)Fletes from Fletes


WHERE
No_tarja<>'si' AND Convert(char(1),pagado)=0
GROUP BY Id_Chofer)f
on C.Id_Chofer = f.Id_Chofer

LEFT JOIN (Select Id_Chofer,sum(Volumen*Precio)Embanques
from Embanques
INNER JOIN Parajes ON
Parajes.Id_Paraje=Embanques.Id_Paraje
WHERE Quincena<>'SI' AND Convert(char
(1),Pagado)=0
GROUP BY Id_Chofer)e
ON C.Id_Chofer=e.Id_Chofer

LEFT JOIN
( select Id_Chofer,sum(cantidad)abonos from
Entregas where concepto<>'si' AND Convert(char(1),pagado)


=0
GROUP BY Id_chofer) en
on C.Id_Chofer = en.Id_Chofer

LEFT JOIN
( select Id_chofer, sum(cantidad)combustibles
from Entregas2 where concepto<>'si' AND convert(char
(1),pagado)=0
GROUP By Id_Chofer) ent2
on C.Id_Chofer = ent2.Id_Chofer

INNER JOIN
Fleteros ON C.Id_Fletero=Fleteros.Id_Fletero
WHERE c.id_chofer IN(Select Id_Chofer from Choferes_Rel
WHERE NombrePc=@Pc)

.

Preguntas similares