Các ORDER BYđiều khoản trong SELECTtuyên bố là dư thừa.
Nó là dư thừa bởi vì các hàng sẽ được chèn, nếu chúng cần được sắp xếp , dù sao cũng được sắp xếp.
Hãy để chúng tôi tạo ra một trường hợp thử nghiệm.
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;
Hãy cho phép hiển thị văn bản của các kế hoạch truy vấn thực tế, vì vậy chúng ta có thể thấy những nhiệm vụ nào được thực hiện bởi bộ xử lý truy vấn.
SET STATISTICS PROFILE ON;
GO
Bây giờ, hãy để INSERT2K hàng vào bảng mà không có ORDER BYmệnh đề.
INSERT INTO #Test
SELECT number
FROM #Sequence
Kế hoạch thực hiện thực tế cho truy vấn này là như sau.
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]))
Như bạn có thể thấy, có một toán tử Sắp xếp trước khi xảy ra INSERT thực tế.
Bây giờ, hãy xóa bảng và INSERT2k hàng vào bảng với ORDER BYmệnh đề.
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
Kế hoạch thực hiện thực tế cho truy vấn này là như sau.
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]))
Lưu ý rằng đó là cùng một kế hoạch thực hiện đã được sử dụng cho INSERTcâu lệnh mà không có ORDER BYmệnh đề.
Bây giờ, Sortthao tác không phải lúc nào cũng được yêu cầu, vì Mark Smith đã chỉ ra trong một câu trả lời khác (nếu số lượng hàng được chèn thấp), nhưng ORDER BYmệnh đề vẫn dư thừa trong trường hợp đó, vì ngay cả với một thao tác rõ ràng ORDER BY, không có Sortthao tác nào được tạo bởi bộ xử lý truy vấn.
Bạn có thể tối ưu hóa một INSERTcâu lệnh thành một bảng với một chỉ mục được nhóm, bằng cách sử dụng một bản ghi tối thiểu INSERT, nhưng điều đó nằm ngoài phạm vi của câu hỏi này.
Cập nhật 2011-11 / 02: Như Mark Smith đã chỉ ra , INSERTs vào một bảng có chỉ mục được nhóm có thể không phải lúc nào cũng cần phải được sắp xếp - ORDER BYmặc dù vậy, mệnh đề cũng không cần thiết trong trường hợp đó.