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

Ayuda con optimizacion de consulta

Estas en el tema de Ayuda con optimizacion de consulta en el foro de SQL Server en Foros del Web. Tengo una tabla de usuarios, donde cada usuario esta relacionado a un usuario de la misma tabla (campo llamado idpadre) De modo que se puede ...
  #1 (permalink)  
Antiguo 05/07/2010, 12:32
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 1 mes
Puntos: 0
Ayuda con optimizacion de consulta

Tengo una tabla de usuarios, donde cada usuario esta relacionado a un usuario de la misma tabla (campo llamado idpadre)

De modo que se puede dar la siguiente Jerarquia:

-Administrador
-Supervisor
-Gerente
-Coordinador
-Asesor

Cada usuario tiene su propios registros capturados (en mi sistema son prospectos)

Tengo una consulta para sacar todos los prospectos de un usuario, y de todos sus subordinados. Es decir, yo Gerente veo todos mis registros, junto con los de mis Coordinadores asignados, junto con los de los Asesores asignados a mis Cordinadores....

La manera en que la tengo funciona, y sin problemas, solo que digamos tengo poco en sql y la manera en que la tengo se que no es la mas optima, ya que utilizo muchos select (como 11....) y tengo entendido que eso no es bueno....

Mi consulta es mas o menos la siguiente:
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[spObtenerProspectos]
  2. @IDUSUARIO          NUMERIC(18,0)
  3. AS
  4.  
  5. SELECT IDPROSPECTO
  6.  FROM prospectosnew
  7.  
  8.  WHERE PROSPECTOSNEW.IDUSUARIO IN (SELECT IDUSUARIO FROM USUARIOSNEW WHERE USUARIOSNEW.idpadre=@IDUSUARIO )
  9.                         OR PROSPECTOSNEW.IDUSUARIO IN (SELECT idUsuario FROM USUARIOSNEW
  10.                         WHERE IDPADRE IN ( SELECT idUsuario FROM usuariosnew WHERE idpadre=@IDUSUARIO))
  11.                         OR PROSPECTOSNEW.IDUSUARIO IN (SELECT idUsuario FROM USUARIOSNEW
  12.                         WHERE IDPADRE IN ( SELECT idUsuario FROM usuariosnew WHERE idpadre IN (SELECT IDUSUARIO FROM USUARIOSNEW WHERE USUARIOSNEW.idpadre=@IDUSUARIO)))
  13.                         OR PROSPECTOSNEW.IDUSUARIO IN (SELECT idUsuario FROM USUARIOSNEW
  14.                         WHERE IDPADRE IN ( SELECT idUsuario FROM usuariosnew WHERE idpadre IN (SELECT IDUSUARIO FROM USUARIOSNEW WHERE USUARIOSNEW.idpadre IN (SELECT IDUSUARIO FROM USUARIOSNEW WHERE USUARIOSNEW.idpadre=@IDUSUARIO))))
  15.                         OR PROSPECTOSNEW.IDUSUARIO=@IDUSUARIO

Mi tabla de usuarios no tiene mas de 100 registros

y la tabla de prospectos estamos hablando que pueden ser 10mil, 20mil, 30mil registros...

alguna manera en que pueda evitarme el uso de tantos select y optimizar mi consulta????
  #2 (permalink)  
Antiguo 05/07/2010, 15:12
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con optimizacion de consulta

En primer lugar, tu procedimiento debe llamarse ObtenerProspectos segun las buenas practicas de SQL.
Segundo, explica que debe hacer tu PA porque esta raro.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 05/07/2010, 15:25
Avatar de -rommel_  
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 360
Antigüedad: 15 años, 11 meses
Puntos: 1
Respuesta: Ayuda con optimizacion de consulta

yo me imagino que es un Reporte parecido a la tabla de "Maestro de Cuentas Contables", cada cuenta con su Cuenta Padre, y su cuenta hijo... algo asi necesitas? davicomeh?
  #4 (permalink)  
Antiguo 06/07/2010, 07:33
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ayuda con optimizacion de consulta

Primero que nada muchas gracias por responder.
Tomare en cuenta lo de la nomenclatura de los SP

Quizas poniendo las 2 tablas ayudaria a explicarme mejor

USUARIOS
| idUsuario | idPadre |

PROSPECTOS
| idProspecto | idUsuario |

Las relaciones seria idPadre a idUsuario de la misma tabla de Usuarios
y idusuario de Prospectos con idUsuario de Usuarios

De modo que cada prospecto tiene un idUsuario que corresponde al usuario que lo agrego

