วิธีการป้องกัน Deadlocks ของคอลัมน์ที่แบ่งพาร์ติชันบน SELECT


10

ฉันมีตารางดัชนีคอลัมน์หลัก (CCI) สามตารางใน SQL Server 2016 CCI ทั้งหมดเหล่านี้อยู่ในรูปแบบการแบ่งพาร์ติชันเดียวกันโดยยึดตาม ID ผู้เช่า เมื่อเร็ว ๆ นี้และไม่สอดคล้องกันฉันได้รับการหยุดชะงักในงบเลือกง่าย ๆ จากการเข้าร่วมตารางเหล่านี้ ตัวอย่างแบบสอบถามที่ deadlocks:

SELECT  TOP 33 r.tenantid
FROM    Table_r r
        INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey 
        INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey 
WHERE   r.TenantId = 69
        AND pe.TenantId = 69
        AND cm.TenantId = 69

ข้อความผิดพลาด:

ทรานแซคชัน (ID กระบวนการ 56) ถูกหยุดชะงักในทรัพยากรวัตถุรอได้ทั่วไปด้วยกระบวนการอื่นและได้รับเลือกให้ตกเป็นเหยื่อการหยุดชะงัก รันธุรกรรมอีกครั้ง

เบาะแส:

  • ถ้าแบบสอบถามใช้ดัชนีอื่นนอกเหนือจาก CCI มันจะไม่หยุดชะงัก
  • หากฉันลบตัวกรองผู้เช่าสองในสามตัวมันไม่หยุดชะงัก
  • ถ้าฉันเลือก top 32 หรือต่ำกว่ามันจะไม่หยุดชะงัก
  • ถ้าฉันเพิ่ม OPTION (MAXDOP 1) มันจะไม่หยุดชะงัก
  • ฉันสามารถทำซ้ำสิ่งนี้ได้ในแบบจำลองกระทุ้งที่แย่งอ่านของฉันอ่านอย่างเดียวรองและแยงเอง
  • ฉันไม่สามารถทำซ้ำพฤติกรรมนี้ใน DEV หรือ INT
  • มันยังคงหยุดชะงักหากฉันเพิ่ม WITH (NOLOCK) เข้ากับตารางทั้ง 3 ตัว
  • แบบสอบถามหยุดชะงักตัวเอง มันจะหยุดชะงักเมื่อไม่มีกระบวนการอื่นที่ใช้งานอยู่
  • แผนแบบสอบถามที่ไม่มีการขนานกันจะไม่หยุดชะงัก

Deadlock xml ที่นี่

รุ่นแยงของเรา:

Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 มกราคม 2019 18:51:38 ลิขสิทธิ์ (c) Microsoft Corporation รุ่นองค์กรองค์กร (64 บิต) บน Windows Server 2012 R2 มาตรฐาน 6.3 (รุ่น 9600) :) (Hypervisor)

ฉันจะป้องกันการหยุดชะงักในแบบสอบถามนี้ได้อย่างไร

คำตอบ:


8

เนื่องจากคุณอยู่บน SQL Server 2016 เป็นเรื่องที่ควรกล่าวถึงว่ามีการแก้ไขข้อผิดพลาดสาธารณะอย่างน้อยหนึ่งรายการสำหรับการหยุดชะงักแบบขนานที่เกี่ยวข้องกับดัชนี columnstore:

การแก้ไข: การชะงักงันเกิดขึ้นเมื่อคุณเรียกใช้แบบสอบถามแบบขนานในดัชนี columnstore แบบคลัสเตอร์ใน SQL Server 2016 และ 2017

(ขอบคุณDenis Rubashkin ที่ให้ลิงค์ในตอนแรก)

สิ่งนี้เผยแพร่เป็นส่วนหนึ่งของ SP1 CU7 หากคุณยังไม่ถึง CU นั้นคุณควรให้ช็อตนั้น การแก้ไขนี้จะรวมอยู่ใน SP2 (CU ใด ๆ )

โดยทั่วไปแล้วทั้งสองวิธีในการแก้ไขการชะงักงันของการสืบค้นภายในขนาน:

  • หลีกเลี่ยงการขนาน (โดยการปรับการค้นหาเพื่อไม่ให้ขนานโดยใช้MAXDOPคำใบ้ ฯลฯ ) - นี่คือคำตอบอื่น ๆโดยThomas Costers
  • ใช้เซอร์วิสแพ็ค / การปรับปรุงล่าสุดกับ SQL Server

2

คุณได้ตรวจสอบบล็อกต่อไปนี้เกี่ยวกับการหยุดชะงักของเธรดการสืบค้นภายในแบบขนานหรือไม่

SyncPointทรัพยากรบ่งชี้ว่าการใช้งานของเหตุการณ์การแลกเปลี่ยนถ้าฉันไม่ได้เข้าใจผิด
เมื่อดูที่ผู้เข้าร่วมการหยุดชะงักของคุณคุณจะเห็นว่าพวกเขาทั้งหมดมาจาก spid (55) และแบทช์ (0) เดียวกัน แต่กำลังใช้เธรดที่แตกต่างกัน MAXDOP 1นี้แสดงให้เห็นว่าพวกเขาเป็นส่วนหนึ่งของแบบสอบถามขนานเหมือนกันและได้รับการยืนยันจากข้อเท็จจริงที่ว่าคุณไม่ได้รับการติดตายเมื่อใดก็ตามที่คุณเรียกใช้แบบสอบถามที่มี ในกรณีของการหยุดชะงักของเธรดขนานภายในเธรดของเคียวรีเดี่ยวจะสิ้นสุดการหยุดชะงักซึ่งกันและกันเพื่อรอวัตถุการซิงโครไนซ์ SyncPoints ในกรณีของคุณ

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

แต่ก่อนที่จะเล่นแร่แปรธาตุกับสองตัวเลือกเหล่านี้ก่อนอื่นให้ตรวจสอบว่าคุณอยู่ใน SP / CU ล่าสุดหรือไม่

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