Trong các truy vấn bên dưới, cả hai kế hoạch thực hiện được ước tính để thực hiện 1.000 lần tìm kiếm trên một chỉ mục duy nhất.
Các tìm kiếm được điều khiển bởi một lần quét theo thứ tự trên cùng một bảng nguồn, vì vậy dường như cuối cùng sẽ tìm kiếm các giá trị tương tự theo cùng một thứ tự.
Cả hai vòng lặp lồng nhau có <NestedLoops Optimized="false" WithOrderedPrefetch="true">
Bất cứ ai cũng biết tại sao nhiệm vụ này có giá 0,172434 trong kế hoạch đầu tiên nhưng 3,01702 trong lần thứ hai?
. .)
Thiết lập
CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL);
CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL);
INSERT INTO dbo.Target
SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32)
FROM master..spt_values v1,
master..spt_values v2;
INSERT INTO dbo.Staging
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32)
FROM master..spt_values v1;
Truy vấn 1 liên kết "Dán kế hoạch"
WITH T
AS (SELECT *
FROM Target AS T
WHERE T.KeyCol IN (SELECT S.KeyCol
FROM Staging AS S))
MERGE T
USING Staging S
ON ( T.KeyCol = S.KeyCol )
WHEN NOT MATCHED THEN
INSERT ( KeyCol, OtherCol )
VALUES(S.KeyCol, S.OtherCol )
WHEN MATCHED AND T.OtherCol > S.OtherCol THEN
UPDATE SET T.OtherCol = S.OtherCol;
Truy vấn 2 liên kết "Dán kế hoạch"
MERGE Target T
USING Staging S
ON ( T.KeyCol = S.KeyCol )
WHEN NOT MATCHED THEN
INSERT ( KeyCol, OtherCol )
VALUES( S.KeyCol, S.OtherCol )
WHEN MATCHED AND T.OtherCol > S.OtherCol THEN
UPDATE SET T.OtherCol = S.OtherCol;
Truy vấn 1
Truy vấn 2
Những điều trên đã được thử nghiệm trên SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
@Joe Obbish chỉ ra trong các ý kiến rằng một repro đơn giản hơn sẽ là
SELECT *
FROM staging AS S
LEFT OUTER JOIN Target AS T
ON T.KeyCol = S.KeyCol;
đấu với
SELECT *
FROM staging AS S
LEFT OUTER JOIN (SELECT * FROM Target) AS T
ON T.KeyCol = S.KeyCol;
Đối với bảng phân tầng 1.000 hàng, cả hai bảng trên vẫn có hình dạng kế hoạch giống nhau với các vòng lặp lồng nhau và kế hoạch không có bảng dẫn xuất hiện rẻ hơn, nhưng đối với bảng phân tầng 10.000 và cùng bảng mục tiêu như trên, sự khác biệt về chi phí sẽ thay đổi kế hoạch hình dạng (với một lần quét toàn bộ và kết hợp tham gia có vẻ tương đối hấp dẫn hơn so với các tìm kiếm tốn kém chi phí) cho thấy sự khác biệt về chi phí này có thể có ý nghĩa khác ngoài việc làm cho việc so sánh các kế hoạch trở nên khó khăn hơn.