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

Que es mejor??? El JOIN o tablas multiples

Estas en el tema de Que es mejor??? El JOIN o tablas multiples en el foro de Bases de Datos General en Foros del Web. Tengo una duda, tengo que hacer una consulta utilizando varias tablas, y quiero saber cual tiene mejor performance. Una forma de hacerlo es con el ...
  #1 (permalink)  
Antiguo 22/02/2005, 14:34
 
Fecha de Ingreso: febrero-2005
Mensajes: 66
Antigüedad: 19 años, 10 meses
Puntos: 0
Que es mejor??? El JOIN o tablas multiples

Tengo una duda, tengo que hacer una consulta utilizando varias tablas, y quiero saber cual tiene mejor performance.
Una forma de hacerlo es con el JOIN, quedaría así:
SELECT
escritor.nombre, SUM(precio),
SUM(precio)*0.20,
COUNT(*) AS "Cant. libros"
FROM escritor
JOIN poema ON escritor.id_escritor = poema.id_escritor
JOIN poema_libro ON poema.id_poema = poema_libro.id_poema
JOIN libro ON poema_libro.id_libro = libro.id_libro
GROUP BY escritor.id_escritor

La otra forma sería con un WHERE, osea:
SELECT
e.nombre, SUM(precio),
SUM(precio)*0.20,
COUNT(*) AS "Cant. libros"
FROM escritor e, poema p, poema_libro pl, libro l
WHERE
e.id_escritor = p.id_escritor AND
p.id_poema = pl.id_poema AND
pl.id_libro = l.id_libro
GROUP BY e.id_escritor

De la dos formas da los mismos resultados, pero quiero saber que opinan ustedes,cual de las dos es mas rápida, yo diria que el JOIN, porque va filtrando los registros antes hacer el JOIN con la otra tabla pero no estoy seguro. Diganme como es mejor para ustedes????
Es en MySQL
  #2 (permalink)  
Antiguo 22/02/2005, 14:40
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 8 meses
Puntos: 25
Mi conocimiento es principalmente sobre SQL Server, pero creo que este campo aplica en todos los RDBMS.

El JOIN es una solución mas eficiente. Además de que aporta legibilidad a la sentencia.

No conozco en MySQL la manera de hacer trazas de rendimiento, pero en SQL Server el uso de producto cartesiano es un "bad practice", y se soportan unicamente como compatibilidad hacia atrás;no se recomienda su uso en desarrollos nuevos, e incluso es probable que el soporte se elimine en futuras versiones
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 22/02/2005, 14:48
 
Fecha de Ingreso: febrero-2005
Mensajes: 66
Antigüedad: 19 años, 10 meses
Puntos: 0
Yo opino lo mismo, pero quería tener la certeza. Gracias por responder.
Ademas con el JOIN incluso lo podemos utilizar habiendo valores NULL (LEFT JOIN, RIGTH JOIN)
Si alguien mas tienen algo que decir, que no dude.
  #4 (permalink)  
Antiguo 22/02/2005, 14:49
 
Fecha de Ingreso: febrero-2005
Mensajes: 66
Antigüedad: 19 años, 10 meses
Puntos: 0
Era RIGHT JOIN, me confundi.
  #5 (permalink)  
Antiguo 23/02/2005, 02:38
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 5 meses
Puntos: 2
Por lo que yo he leído en la documentación de mysql, le da igual que lo hagas de una manera o de la otra, pues no hace el cruce global de las tablas y después aplica las condiciones del where, sino que va aplicando las condiciones fila a fila.
Esta era la forma habitual de funcionar cuando no se ponían las condicones de cruce de tablas en la sección from de una consulta, y no tiene porque ser diferente. No conozco MsSQL, ahí Mithrandir lo conoce, pero si conozco otros gestores como Informix y Oracle, y a estos les da igual como lo pongas, así "select * from tabla1, tabla2 where tabla1.id=tabla2.id" es equivalente a "select * from tabla1 join tabla2 on tabla1.id=tabla2.id".
Yo he hecho pruebas con MySQL, haciendo el explain de las consultas y el resultado es el mismo en ambas formas de poner la consulta.
Un saludo.
__________________
Estoy contagiado de Generación-I
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 01:10.