การหยุดชะงักในการลบคำชี้แจง


11

ฉันได้รับการหยุดชะงักเมื่อ SQL Server Job ทำงาน การหยุดชะงักเกิดขึ้นกับคำสั่ง DELETE ง่าย ๆ ฉันคิดว่าจะต้องมีคิวรี SELECT / UPDATE ที่ทำงานอยู่เพื่อให้เกิดการหยุดชะงักหรือไม่ แต่ดูเหมือนว่าจะเป็นการหยุดชะงัก / DELETE ...

สิ่งที่ฉันกำลังมองหาคือสาเหตุที่ฉันได้รับการหยุดชะงักของ DELETE / DELETE มันคือ (ความรู้ของฉัน) ผ่านในพารามิเตอร์ที่แตกต่างกัน

ความคิดใด ๆ ขอบคุณ

deadlock-list
2014-05-20 07:30:09.66 spid25s      deadlock victim=process409048
2014-05-20 07:30:09.66 spid25s       process-list
2014-05-20 07:30:09.66 spid25s        process id=process409048 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127294 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x397219620 lockMode=U schedulerid=5 kpid=3792 status=suspended spid=150 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process432e08 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=2648 ownerId=629859744 transactionname=DELETE lasttranstarted=2014-05-20T07:30:04.833 XDES=0x4c3426b50 lockMode=U schedulerid=6 kpid=5988 status=suspended spid=146 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:04.833 lastbatchcompleted=2014-05-20T07:30:04.820 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629859744 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process39ea562c8 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x13e0e4b50 lockMode=U schedulerid=2 kpid=7124 status=suspended spid=150 sbid=0 ecid=1 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2

5
ไม่การหยุดชะงักสามารถเกิดขึ้นได้ในสถานการณ์อื่น ๆ นอกเหนือจาก SELECT / UPDATE สิ่งที่คุณต้องการจริงๆคือกระบวนการที่สองซึ่งแต่ละกระบวนการต้องการทรัพยากรที่อีกกระบวนการหนึ่งกำลังถืออยู่ (1) คำสั่ง DELETE เป็นส่วนหนึ่งของธุรกรรมที่มีขนาดใหญ่ขึ้นหรือไม่? (2) คุณสามารถโพสต์ XML deadlock ที่อื่นแทนข้อความบันทึกข้อผิดพลาดที่เส็งเคร็งได้หรือไม่?
Aaron Bertrand

คุณช่วยโพสต์สคีมาตารางdbo.UserDetailsDataรวมทั้งดัชนีทั้งหมดได้ไหม นอกจากนี้คุณทราบหรือไม่ว่าข้อความเหล่านั้นถูกเรียกด้วยพารามิเตอร์เดียวกัน ระบุว่าทั้งสองมีบันทึกการใช้งานเป็นศูนย์ฉันสงสัยว่าสิ่งที่คุณต้องทำคือจัดลำดับการโทรเพราะพวกเขากำลังก้าวต่อกัน
Jon Seigel

ฉันจะรับ XML ได้อย่างไร มีข้อผิดพลาดจากบันทึกข้อผิดพลาดของ SQL Server คำสั่งถูกเรียกด้วยพารามิเตอร์ที่แตกต่างกัน เมื่อเร็ว ๆ นี้เราได้เพิ่มดัชนีกรองที่กรองในฟิลด์ UserDate
K09

จับเหตุการณ์กราฟการหยุดชะงักใน Profiler จากนั้นหลังจากที่คุณจับได้แล้วให้คลิกขวาที่แถว -> แยกข้อมูลกิจกรรม -> บันทึกเป็น. xdl และโพสต์เนื้อหา (xml) บน Pastebin (หรือที่อื่นที่คล้ายกัน)
แมเรียน

1
สวัสดี XML โพสต์ที่นี่ ... หวังว่านี่จะช่วยได้! dl.dropboxusercontent.com/u/16953128/DeadlockTest.xdl
K09

คำตอบ:


14

สิ่งที่ฉันกำลังมองหาคือสาเหตุที่ฉันได้รับการหยุดชะงักของ DELETE / DELETE

ดูเหมือนว่าการหยุดชะงักเกิดขึ้นเพราะ:

  1. spid 54 ecid 0รับการUล็อคหน้าupdate ( )PAGE: 12:1:5147422
  2. spid 166 ecid 3ร้องขอการUล็อกหน้าการอัพเดต ( ) บนหน้าเดียวกันและถูกบล็อก
  3. spid 54 ecid 2ร้องขอการUล็อกหน้าการอัปเดต ( ) ในหน้าเดียวกัน ...

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

ที่กล่าวว่าคุณไม่ควรสนใจอะไรมากนักเกี่ยวกับสาเหตุของการหยุดชะงักคำถามที่สำคัญคือคุณหลีกเลี่ยงได้อย่างไร DELETEคำตอบก็คือเพื่อให้เป็นเส้นทางการเข้าถึงที่มีประสิทธิภาพสำหรับ คำสั่งต้องค้นหาแถวWHERE Username = @P1 AND UserDate = @P2ดังนั้นคุณควรมีดัชนีคีย์ในคอลัมน์เหล่านี้

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

คำตอบสำหรับข้อมูลคอลัมน์เพิ่มเติมนั้นเป็นสิ่งจำเป็นในการค้นหาแถวดัชนีที่กรองเพื่อลบ (และเพื่อตรวจสอบเพรดิเคต) ถ้าแบบสอบถามใช้แผนการดำเนินการแคบ / ต่อแถวเอ็นจินการดำเนินการไม่สามารถดึงคอลัมน์เพิ่มเติมในตัวดำเนินการลบดัชนีแบบคลัสเตอร์ได้เช่นเดียวกับในแผนแบบกว้าง / ต่อดัชนี

คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้นและตัวอย่างการทำงานในโพสต์บล็อกนี้

ในกรณีนี้ข้อมูลคอลัมน์จำเป็นต้องมาจากส่วนหนึ่งของแผนทางด้านขวาของการลบดัชนีแบบคลัสเตอร์ดังนั้นจึงใช้การสแกนดัชนีคลัสเตอร์แบบขนานและคุณได้รับแบบสอบถามที่ช้าและมีศักยภาพการหยุดชะงักสูง

คำตอบคือทำอย่างใดอย่างหนึ่งต่อไปนี้:

  1. ลบดัชนีที่กรองแล้ว
  2. เพิ่มคีย์ดัชนีที่กรอง / รวม / กริยาคอลัมน์ลงในดัชนีชื่อ / วันที่ที่มีอยู่
  3. บังคับให้มีการปรับปรุงแผนกว้าง (ไม่สนับสนุนวิธีการที่จะทำเช่นนี้)
  4. เรียกใช้แบบสอบถามภายใต้การแยกสแน็ปช็อต (ไม่ใช่ RCSI)

ตัวเลือกที่ 2 จะเป็นการตั้งค่าที่แข็งแกร่งของฉัน

ตัวเลือก 4 (ขอบคุณแจ็คดักลาส) มีข้อได้เปรียบในการลบการหยุดชะงักและไม่ควรทำให้เกิด "ความขัดแย้งในการอัปเดต" เนื่องจากการเปลี่ยนแปลงที่ไม่เป็นสมาชิกร่วมกัน แต่ต้องเปิดใช้งานการแยกสแนปชอตในระดับฐานข้อมูล และจะไม่แก้ไขปัญหาพื้นฐาน : คุณจะยังคงจบลงด้วยการสแกนตารางแบบขนานที่สิ้นเปลืองซึ่งการค้นหาดัชนีที่ดีคือสิ่งที่คุณต้องการจริงๆ

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