La ORDER BY
clausola SELECT
nell'istruzione è ridondante.
È ridondante perché le righe che verranno inserite, se devono essere ordinate , vengono comunque ordinate.
Creiamo un caso di prova.
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;
Abilitiamo la visualizzazione del testo dei piani di query effettivi, in modo da poter vedere quali attività vengono eseguite dal processore di query.
SET STATISTICS PROFILE ON;
GO
Ora, INSERT
2K righe nella tabella senza una ORDER BY
clausola.
INSERT INTO #Test
SELECT number
FROM #Sequence
Il piano di esecuzione effettivo per questa query è il seguente.
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]))
Come puoi vedere, c'è un operatore di ordinamento prima che si verifichi l'INSERIMENTO effettivo.
Ora, cancelliamo la tabella e INSERT
2k righe nella tabella con la ORDER BY
clausola.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
Il piano di esecuzione effettivo per questa query è il seguente.
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]))
Si noti che è lo stesso piano di esecuzione utilizzato per l' INSERT
istruzione senza la ORDER BY
clausola.
Ora, l' Sort
operazione non è sempre richiesta, come Mark Smith ha mostrato in un'altra risposta (se il numero di righe da inserire è basso), ma la ORDER BY
clausola è ancora ridondante in quel caso, perché anche con un esplicito ORDER BY
, non Sort
viene generata alcuna operazione dal processore di query.
È possibile ottimizzare INSERT
un'istruzione in una tabella con un indice cluster, utilizzando un registro minimo INSERT
, ma non rientra nell'ambito di questa domanda.
Aggiornato 2011-11-02: Come ha dimostrato Mark Smith , INSERT
s in una tabella con un indice cluster potrebbe non richiedere sempre di essere ordinato ORDER BY
, ma in questo caso la clausola è anche ridondante.