En la consulta que tengo (mal hecha y por lo visto inentendible) lo que hago es lo siguiente:

Sacar todos los usuarios que este debajo de 1 usuario espesifico, es decir, los hijos, los hijos de los hijos, los hijos de los hijos de los hijos, etc, etc. Para poder ver todos los prospectos de ese usuario y los prospectos de sus subordinados.

Es decir, yo Gerente, puedo ver mis prospectos, mas ademas los prospectos de mis Coordinadores, mas aparte los prospectos de los Asesores de mis Cordinadores. Y se aplicaria misma logica para administrador, supervisor, etc.

Espero haberme dado a entender ahora si =S
  #5 (permalink)  
Antiguo 06/07/2010, 09:41
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con optimizacion de consulta

Prueba asi:
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[ObtenerProspectos]
  2. @IDUSUARIO          NUMERIC(18,0)
  3. AS
  4.  
  5. SELECT IDPROSPECTO
  6. FROM prospectosnew P
  7. LEFT JOIN USUARIOSNEW H1 ON P.idUsuario = H1.idUsuario
  8. LEFT JOIN USUARIOSNEW H2 ON H1.idPadre = H2.idUsuario
  9. LEFT JOIN USUARIOSNEW H3 ON H2.idPadre = H3.idUsuario
  10. LEFT JOIN USUARIOSNEW H4 ON H3.idPadre = H4.idUsuario
  11. LEFT JOIN USUARIOSNEW H5 ON H4.idPadre = H5.idUsuario
  12. WHERE H1.idUsuario = @IDUSUARIO
  13. OR H2.idUsuario = @IDUSUARIO
  14. OR H3.idUsuario = @IDUSUARIO
  15. OR H4.idUsuario = @IDUSUARIO
  16. OR H5.idUsuario = @IDUSUARIO
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 06/07/2010, 11:30
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ayuda con optimizacion de consulta

MUCHISIMAS GRACIAS flaviovich, la verdad es que asi queria hacerlo, pero no sabia como hacer joins a una misma tabla, tardé en responder por que estaba probando la consulta, haciendo comparaciones entre resultados con la anterior query, y funciono perfecto.

Dejo la consulta completa (que basicamente seria la misma que me pusiste), por si alguien quiere aplacar su curiosidad de para que fin quiero la query hehe

Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[spObtenerProspectos]
  2. @IDUSUARIO          NUMERIC(18,0)
  3. AS
  4.  
  5. SELECT P.FECHAALTA, P.IDPROSPECTO,(P.NOMBRES + ' ' + P.PATERNO + ' ' + P.MATERNO) AS PROSPECTO,
  6.     CAMPUS.CAMPUS,(PERSONALNEW.NOMBRES  + ' ' +  PERSONALNEW.PATERNO + ' ' + PERSONALNEW.MATERNO) AS ASESOR,
  7.     P.IDUSUARIO, P.IDCAMPUS, P.IDESCUELA, P.IDNEGOCIO, P.IDCOLONIA, P.TELEFONO1
  8. FROM prospectosnew P
  9. INNER JOIN CAMPUS ON P.IDCAMPUS=CAMPUS.IDCAMPUS
  10. LEFT JOIN USUARIOSNEW H1 ON P.idUsuario = H1.idusuario
  11. LEFT JOIN USUARIOSNEW H2 ON H1.idPadre = H2.idUsuario
  12. LEFT JOIN USUARIOSNEW H3 ON H2.idPadre = H3.idUsuario
  13. LEFT JOIN USUARIOSNEW H4 ON H3.idPadre = H4.idUsuario
  14. LEFT JOIN USUARIOSNEW H5 ON H4.idPadre = H5.idUsuario
  15. INNER JOIN PERSONALNEW ON H1.IDPERSONAL=PERSONALNEW.IDPERSONAL
  16. WHERE H1.idUsuario = @IDUSUARIO
  17. OR H2.idUsuario = @IDUSUARIO
  18. OR H3.idUsuario = @IDUSUARIO
  19. OR H4.idUsuario = @IDUSUARIO
  20. OR H5.idUsuario = @IDUSUARIO
  21. ORDER BY P.FECHAALTA DESC
saludos y muchas gracias de nuevo!
muchas dudas que he tenido, he visto que tu las aclaras en los diferentes temas que hay en el foro
  #7 (permalink)  
Antiguo 06/07/2010, 12:00
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con optimizacion de consulta

Ese es el objetivo: ayudar y aprender.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.

Etiquetas: Ninguno
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 07:03.