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

Convertir Select Distinct en Select anidado?

Estas en el tema de Convertir Select Distinct en Select anidado? en el foro de Bases de Datos General en Foros del Web. Hola, tengo una tabla con más de 30.000 registros y me han dicho que los Select Distinct son muy lentos a la hora de arrojar ...
  #1 (permalink)  
Antiguo 12/08/2005, 06:00
 
Fecha de Ingreso: mayo-2005
Mensajes: 31
Antigüedad: 19 años
Puntos: 0
Convertir Select Distinct en Select anidado?

Hola, tengo una tabla con más de 30.000 registros y me han dicho que los Select Distinct son muy lentos a la hora de arrojar resultados. Estoy tratando de convertir un Select Distinct en un Select anidado para mejorar los tiempos de respuesta, pero no doy con ello.

El código original es este:


"SELECT DISTINCT " & _
"Disc_Topics.TopicId, " & _
"Disc_Topics.ForumId, " & _
"Disc_Topics.user_id, " & _
"Disc_Topics.last_user_id, " & _
"Disc_Topics.Icon, " & _
"Disc_Topics.Subject, " & _
"Users.user_name, " & _
"Users2.user_name as lastuser_name, " & _
"Disc_Topics.DateAdded, " & _
"Disc_Topics.Replies, " & _
"Disc_Topics.Views, " & _
"Disc_Topics.Locked, " & _
"Disc_Topics.Sticky, " & _
"Disc_Topics.DateLast FROM (((Disc_Topics LEFT JOIN Users ON Disc_Topics.user_id = Users.user_id) LEFT JOIN Users as Users2 ON Disc_Topics.last_user_id = Users2.user_id) LEFT JOIN Disc_Replies ON Disc_Replies.topicid = Disc_Topics.topicid)" & _
"WHERE Disc_Topics.visible =1 " & _
"ORDER BY Sticky DESC, DateLast DESC"


Y quiero convertirlo en algo parecido a esto:


"SELECT Disc_Topics.TopicId, Disc_Topics.ForumId, Disc_Topics.user_id, Disc_Topics.last_user_id, Disc_Topics.Icon, Disc_Topics.Subject, Disc_Topics.DateAdded, Disc_Topics.Replies, Disc_Topics.Views, Disc_Topics.Locked, Disc_Topics.Sticky, Disc_Topics.DateLast FROM Disc_Topics WHERE EXISTS ( Select user_name FROM Users WHERE Disc_Topics.user_id = Users.user_id) AND (Select user_name as lastuser_name FROM Users as Users2 WHERE Disc_Topics.last_user_id = Users2.user_id) AND (Select * FROM Disc_Replies WHERE Disc_Replies.topicid = Disc_Topics.topicid) AND Disc_Topics.visible =1 ORDER BY Sticky DESC, DateLast DESC"

Pero nada, no consigo que me funcione. Gracias a quien me pueda ayudar.!!
  #2 (permalink)  
Antiguo 12/08/2005, 09:31
 
Fecha de Ingreso: octubre-2004
Ubicación: Monterrey mx
Mensajes: 57
Antigüedad: 19 años, 7 meses
Puntos: 0
es cierto eso de q los select DISTINCT son lentos, pero la opciòn en ese caso es usar la clausula group by en vez de distinct...

la verdad no lei muy bien tu Query pero si x ejemplo tienes:
select distinct customerid from orders

lo converitrias a:
select customerid from orders group by customerid

que da el mismo resultado, pero es mucho mas rapido...
estas querys las puedes comprobar en la base de datos Northiwind (si estas trabajando con SQL server)
  #3 (permalink)  
Antiguo 12/08/2005, 18:38
 
Fecha de Ingreso: mayo-2005
Mensajes: 31
Antigüedad: 19 años
Puntos: 0
Gracias por la respuesta hv16, la he probado pero el resultado en tiempos de entrega de los datos tambien es muy lenta con el Group by. Se que con las consultas anidadas y el Exists se mejoran los tiempos de forma expectacular, pero no tengo experiencia no tengo muy claro como debo de hacerlo...
  #4 (permalink)  
Antiguo 12/08/2005, 22:26
Avatar de haron  
Fecha de Ingreso: febrero-2004
Ubicación: Cádiz (refinitivo)
Mensajes: 632
Antigüedad: 20 años, 2 meses
Puntos: 3
bueno, no se. yo arreglaria un poquito la consulta.

primero, identifica la tabla "principal", aquella de la que "cuelgan" las otras tablas. en este caso parece que "Disc_Topics" es esa tabla.

yo haria lo siguiente:
Código:
select dt.*, u1.user_name, u2.user_name as yoquese
from Disc_Topics dt
left join user as u1 on u1.user_id = dt.user_id
left join user as u2 on u2.user_id = dt.user_id
ademas, en tu primera consulta, creo que sobra la tabla "Disc_Replies", ya que la estas linkando con un "LEFT JOIN", pero no estas mostrando ninguno de sus campos.

luego determina aquellos campos por los cuales quieres agrupar. en el caso anterior, si lo que quieres es sacar un registro por cada registro en "Disc_Topics" no hace falta que agrupes.
__________________
Si ocurre algo importante, estamos afuera fumándonos unos cigarritos.
  #5 (permalink)  
Antiguo 13/08/2005, 03:06
 
Fecha de Ingreso: mayo-2005
Mensajes: 31
Antigüedad: 19 años
Puntos: 0
haron, muy agradecido de verdad, he optimizado la consulta siguiendo tus instrucciones y guia y de momento la aplicación corre bien, la base de datos imprime la información con agilidad (Para ser MySQL y con tablas implicadas que tienen más de 30.000 registros).
Al final ha quedado así, lo cuelgo por si en el futuro le sirve a alguien:

"SELECT " & _
"a.TopicId, " & _
"a.ForumId, " & _
"a.user_id, " & _
"a.last_user_id, " & _
"a.Icon, " & _
"a.Subject, " & _
"a.DateAdded, " & _
"a.Replies, " & _
"a.Views, " & _
"a.Locked, " & _
"a.Sticky, " & _
"b.user_name, " & _
"c.user_name as lastuser_name, " & _
"a.DateLast FROM Disc_Topics a " & _
"LEFT JOIN Users as b ON a.user_id = b.user_id " & _
"LEFT JOIN Users as c ON a.last_user_id = c.user_id " & _
"WHERE a.visible =1 " & _
"ORDER BY Sticky DESC, DateLast DESC"
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 14:25.