mysql - sqlserver - sql join 3 tables
ANINADO INNER JOIN vs INNER JOIN vs DÓNDE: corrección, rendimiento, claridad para un caso particular(no es un problema típico de JOIN vs WHERE) (3)
¡En Sybase también tendrán el mismo plan de ejecución! El optimizador de consultas es lo suficientemente inteligente como para construir el mismo plan de ejecución para todos ellos :)
Podría cambiar internamente la consulta para seleccionar primero la tabla más pequeña y hacer las uniones internas con esa.
Con respecto al uso de la unión interna o la unión anidada (la última), prefiero la primera. Es más legible tener las uniones internas con las conexiones entre tablas y luego, si es necesario, una cláusula donde con las restricciones (en su ejemplo, no tiene estas restricciones).
Estoy estudiando uniones internas y soy un viejo DÓNDE SQL-92 hombre. Me gustaría saber las implicaciones y entender cómo funciona. Así que esto es solo una pregunta teórica sobre las uniones SQL. Es esto...
SELECT * FROM -- Query 1
tbl1
INNER JOIN (
tbl2
INNER JOIN (
tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1
)
ON tbl2.col1 = tbl3.col2
)
ON tbl1.col1 = tbl3.col3
... lo mismo que esto?
SELECT * FROM -- Query 2
tbl3
INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
... o esto (no ordenado por resolución lógica)?
SELECT * FROM -- Query 3
tbl3
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
..o esto (el nodo de referencia cambió; vea que hay una tabla a la que se hace referencia antes de que se cite, pero el producto cartesiano debería ser el mismo)
SELECT * FROM -- Query 4
tbl4
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1
..¿o esto?
SELECT * FROM -- Query 5
tbl1,tbl2,tbl3,tbl4
WHERE
tbl3.col1 = tbl4.col1
tbl2.col1 = tbl3.col2
tbl1.col1 = tbl3.col3
... desde el punto de vista estético, sintáctico, de mejores prácticas y funcional?
Es una pregunta muy abierta, pero creo que es muy interesante para la comunidad arrojar algo de luz.
Desde el punto de vista de la corrección, son probablemente iguales. Desde el punto de vista del rendimiento, depende del RDBMS (solo puedo hablar para SQL Server, donde todas las variantes producirán el mismo plan de ejecución).
Todos los motores de base de datos con los que he estado trabajando estrechamente (esto es SQL Server
, Oracle
, PostgreSQL
, MySQL
, Sybase
, SQLite
, Informix
y Firebird
) lo optimizarán al mismo plan.
Sin embargo, la cuarta consulta no se analizará en todos los motores (no puede hacer referencia a una tabla en una cláusula ON
antes de haber sido utilizada en una cláusula JOIN
)
MySQL
ofrece una cláusula STRAIGHT_JOIN
que afecta el orden de unión utilizado en el plan.
En Oracle
, hay una sugerencia /*+ ORDERED */
y en SQL Server
hay una sugerencia similar FORCE ORDER
. Si una consulta utiliza estos consejos, la orden de unión también se verá afectada por el orden del plan.