The ORDER BY
klausul dalam SELECT
pernyataan 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 INSERT
baris 2K ke tabel tanpa ORDER BY
klausa.
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 INSERT
baris 2k ke tabel dengan ORDER BY
klausa.
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 INSERT
pernyataan tanpa ORDER BY
klausa.
Sekarang, Sort
operasi tidak selalu diperlukan, seperti yang ditunjukkan Mark Smith dalam jawaban lain (jika jumlah baris yang disisipkan rendah), tetapi ORDER BY
klausa masih berlebihan dalam kasus itu, karena bahkan dengan eksplisit ORDER BY
, bahkan Sort
operasi tidak dihasilkan oleh prosesor kueri.
Anda bisa mengoptimalkan INSERT
pernyataan 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 , INSERT
masuk ke tabel dengan indeks berkerumun mungkin tidak selalu perlu diurutkan - ORDER BY
klausa juga berlebihan dalam kasus itu, meskipun.