The ORDER BYklausul dalam SELECTpernyataan berlebihan.
Itu berlebihan karena baris yang akan dimasukkan, jika perlu diurutkan , tetap diurutkan.
Mari kita buat test case.
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;
Mari kita aktifkan tampilan teks dari rencana kueri yang sebenarnya, sehingga kita dapat melihat tugas apa yang dilakukan oleh prosesor kueri.
SET STATISTICS PROFILE ON;
GO
Sekarang, mari kita INSERTbaris 2K ke tabel tanpa ORDER BYklausa.
INSERT INTO #Test
SELECT number
FROM #Sequence
Paket eksekusi aktual untuk permintaan ini adalah sebagai berikut.
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]))
Seperti yang Anda lihat, ada operator Sortir sebelum INSERT yang sebenarnya terjadi.
Sekarang, mari kita hapus tabel, dan INSERTbaris 2k ke tabel dengan ORDER BYklausa.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
Paket eksekusi aktual untuk permintaan ini adalah sebagai berikut.
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]))
Perhatikan bahwa itu adalah rencana eksekusi yang sama yang digunakan untuk INSERTpernyataan tanpa ORDER BYklausa.
Sekarang, Sortoperasi tidak selalu diperlukan, seperti yang ditunjukkan Mark Smith dalam jawaban lain (jika jumlah baris yang disisipkan rendah), tetapi ORDER BYklausa masih berlebihan dalam kasus itu, karena bahkan dengan eksplisit ORDER BY, bahkan Sortoperasi tidak dihasilkan oleh prosesor kueri.
Anda bisa mengoptimalkan INSERTpernyataan ke dalam tabel dengan indeks berkerumun, dengan menggunakan log minimal INSERT, tapi itu di luar cakupan untuk pertanyaan ini.
Diperbarui 2011-11-02: Seperti yang ditunjukkan oleh Mark Smith , INSERTmasuk ke tabel dengan indeks berkerumun mungkin tidak selalu perlu diurutkan - ORDER BYklausa juga berlebihan dalam kasus itu, meskipun.