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)

Preguntas similare

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)

.

Respuesta Responder a este mensaje
#2 Manolo Zepeda
29/05/2004 - 03:57 | Informe spam
Hola Ulises.!!

Gracias por tu atencion.

La situacion de los WHERE es que necesariamente tengo que
buscar por una condicion diferente de 'SI' lo demas son
miles de codigos diferentes, entonces no se de que forma
cambiarlo para buscar, ahora los convert me los pide por
fuerza porque son campos bit y al momento de agrupar me
manda un mensaje de que no se puede agrupar por esos
campos.

Que me recomiendas hacer?

Podria indexar por campos de texto, por ej. en esos donde
tengo el WHERE No_Tarja(Campo Char)<>'SI'...
WHERE Quincena(Campo Char)<>'SI.
O de alguna manera indexar tambien por campos de cantidad
y volumen que son campos numericos.

Saludos

Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida