อัลกอริทึมภายในของวิธีการที่ตัวดำเนินการยกเว้นทำงานภายใต้การครอบคลุมใน SQL Server คืออะไร
EXCEPT
ฉันจะไม่พูดว่ามีขั้นตอนวิธีการภายในเป็นพิเศษสำหรับ สำหรับเอ็นA EXCEPT B
จิ้นจะใช้ทูเปิล (ถ้าจำเป็น) ที่แตกต่างจาก A และลบแถวที่ตรงกับใน B ไม่มีตัวดำเนินการแผนแบบสอบถามพิเศษ ความแตกต่างและการลบจะดำเนินการผ่านตัวดำเนินการทั่วไปที่คุณจะเห็นด้วยการเรียงลำดับหรือการเข้าร่วม รองรับการเข้าร่วมแบบวนซ้ำรวมการเข้าร่วมและการเข้าร่วมแฮชทั้งหมดได้รับการสนับสนุน ในการแสดงสิ่งนี้ฉันจะโยนจำนวน 15 ล้านแถวเป็นหนึ่งคู่:
DROP TABLE IF EXISTS dbo.TABLE_1;
CREATE TABLE dbo.TABLE_1 (
COL1 BIGINT NULL,
COL2 BIGINT NULL
);
INSERT INTO dbo.TABLE_1 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);
DROP TABLE IF EXISTS dbo.TABLE_2;
CREATE TABLE dbo.TABLE_2 (
COL1 BIGINT NULL,
COL2 BIGINT NULL
);
INSERT INTO dbo.TABLE_2 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);
เครื่องมือเพิ่มประสิทธิภาพทำให้การตัดสินใจตามต้นทุนเป็นเรื่องปกติเกี่ยวกับวิธีการใช้การเรียงลำดับและการเข้าร่วม ด้วยสองกองฉันได้รับแฮชเข้าร่วมตามที่คาดไว้ คุณสามารถดูประเภทการเข้าร่วมอื่น ๆ ได้อย่างเป็นธรรมชาติโดยเพิ่มดัชนีหรือเปลี่ยนข้อมูลในตารางใดก็ได้ ด้านล่างฉันบังคับให้การผสานและการวนซ้ำเข้าร่วมด้วยคำแนะนำเพียงเพื่อเป็นตัวอย่าง:
ภายในใช้แฮชของแต่ละแถวและเปรียบเทียบหรือไม่
ไม่มันถูกนำไปใช้เป็นการเข้าร่วมอื่น ๆ สิ่งหนึ่งที่แตกต่างคือ NULL จะถือว่าเท่ากัน <Compare CompareOp="IS">
นี้เป็นชนิดพิเศษของการเปรียบเทียบซึ่งคุณสามารถเห็นในแผนปฏิบัติการ: อย่างไรก็ตามคุณจะได้รับแผนเดียวกันกับ T-SQL ที่ไม่มีEXCEPT
คำหลัก ตัวอย่างเช่นต่อไปนี้มีแผนแบบสอบถามที่แน่นอนเหมือนกับEXCEPT
แบบสอบถามที่ใช้การเข้าร่วมแฮ:
SELECT t1.*
FROM
(
SELECT DISTINCT COL1, COL2
FROM dbo.TABLE_1
) t1
WHERE NOT EXISTS (
SELECT 1
FROM dbo.TABLE_2 t2
WHERE (t1.COL1 = t2.COL1 OR (t1.COL1 IS NULL AND t2.COL1 IS NULL))
AND (t1.COL2 = t2.COL2 OR (t1.COL2 IS NULL AND t2.COL2 IS NULL))
);
การกระจาย XML ของแผนการดำเนินการจะเผยให้เห็นความแตกต่างเพียงผิวเผินรอบนามแฝงและสิ่งต่าง ๆ เช่นนั้น โพรบที่เหลือสำหรับการแฮชทำการเปรียบเทียบแถว พวกเขาเหมือนกันสำหรับทั้งสองแบบสอบถาม:
หากคุณยังมีข้อสงสัยฉันจะรันPerfViewด้วยอัตราตัวอย่างสูงสุดที่มีอยู่เพื่อรับสแต็กการโทรสำหรับเคียวรีด้วยEXCEPT
และเคียวรีที่ไม่มี นี่คือผลการค้นหาแบบเคียงข้างกัน:
ไม่มีความแตกต่างที่แท้จริง สแต็คการโทรที่มีการแฮชอ้างอิงมีอยู่เนื่องจากแฮชตรงกันในแผน หากฉันเพิ่มดัชนีเพื่อให้การเข้าร่วมผสานเป็นธรรมชาติคุณจะไม่เห็นการอ้างอิงใด ๆ เกี่ยวกับการแฮ็กในสแต็คการโทร:
การแฮชใด ๆ ที่เกิดขึ้นนั้นเกิดจากการใช้ตัวดำเนินการจับคู่แฮช ไม่มีอะไรพิเศษเกี่ยวกับEXCEPT
สิ่งที่นำไปสู่การเปรียบเทียบแบบแฮชแบบพิเศษภายใน