ฉันมีตารางดัชนีคอลัมน์หลัก (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 ตัว
- แบบสอบถามหยุดชะงักตัวเอง มันจะหยุดชะงักเมื่อไม่มีกระบวนการอื่นที่ใช้งานอยู่
- แผนแบบสอบถามที่ไม่มีการขนานกันจะไม่หยุดชะงัก
รุ่นแยงของเรา:
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)
ฉันจะป้องกันการหยุดชะงักในแบบสอบถามนี้ได้อย่างไร