อัลกอริทึมที่อยู่เบื้องหลังผู้ประกอบการยกเว้นคืออะไร?


10

อัลกอริทึมภายในของวิธีการที่ตัวดำเนินการยกเว้นทำงานภายใต้การครอบคลุมใน SQL Server คืออะไร ภายในใช้แฮชของแต่ละแถวและเปรียบเทียบหรือไม่

David Lozinksi ได้ทำการศึกษาSQL: วิธีที่เร็วที่สุดในการแทรกบันทึกใหม่ที่ไม่มีอยู่จริงเขาแสดงให้เห็นว่าคำสั่งนั้นเร็วที่สุดสำหรับแถวจำนวนมาก อย่างใกล้ชิดกับผลลัพธ์ของเราด้านล่าง

ข้อสันนิษฐาน: ฉันคิดว่าการเข้าร่วมด้านซ้ายจะเร็วที่สุดเนื่องจากจะเปรียบเทียบเพียง 1 คอลัมน์เท่านั้นยกเว้นจะใช้เวลานานที่สุดเนื่องจากต้องเปรียบเทียบคอลัมน์ทั้งหมด
ด้วยผลลัพธ์เหล่านี้ตอนนี้ความคิดของเราคือยกเว้นโดยอัตโนมัติและใช้แฮชของแต่ละแถวภายในหรือไม่ ฉันดูยกเว้นแผนการดำเนินการและใช้แฮชบางอย่าง

ความเป็นมา: ทีมของเราเปรียบเทียบตารางฮีปสองโต๊ะ ตาราง A แถวที่ไม่ได้อยู่ในตาราง B ถูกแทรกเข้าไปในตาราง B

ตารางฮีป (จากระบบไฟล์ข้อความดั้งเดิม) ไม่มีคีย์ / guids / identifier หลัก บางตารางมีแถวที่ซ้ำกันดังนั้นเราจึงพบแฮชของแต่ละแถวและลบรายการที่ซ้ำกันออกและสร้างตัวระบุคีย์หลัก

1) อันดับแรกเราเรียกใช้คำสั่งยกเว้นยกเว้น (คอลัมน์แฮช)

select * from TableA
Except
Select * from TableB,

2) จากนั้นเราก็วิ่งซ้ายเข้าร่วมเปรียบเทียบระหว่างสองตารางใน HashRowId

select * 
FROM dbo.TableA A
left join dbo.TableB B
    on A.RowHash =  B.RowHash
where B.Hash is null

น่าประหลาดใจว่าการแทรกคำสั่งยกเว้นนั้นเร็วที่สุด

ผลลัพธ์จริง ๆ แล้วแผนที่ใกล้เคียงกับผลการทดสอบจาก David Lozinksi

ป้อนคำอธิบายรูปภาพที่นี่


1
ไม่เป็นเช่นนั้นเสมอไป ผมพบว่าผลที่แตกต่างกันเล็กน้อยสำหรับอ่านตัวอย่างเช่น
Aaron Bertrand

คำตอบ:


10

อัลกอริทึมภายในของวิธีการที่ตัวดำเนินการยกเว้นทำงานภายใต้การครอบคลุมใน 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สิ่งที่นำไปสู่การเปรียบเทียบแบบแฮชแบบพิเศษภายใน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.