Các ORDER BY
điều khoản trong SELECT
tuyê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 để INSERT
2K hàng vào bảng mà không có ORDER BY
mệ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à INSERT
2k hàng vào bảng với ORDER BY
mệ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 INSERT
câu lệnh mà không có ORDER BY
mệnh đề.
Bây giờ, Sort
thao 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 BY
mệ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ó Sort
thao 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 INSERT
câ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 , INSERT
s 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 BY
mặc dù vậy, mệnh đề cũng không cần thiết trong trường hợp đó.