La ORDER BYcláusula en la SELECTdeclaració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 INSERT2K filas en la tabla sin una ORDER BYclá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 INSERT2k filas en la tabla con la ORDER BYclá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 INSERTdeclaración sin la ORDER BYcláusula.
Ahora, la Sortoperació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 BYcláusula sigue siendo redundante en ese caso, porque incluso con una operación explícita ORDER BY, no Sortse genera ninguna operación por el procesador de consultas.
Puede optimizar una INSERTdeclaració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 , INSERTes posible que no siempre sea necesario ordenar los ORDER BYmensajes s en una tabla con un índice agrupado ; sin embargo, la cláusula también es redundante en ese caso.