SQL - ACELERAR CONSULTAS INNER JOIN

 
Vista:
sin imagen de perfil
Val: 9
Ha disminuido su posición en 11 puestos en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Juan Enrique (5 intervenciones) el 24/08/2018 20:40:57
Generalmente cuando las consultas regresan muchos resultados tardan un buen, en especial cuando se utiliza un inner join
existe una forma en el caso de los inner join con la cual reducir consultas de 1 o 3 minutos a tan solo segundos o menos y es la siguiente


forma usual de una consulta con inner join

FROM ALQUILER, ARTICULOS, CLIENTES
INNER JOIN ARTICULOS ON ALQUILER.IDENTIFICADOR = ARTICULOS.IDENTIFICADOR
INNER JOIN CLIENTES ON ALQUILER.NIF = CLIENTES.NIF


forma eficiente para acortar el tiempo de la consulta

FROM ALQUILER ,ALQUILER,ALQUILER
where (ALQUILER.IDENTIFICADOR = ARTICULOS.IDENTIFICADOR)
and (ALQUILER.NIF = CLIENTES.NIF)

intentenlo, vale la pena y te ahorra tiempo en cuestion de consultas no exagero cuando digo que se nota la velocidad
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Leonardo Josué (1172 intervenciones) el 24/08/2018 23:43:45
Hola Juan Enrique:

Lamentablemente no estoy de acuerdo con lo que comentas: en mi experiencia personal, en la mayoría de los casos es más rápido hacer un INNER JOIN (Si lo planteas correctamente) a listar todas las tablas en el FROM y hacer las uniones de manera implícita. Ojo, estoy aclarando que en la mayoría de los casos, no en todos.

En MySQL esta diferencia no suele ser mucha, pero en Oracle, por ejemplo, logramos bajar los tiempos de algunas consultas que se tardaban horas en ejecutarse a sólo minutos.

Aquí cabe hacer una aclaración con lo que planteas en tu ejemplo:

1
2
3
FROM ALQUILER, ARTICULOS, CLIENTES
INNER JOIN ARTICULOS ON ALQUILER.IDENTIFICADOR = ARTICULOS.IDENTIFICADOR
INNER JOIN CLIENTES ON ALQUILER.NIF = CLIENTES.NIF

Aquí en realidad no tienes necesidad de listar las mismas tablas de artículos y clientes en el FROM, basta con que dejes los JOIN's. No se si esto fue en error de copiar y pegar, si así lo fuere, entonces creo que valdría la pena comentarlo para que otros foristas no se confundan. La forma correcta sería así:

1
2
3
4
5
...
FROM ALQUILER
INNER JOIN ARTICULOS ON ALQUILER.IDENTIFICADOR = ARTICULOS.IDENTIFICADOR
INNER JOIN CLIENTES ON ALQUILER.NIF = CLIENTES.NIF
...

Si dejas la consulta tal como la planteas en el ejemplo, lo que pasa es que se estaría realizando un producto cartesiano entre las tablas y eso sí puede afectar el tiempo de ejecución.

En este mismo sentido, (al menos en MySQL insisto) el rendimiento de una consulta suele verse más afectado por un correcto uso de índices y no sobre el uso de JOINS implícitos o explícitos. Así mismo, hay otros factores que afectan la consulta, como el número de campos, el total de JOINS que haces en la consulta, o si usas técnicas de optimización de consultas o no...

En eso las bases de datos afortunadamente (o desafortunadamente según lo veas) no hay una "mejor" forma de hacer las cosas. Dependerá mucho del escenario que tengas, tu modelo de datos y un largo etc.

Me gustaría que, si es posible, compartieras ejemplos reales de la ejecución de ambos tipos de consulta, así como hacer un EXPLIAN a las mismas, así podríamos debatir más acerca de los resultados que comentas.

Adicionalmente, también habría que mencionar que no sólo existen los INNER JOINS, sino LEFT o RIGTH (cosas que con el FROM-WHERE) no puedes aplicar directamente.

Y finalmente, en lo particular prefiero el uso de JOIN's explícitos simplemente por darle "limpieza" a las consultas, ya que puedes separar las condiciones que sirven para unir tablas de aquellas condiciones que sirven para filtrar datos, es decir, la propia consulta se "autodocumenta", en otras palabras, puedes saber perfectamente qué tablas están relacionadas simplemente fijándote en las cláusulas ON.

Saludos y espero que puedas compartir tus resultados.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 125
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por gilman (46 intervenciones) el 25/08/2018 09:39:25
Sobre el rendimiento, nunca he probado, sería cuestión de hacerlo, pero que no se puede hacer el equivalente a LEFT JOIN y RIGHT JOIN, al menos en oracle no es cierto puedes usar '(+)':

1
2
3
SELECT *
FROM CLIENTES, PEDIDOS
WHERE CLIENTES.IDCLIENTE = PEDIDOS.IDCLIENTE(+)
devolvera todos los clientes enlazados a los pedidos, e incluye todos los clientes incluyendo aquellos que no tengan ningún pedido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido su posición en 11 puestos en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Juan Enrique (5 intervenciones) el 27/08/2018 15:17:36
podrias decirme un ejemplo sobre el equivalente del left y right, el metodo solo lo he usado en los inner
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido su posición en 11 puestos en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Juan Enrique (5 intervenciones) el 27/08/2018 15:19:06
es correcto fue error de copia pega, en cuanto a lo de velocidad es la forma en que trabaja enkontrol, que utiliza mysql, las consultas al generarlas en sql con el openquery, puedo dar constancia de que es mucho mas rapida usando esta forma que usando el inner join
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido su posición en 11 puestos en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Juan Enrique (5 intervenciones) el 27/08/2018 15:32:02
en cuanto a los on que mencionas la forma de saber como están relacionadas es por medio de los and y los () toda tabla que relaciones independientemente del and o el on sigue teniendo el nombre_de_la_tabla.columna si quieres darle un aspecto de limpieza solo separarlos por lineas, no veo mayor dificultad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ACELERAR CONSULTAS INNER JOIN

Publicado por Leonardo Josué (1172 intervenciones) el 27/08/2018 15:45:15
Hola de nuevo:

con respecto al comentario de gilman

1
2
Sobre el rendimiento, nunca he probado, sería cuestión de hacerlo, pero que no se puede hacer el equivalente
a LEFT JOIN y RIGHT JOIN, al menos en oracle no es cierto puedes usar '(+)':

Tienes razón, Oracle te permite usar el operador (+) para poder hacer LEFT o RIGTH JOIN, es por eso que unos párrafos antes menciono que al menos en MySQL el comportamiento no es igual que otros motores de Base de Datos. Gracias por la aclaración.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar