ในแบบสอบถามด้านล่างแผนการดำเนินการทั้งคู่คาดว่าจะทำการค้นหา 1,000 ครั้งในดัชนีที่ไม่ซ้ำกัน
การค้นหาถูกขับเคลื่อนโดยการสแกนที่สั่งในตารางแหล่งเดียวกันดังนั้นดูเหมือนว่าควรจะจบลงด้วยการค้นหาค่าเดียวกันในลำดับเดียวกัน
ทั้งลูปซ้อนกันมี <NestedLoops Optimized="false" WithOrderedPrefetch="true">
ใครรู้ว่าทำไมงานนี้มีราคาอยู่ที่ 0.172434 ในแผนแรก แต่ 3.01702 ต่อวินาที
(เหตุผลของคำถามคือคำถามแรกที่เสนอให้ฉันเป็นการเพิ่มประสิทธิภาพเนื่องจากราคาแผนต่ำกว่ามากจริง ๆ แล้วดูเหมือนว่าฉันจะทำงานได้มากกว่า แต่ฉันพยายามอธิบายความแตกต่าง .. .)
ติดตั้ง
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;
แบบสอบถาม 1 ลิงก์ "วางแผน"
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;
ข้อความค้นหา 2 "วางแผน" ลิงก์
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;
แบบสอบถาม 1
แบบสอบถาม 2
การทดสอบข้างต้นบน SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
@Joe Obbishชี้ให้เห็นในความคิดเห็นที่เรียบง่ายกว่า
SELECT *
FROM staging AS S
LEFT OUTER JOIN Target AS T
ON T.KeyCol = S.KeyCol;
VS
SELECT *
FROM staging AS S
LEFT OUTER JOIN (SELECT * FROM Target) AS T
ON T.KeyCol = S.KeyCol;
สำหรับตารางการจัดเตรียม 1,000 แถวทั้งสองข้างต้นยังคงมีรูปร่างแผนเหมือนกันพร้อมลูปซ้อนกันและแผนที่ไม่มีตารางที่ได้รับปรากฏราคาถูกกว่า แต่สำหรับตารางการจัดเตรียม 10,000 แถวและตารางเป้าหมายเดียวกันกับตารางด้านบน รูปร่าง (พร้อมการสแกนเต็มรูปแบบและการรวมเข้าด้วยกันดูเหมือนจะค่อนข้างน่าสนใจกว่าการค้นหาที่มีราคาแพง) การแสดงความแตกต่างของค่าใช้จ่ายนี้อาจมีความหมายอื่นนอกเหนือจากการทำให้แผนเปรียบเทียบยากขึ้น