La ORDER BY
cláusula en la SELECT
declaración es redundante.
Es redundante porque las filas que se insertarán, si es necesario ordenarlas , se ordenan de todos modos.
Vamos a crear un caso de prueba.
CREATE TABLE #Test (
id INTEGER NOT NULL
);
CREATE UNIQUE CLUSTERED INDEX CL_Test_ID ON #Test (id);
CREATE TABLE #Sequence (
number INTEGER NOT NULL
);
INSERT INTO #Sequence
SELECT number FROM master..spt_values WHERE name IS NULL;
Habilitemos la visualización de texto de los planes de consulta reales, para que podamos ver qué tareas lleva a cabo el procesador de consultas.
SET STATISTICS PROFILE ON;
GO
Ahora, vamos a INSERT
2K filas en la tabla sin una ORDER BY
cláusula.
INSERT INTO #Test
SELECT number
FROM #Sequence
El plan de ejecución real para esta consulta es el siguiente.
INSERT INTO #Test SELECT number FROM #Sequence
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
Como puede ver, hay un operador Ordenar antes de que ocurra el INSERT real.
Ahora, limpiemos la tabla y INSERT
2k filas en la tabla con la ORDER BY
cláusula.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
El plan de ejecución real para esta consulta es el siguiente.
INSERT INTO #Test SELECT number FROM #Sequence ORDER BY number
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
Tenga en cuenta que es el mismo plan de ejecución que se utilizó para la INSERT
declaración sin la ORDER BY
cláusula.
Ahora, la Sort
operación no siempre es necesaria, como Mark Smith ha mostrado en otra respuesta (si el número de filas a insertar es bajo), pero la ORDER BY
cláusula sigue siendo redundante en ese caso, porque incluso con una operación explícita ORDER BY
, no Sort
se genera ninguna operación por el procesador de consultas.
Puede optimizar una INSERT
declaración en una tabla con un índice agrupado, utilizando un registro mínimo INSERT
, pero eso está fuera del alcance de esta pregunta.
Actualizado el 2011-11-02: Como Mark Smith ha demostrado , INSERT
es posible que no siempre sea necesario ordenar los ORDER BY
mensajes s en una tabla con un índice agrupado ; sin embargo, la cláusula también es redundante en ese caso.