En SQL Server, existen tres tipos de operaciones de unión: uniones de bucle anidado, uniones de combinación y uniones de hash. En este artículo, nos centraremos en las uniones de combinación y discutiremos cuándo SQL Server elige este tipo de operación de unión.
La unión de combinación se considera uno de los métodos más efectivos para unir tablas. Se utiliza cuando ambas entradas están ordenadas en las columnas de combinación. El mejor escenario para una unión de combinación es cuando ambas tablas tienen un índice agrupado en la columna que las une. Esto permite a SQL Server escanear solo n1 + n2 filas para devolver el conjunto de resultados, donde n1 es el número de filas en la Tabla1 y n2 es el número de filas en la Tabla2.
Consideremos un ejemplo. Supongamos que tenemos dos tablas, Tabla1 y Tabla2, y no hay un índice en la columna que une estas tablas. En el peor de los casos, con una unión de bucle anidado, SQL Server escaneará n1 * n2 filas para devolver el conjunto de resultados. Esto significa que para cada fila de la tabla externa, se escaneará completamente la tabla interna. Sin embargo, en el mejor de los casos, si ambas tablas tienen un índice agrupado en la columna de unión y hay una relación de uno a muchos entre Tabla1 y Tabla2, se utilizará una unión de combinación y SQL Server solo necesitará escanear n1 + n2 filas para devolver el conjunto de resultados.
Aquí hay un ejemplo de código para demostrar el uso de una unión de combinación:
CREATE TABLE Tabla1 (
Tabla1_id int primary key CLUSTERED,
nombre char(10)
)
CREATE TABLE Tabla2 (
Tabla2_id int primary key NONCLUSTERED,
Tabla1_id int,
nombre char(10)
)
CREATE CLUSTERED INDEX indTabla2 ON Tabla2 (Tabla1_id)
DECLARE @i int
SELECT @i = 1
WHILE @i < 1000
BEGIN
INSERT INTO Tabla1 VALUES (@i, LTRIM(str(@i)))
SELECT @i = @i + 1
END
DECLARE @i int
SELECT @i = 1
WHILE @i < 1000
BEGIN
INSERT INTO Tabla2 VALUES (@i, @i, LTRIM(str(@i)))
SELECT @i = @i + 1
END
SET SHOWPLAN_TEXT ON
SELECT a.Tabla1_id, b.Tabla1_id
FROM Tabla1 a
INNER JOIN Tabla2 b ON a.Tabla1_id = b.Tabla1_id
SET SHOWPLAN_TEXT OFF
El código anterior mostrará el plan de ejecución, que mostrará que se está utilizando una unión de combinación.
Es importante tener en cuenta que si las tablas unidas son pequeñas (contienen solo una página de datos, por ejemplo) y al menos una de las tablas unidas tiene un índice en la columna de unión, SQL Server utilizará una unión de bucle anidado en lugar de una unión de combinación o una unión de hash. El optimizador de consultas generalmente selecciona el mejor plan de ejecución para una determinada instrucción SELECT, por lo que no es necesario cambiar el tipo de unión. Sin embargo, en algunos casos, puede ser útil forzar un tipo de unión específico utilizando la cláusula OPTION.
Aquí hay un ejemplo para forzar una unión de combinación:
USE pubs
SET SHOWPLAN_TEXT ON
SELECT a.au_id
FROM authors a
JOIN titleauthor b ON a.au_id = b.au_id
OPTION (MERGE JOIN)
SET SHOWPLAN_TEXT OFF
El código anterior mostrará el plan de ejecución, que mostrará que se está utilizando una unión de combinación.
Comprender las diferentes operaciones de unión en SQL Server, como las uniones de combinación, puede ayudar a optimizar el rendimiento de las consultas y mejorar la eficiencia general de la base de datos. Al aprovechar el tipo de unión adecuado y garantizar una indexación adecuada, puede mejorar significativamente la velocidad y eficiencia de sus consultas de SQL Server.
Gracias por leer este artículo. ¡Estén atentos para más consejos y trucos de SQL Server!