MERGE ใช้ tempdb หรือไม่


12

พิจารณาคำถามต่อไปนี้:

MERGE [Parameter] with (rowlock) AS target
    USING (SELECT @AreaId, @ParameterTypeId, @Value)
            AS source (AreaId, ParameterTypeId, Value)
    ON (target.AreaId = source.AreaId AND 
        target.ParameterTypeId = source.ParameterTypeId)
    WHEN MATCHED THEN 
        UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
    WHEN NOT MATCHED THEN
        INSERT ([AreaId], [ParameterTypeId], [Value])
        VALUES (source.AreaId, source.ParameterTypeId, source.Value);

สถิติ I / O ให้เอาต์พุตต่อไปนี้:

ตาราง 'ParameterType' จำนวนการสแกน 0, การอ่านเชิงตรรกะ 2, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, ตรรกะการอ่านอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0
ตาราง 'พื้นที่' จำนวนการสแกน 0, การอ่านเชิงตรรกะ 2, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, การอ่านตรรกะล่วงหน้า lob 0, lob ทางกายภาพอ่าน 0, lob การอ่านล่วงหน้าอ่าน 0
ตาราง 'พารามิเตอร์' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 4, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, การอ่านตรรกะล่วงหน้า lob 0, lob ทางกายภาพอ่าน 0, lob การอ่านล่วงหน้าอ่าน 0
ตาราง 'โต๊ะทำงาน' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 0, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, lob ตรรกะอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0

ปรากฏ Worktable ในข้อความแท็บที่ทำให้ฉันคิดว่า tempdb MERGEจะถูกใช้โดย

ฉันไม่เห็นอะไรเลยในแผนปฏิบัติการที่จะบ่งบอกถึงความต้องการ tempdb

ไม่MERGEเคยใช้ tempdb?

มีอะไรใน BOL ที่อธิบายพฤติกรรมนี้หรือไม่?

จะใช้INSERT& UPDATEจะเร็วขึ้นในสถานการณ์นี้ไหม

ซ้าย

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

ขวา

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

นี่คือโครงสร้างตาราง

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


tempdbหลอดในแผนคือในโต๊ะทำงาน ดูเหมือนจะแปลกที่มันมีแถวเดียวแม้ว่า ฉันคิดว่ามันอาจจะมีการป้องกันฮาโลวีน
Martin Smith

ฉันเห็นมันตอนนี้ เก็บข้อมูลจากอินพุตลงในตารางชั่วคราวเพื่อปรับการกรอกลับ
Craig Efrein

คำตอบ:


8

(ขยายความคิดเห็นของฉันในคำถาม)

โดยไม่ต้องมีข้อ จำกัด ที่ไม่ซ้ำกันในการรวมกันของAreaIdและParameterTypeIdรหัสที่กำหนดเสียเพราะจะเท่านั้นที่เคยบันทึกแถวเดียว@UpdatedId = target.IdId

ถ้าคุณไม่บอก SQL Server จะไม่สามารถรู้สถานะที่เป็นไปได้ของข้อมูลโดยปริยาย ควรบังคับใช้ข้อ จำกัด หรือหากมีหลายแถวที่ถูกต้องรหัสจะต้องมีการเปลี่ยนแปลงเพื่อใช้กลไกที่แตกต่างกันในการส่งออกIdค่า

เนื่องจากความเป็นไปได้ที่ผู้ดำเนินการสแกนจะเจอแถวที่ตรงกันหลายแถวแบบสอบถามจะต้องเก็บพักการแข่งขันทั้งหมดสำหรับการป้องกันฮาโลวีน ตามที่ระบุในข้อคิดเห็นข้อคิดเห็นมีผลบังคับใช้ดังนั้นการเพิ่มจะไม่เพียง แต่เปลี่ยนแผนจากการสแกนเป็นการค้นหา แต่ยังกำจัดความต้องการสปูลของตารางเนื่องจาก SQL Server จะรู้ว่าจะเป็น 0 หรือ ส่งคืน 1 แถวจากตัวดำเนินการค้นหา


6

หากการปรับปรุงสามารถเปลี่ยนตำแหน่งของแถวในดัชนีสแกนโดยการปรับปรุง SQL Server เพื่อความจำเป็นในการปกป้องจากปัญหาฮาโลวีน สำหรับ SQL Server นั้นโดยทั่วไปจะแทรกสปูลตารางกระตือรือร้นเข้าไปในแผนการดำเนินการทันทีหลังจากการสแกนดัชนี ตัวดำเนินการนั้นสร้างสำเนาของแถวที่เป็นปัญหาและใช้ tempdb สำหรับสิ่งนั้น

ส่วนการอัปเดตของคำสั่ง MERGE จะต้องปฏิบัติตามกฎเดียวกันและใช้สปูลโต๊ะในกรณีส่วนใหญ่ที่ต้องการการป้องกันฮาโลวีน

ในขณะที่ฉันไม่สามารถบอกได้ว่านี่เป็นกรณีในแบบสอบถามของคุณหรือไม่เพราะฉันไม่ทราบคำจำกัดความของดัชนีนี่เป็นไปได้มากว่าเกิดอะไรขึ้นที่นี่

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