sql - inner - ¿NATURAL JOIN es mejor que SELECT FROM WHERE en términos de rendimiento?
query builder laravel (5)
No usaría ninguna de las dos sintaxis. Su consulta indica una unión interna, yo usaría la sintaxis explícita para eso. No deberías estar usando uniones implícitas nunca, están sujetas a interpretaciones erróneas (¿fue una combinación cruzada accidental o quisiste hacerlo?) Y uniones cruzadas accidentales. ¿Usarías el código C # que fue reemplazado 18 años atrás con una mejor sintaxis (bueno, realmente C # no existía hace 18 años, pero creo que entiendes lo que estoy diciendo)? Entonces, ¿por qué estás usando código SQL obsoleto?
No solo se trata de un problema implícito para el mantenimiento, sino que puede ser un gran problema si intenta utilizar la sintaxis implícita de unión para las uniones externas, ya que no funciona correctamente en algunas bases de datos y también está obsoleto en al menos una base de datos, SQL Server , Lo sé. Y si tiene la necesidad de un filtro en la tabla de la combinación de la izquierda, no puede hacer eso con la sintaxis implícita, ya que lo convertirá en una unión innner.
Sí, su código funciona, pero es una técnica deficiente y debe acostumbrarse a usar la combinación interna de forma explícita, de modo que está haciendo que su intención sea clara para fomentar los mantenedores y para que no cree problemas accidentales a medida que escribe consultas más complejas. Si usar la sintaxis explícita no es una segunda naturaleza para ti, realmente tendrás dificultades cuando necesites usar algo complicado.
Nunca en 30 años de consulta de bases de datos he visto la necesidad de escribir una unión natural y tuve que buscar cuál era, así que usar eso no es más claro que la combinación implícita.
Posible duplicado:
Unión interna vs Dónde
Hoy comencé un debate con mi jefe de proyecto sobre productos cartesianos. Él dice que una ''unión natural'' es de alguna manera mucho mejor que usar ''seleccionar desde donde'' porque más tarde causa que el motor de DB ejecute internamente un producto cartesiano, pero el primero usa otro enfoque que evita esto. Por lo que yo sé, la sintaxis de unión natural no es diferente en modo alguno que "seleccionar desde donde" en términos de rendimiento o significado, quiero decir que puede usar cualquiera según su gusto.
SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2
por favor elabore sobre la primera consulta que causa un producto cartesiano pero el segundo es de alguna manera más inteligente
Depende.
Una unión natural vincula todas las columnas en dos tablas con el mismo nombre. Si las dos únicas columnas en las tablas 1 y 2 con el mismo nombre son ID, entonces las dos consultas deberían ser evaluadas de manera idéntica por el optimizador; por otro lado, si hay más de dos columnas con el mismo nombre (o ninguna) en las dos tablas, se está realizando una consulta completamente diferente.
En cualquier caso, un producto cartesiano casi invariablemente (estoy tentado de decir siempre) rinde peor que cualquier otro tipo de unión, ya que une cada registro de una tabla con cada registro de la otra tabla.
¿Qué tan bueno es su gerente para distinguir su glúteo mayor del extremo superior de su cúbito?
En cuanto a rendimiento, no hay diferencia. Se ha discutido una y otra vez. Buscar en Google para "unir oraciones de sintaxis contra dónde" da como resultado varios artículos buenos, incluido el de este sitio al que hace referencia Alexander.
Sin embargo, tenga cuidado al usar una UNIÓN NATURAL. Se retomará en columnas comunes como createdate o createuser o de manera que normalmente no te importa unirte y puede causar problemas. Lo recomiendo encarecidamente contra NATURAL JOIN en producción ... solo use INNER JOIN y especifique las columnas.
Incluso Tom está de acuerdo .
Lo primero que hay que señalar es que los optimizadores de bases de datos interpretan la sintaxis a su manera. Obviamente, cada producto varía, pero estaría francamente asombrado si algún DBMS penalizara cuál es el mecanismo más común para unir mesas.
Con respecto a la terminología, es una combinación cruzada que genera un producto cartesiano. Eso es diferente de una unión interna, y generaría un conjunto de resultados diferente.
Finalmente, las uniones naturales son horribles, literalmente errores esperando a suceder. Deben ser evitados por todas las personas que piensan bien.
La forma correcta debe ser explícita con filtros y uniones separadas
SELECT * FROM table1 JOIN table2 ON table1.id = table2.id
NATURAL JOINS puede ser fácil y "limpio", pero es más probable que sea completamente impredecible ...
Editar, mayo de 2012.
La respuesta aceptada para el duplicado no responde NATURAL JOIN.
Estos enlaces se discuten en mayor detalle.
- https://dba.stackexchange.com/a/6917/630 (DBA.SE)
- Unión natural en SQL Server
- SQL Server - falta de NATURAL JOIN / x JOIN y USING (campo)
- SQL JOIN: ¿hay alguna diferencia entre USING, ON o WHERE?
tl; dr
El rendimiento no es el problema: pero sus consultas deben ser confiables y predecibles, lo que NATURAL JOIN ciertamente no es.
"ÚNASE en el DÓNDE" también conocido como JOIN implícito, también conocido como "Cartesian", también es malo según estos enlaces (lo mismo se aplica a Oracle y SQL Server)