A ORDER BY
cláusula na SELECT
declaração é redundante.
É redundante porque as linhas que serão inseridas, se precisarem ser classificadas , são classificadas de qualquer maneira.
Vamos criar um caso de teste.
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;
Vamos ativar a exibição de texto dos planos de consulta reais, para que possamos ver quais tarefas são executadas pelo processador de consultas.
SET STATISTICS PROFILE ON;
GO
Agora, vamos INSERT
2K linhas na tabela sem uma ORDER BY
cláusula.
INSERT INTO #Test
SELECT number
FROM #Sequence
O plano de execução real para esta consulta é o seguinte.
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 você pode ver, há um operador Sort antes que o INSERT real ocorra.
Agora, vamos limpar a tabela e INSERT
2k linhas na tabela com a ORDER BY
cláusula
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
O plano de execução real para esta consulta é o seguinte.
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]))
Observe que é o mesmo plano de execução usado para a INSERT
instrução sem a ORDER BY
cláusula
Agora, a Sort
operação nem sempre é necessária, como Mark Smith mostrou em outra resposta (se o número de linhas a serem inseridas for baixo), mas a ORDER BY
cláusula ainda é redundante nesse caso, porque, mesmo com uma explícita ORDER BY
, nenhuma Sort
operação é gerada pelo processador de consultas.
Você pode otimizar uma INSERT
instrução em uma tabela com um índice clusterizado, usando um registro mínimo INSERT
, mas isso está fora do escopo desta pergunta.
Atualizado em 11/11/2011: como Mark Smith mostrou , os INSERT
s em uma tabela com um índice clusterizado nem sempre precisam ser classificados - a ORDER BY
cláusula também é redundante nesse caso.