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

Optimizacion de una Consulta

Estas en el tema de Optimizacion de una Consulta en el foro de SQL Server en Foros del Web. Tengo que realizar un informe, en que la información esta almacenada en varias tablas, en este caso en 3, Usuario, Usr_Cnt., Cuentas El resultado del ...
  #1 (permalink)  
Antiguo 28/10/2005, 05:36
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 0
Optimizacion de una Consulta

Tengo que realizar un informe, en que la información esta almacenada en varias tablas, en este caso en 3, Usuario, Usr_Cnt., Cuentas
El resultado del informe deberia ser el siguente

Mostrar un listado de los usuarios con las Cuentas que posee
Algo parecido a esto:

Paco - BBV
Paco - Banesto
Paco - Bancaja
Luis - Bancaja
Andres - BBV
Andres - CAM
Juan -Cam
Juan -BBV
Juan -Bancaja

Realizar una consulta que me devuelta estos datos, en sencillo, de echo, no es el problema, lo que quiero es q no aparezcan los nombre de los usuarios repetidos, y es lo que no se hacer, o mejor dicho, no se si se puede hacer con una solo consulta.
Para que muestre algo parecido a lo siguiente:
Paco -BBV
-Banesto
-Bancaja

Luis -Bancaja

Andres -BBV
-CAM

Juan -Cam
-BBV
-Bancaja

Una posible solución, la he encontrado haciendo 2 consultas, y realizando 2 bucles, la primera consulta recorre la tabla de Usuarios, y la segunda consulta, recorre las tabla de Usr_Cnt., Cuentas, con el indice del Usuario, para buscar coincidencias: el codigo seria algo parecido a esto


SQLUsuarios= "SELECT * FROM Usuario"
Set bd = bdconn.Execute(SQLUsuarios)
while (not bd.eof)
tmp_ IdUsuario =bd("IdUsuario ")
Response.write bdCuentas(“NombreUsuario”)

SqlCuentas = "SELECT * FROM Cuentas, Usr_Cnt WHERE Cuentas.IdCuenta= Usr_Cnt. IdCuenta AND Usr_Cnt. IdUsuario="&tmp_ IdUsuario &"
Set bdCuentas = bdconn.Execute(SqlCuentas)

while (not bdCuentas.eof)
Response.write bdCuentas(“NombreCuentas”)
Response.write “<br>”
bdCuentas.MoveNext()
wend


bd.MoveNext()
wend



La pregunta, despues de todo este rollo, es??

Como optimizar este informe???? Suponiendo, que el numero de Usuarios es muy alto, 5000, y en numero de cuentas alrededor de 1000, el coste de este algoritmo es altissimo!!,
__________________
Salut i Força al Canut

Última edición por algicor; 28/10/2005 a las 06:03
  #2 (permalink)  
Antiguo 28/10/2005, 08:37
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
que herramientas de programacion estas utilizando?


VB ? VB.NET ? C# ?

has probado con XSLT ?
  #3 (permalink)  
Antiguo 28/10/2005, 09:11
Avatar de JoseGCB  
Fecha de Ingreso: noviembre-2004
Ubicación: Caracas Venezuela
Mensajes: 91
Antigüedad: 19 años, 6 meses
Puntos: 0
prueba con esto
Código:
Sql = "SELECT    Usuario,idUs, usuario.nombreUsuario, Banco.NombreBanco
FROM         usuario INNER JOIN
                      CuentaUsu ON usuario.IdUs = CuentaUsu.IdUsu INNER JOIN
                      Banco ON CuentaUsu.Idbanco = Banco.IdCuenta
ORDER BY usuario.usuario

Set bd = bdconn.Execute(SQL) 
If Not bd.eof then
   tmp_ IdUsuario =bd("IdUsuario ")
   response.write (bb("NombreUsuario"))
else
   response.write(Mensaje_de_Error)
end if
while (not bd.eof) 
   if  tmp_IdUsuario = bd("IdUsuario") then
      response.write(bd("NombreBanco") & "<BR>" )
      bd.movenext
   else
      tmp_ IdUsuario =bd("IdUsuario ")
      response.write (bb("NombreUsuario"))
  end if
wend
Prueba a ver si te sirve si hay un error me disculpo pero esta es la idea
ya qye haces una sola consulta para todo el reporte y no una consulta por cada usuario

Saludos
  #4 (permalink)  
Antiguo 28/10/2005, 09:18
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 0
En respuesta a Andres95, la base de datos esta en SQL SERVER, y el lenguaje con el que le atako es ASP
__________________
Salut i Força al Canut
  #5 (permalink)  
Antiguo 30/10/2005, 15:22
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 0
Gracias JoseGCB.
Por el momento tu solucion es la mas optima que he encontrado, los tiempos de ejecucion han bajado considerablemente, gracias de nuevo.
No se si habra alguna otra solucion mejor, o esta es la mas optima, pero seguire investigando....


Un saludo
__________________
Salut i Força al Canut
  #6 (permalink)  
Antiguo 01/11/2005, 16:27
 
Fecha de Ingreso: enero-2004
Mensajes: 310
Antigüedad: 20 años, 4 meses
Puntos: 0
Si las tablas de la select son atacadas con concurrencia le añadería el With(NoLock) para que no hayan bloqueos:

Sql = "SELECT Usuario,idUs, usuario.nombreUsuario, Banco.NombreBanco
FROM usuario
With(NoLock)
INNER JOIN
CuentaUsu With(NoLock) ON usuario.IdUs = CuentaUsu.IdUsu INNER JOIN
Banco With(NoLock) ON CuentaUsu.Idbanco = Banco.IdCuenta
ORDER BY usuario.usuario
__________________
Un saludo,
Trucos
Videos
  #7 (permalink)  
Antiguo 01/11/2005, 16:58
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 0
No entiendo muy bien, tu solucion, pero la estudiare con calma....
De todas modos, si me la puedes comentar, lo agradeceria...


Gracias
__________________
Salut i Força al Canut
  #8 (permalink)  
Antiguo 02/11/2005, 02:03
 
Fecha de Ingreso: enero-2004
Mensajes: 310
Antigüedad: 20 años, 4 meses
Puntos: 0
Mirate esto:

http://msdn.microsoft.com/library/de...on_7a_1hf7.asp
__________________
Un saludo,
Trucos
Videos
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 19:08.