Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   como mejorar esta consulta... (https://www.clubdelphi.com/foros/showthread.php?t=67641)

sizne 27-04-2010 23:10:22

como mejorar esta consulta...
 
Hola...
Les planteo por fa...ayuda...
Estoy trabajando con Tablas de SQL y Delphi.
Código SQL [-]
Select i.IdE,i.CiE,i.NomE,i.ApePE,i.ApeME,i.SexoE,i.FinscripcionE,i.CarreraE,i.DeptoE,
i.CalleE,sum(TotalRecibido) as Monto
From BDinscripcion i INNER JOIN BDbeca b ON i.IdE=b.IdE
Where i.EstadoE='Inactivo'
Group by i.IdE,CiE,NomE,ApePE,ApeME,SexoE,FinscripcionE,CarreraE,DeptoE,CalleE
Order By i.IdE, i.NomE

Por favor ayuda....

Esta es mi consulta como ven, preciso varios datos...y una suma de otro Tabla (Monto) este dato es muy importante.
Estoy extrayendo todos estos datos para que se me visualicen todos en un DBGrid, lo malo como se daran cuenta se hace re lenta... Sino coloco en grupos, pues no se me muestra....y no sé como hacerla para que no sea leeeeeeeenta :o

Y esta otra....muy lenta...Que es para otro Formulario:
Código SQL [-]
Select i.IdM,i.CiE,i.NomE,i.ApePE,i.ApeME,i.SexoE,i.EstadoE,i.FinscripcionE,i.CarreraE,
i.DeptoE,i.CalleE,sum(TotalRecibido) as Monto,p.MontoTD
From BDinscripcion i INNER JOIN BDbeca b ON i.IdE=b.IdE INNER JOIN BDPlanDevolucion p ON i.IdE=p.IdE
Group by i.IdM,CiE,NomE,ApePE,ApeME,SexoE,FinscripcionE,CarreraE,DeptoE,CalleE,EstadoE,MontoTD
Order By i.IdM, i.NomE
Como veran es muy similar a la otra, solo que agrego otra tabla BDPlanDevolucion y de esta obtengo MontoTD (MontoTotalDevolver), q tb es dato importante para realizar otras operaciones... los demas solo preciso para visualizar en otro DBGrid.

Alguna sugerencia?

Gracias!

manuc 28-04-2010 10:28:20

Hola sizne,

Lo primero que tendrías que hacer es revisar los índices de las tablas, que están bien creados y sobre todo aquellos que cumplen función de inter-relación entre tablas.

También puedes plantear la consulta de este modo:

Código SQL [-]
Select i.IdM,i.CiE,i.NomE,i.ApePE,i.ApeME,i.SexoE,i.EstadoE,i.FinscripcionE,i.CarreraE,
i.DeptoE,i.CalleE,
/*consultamos en las tablas relacionadas*/
(SELECT SUM(TotalRecibido) FROM BDbeca B WHERE B.IDE=I.IDE) as Monto,
(SELECT MontoTD FROM BDPlanDevolucion P WHERE P.IDE = I.IDE) AS MontoTD
From BDinscripcion i 
Order By i.IdM, i.NomE

Pero en ambos casos, has de tener presente que los índices en tablas hacen un papel muy importante en estas consultas, sobre todo si el nº de registros en las tablas es elevado.

Esperando que ayude,

Un saludo.

sizne 28-04-2010 20:56:23

Hola manuc, gracias por responder!
Te cuento que usé "vistas" de SQL SERVER 2000
Y este fue el codigo que puse para que me solucione mi programa q se estaba haciendo re lento
Código SQL [-]
SELECT     TOP 100 PERCENT i.IdE, SUM(b.TotalRecibido) AS Monto
FROM         dbo.BDinscripcion i INNER JOIN
                      dbo.BDBeca b ON i.IdE = b.IdE
WHERE     (i.EstadoE = 'Inactivo')
GROUP BY i.IdE
ORDER BY i.IdE
Lo guardé con el nombre de V_PlanDev la vista. Y en Delphi en un Query lo puse:
Código SQL [-]
SELECT *
FROM [dbo].[V_PlanDev] p, BDinscripcion q
Where p.IdE=q.IdE

Y ya no se hizo nada de lento...

Solo que me quedo una dudita, espero puedas aclararme por favor.
En el primer codigo que coloco, automaticamente aparecio o se genero esto
Cita:

TOP 100 PERCENT
Lo eliminé, pero se volvio a generar....No comprendo a que se refiere?

Graaaaaacias!

manuc 29-04-2010 23:27:58

Hola sizne,

Esto te ocurre porque has incluido la clausula order by dentro del código de la vista.

Prueba a quitar el order by de la vista y lo añades al llamar a la vista, desde fuera de la misma.

Creo que quedaría así:

Código Delphi [-]
SELECT    i.IdE, SUM(b.TotalRecibido) AS Monto
FROM         dbo.BDinscripcion i INNER JOIN
                      dbo.BDBeca b ON i.IdE = b.IdE
WHERE     (i.EstadoE = 'Inactivo')
GROUP BY i.IdE

Código Delphi [-]
SELECT *
FROM [dbo].[V_PlanDev] p, BDinscripcion q
Where p.IdE=q.IdE
ORDER BY p.IdE
Un saludo.

sizne 30-04-2010 21:17:57

Hola manuc
Tienes tooooda la razón es lo que fue...ahora ya no aparece ese codigo que se generaba automaticamente.

Graaaaaaaacias :p

Saludos!


La franja horaria es GMT +2. Ahora son las 14:40:55.

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