คำถามติดแท็ก blocking

2
กระบวนการบล็อกว่างเปล่าในรายงานกระบวนการที่ถูกบล็อก
ฉันรวบรวมรายงานกระบวนการที่ถูกบล็อกโดยใช้เหตุการณ์เพิ่มเติมและด้วยเหตุผลบางประการในรายงานบางอันblocking-processโหนดนั้นว่างเปล่า นี่คือ xml แบบเต็ม: <blocked-process-report monitorLoop="383674"> <blocked-process> <process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" …

6
ใน SQL Server มีวิธีการตรวจสอบว่ากลุ่มแถวที่เลือกถูกล็อคหรือไม่?
เราพยายามที่จะปรับปรุง / ลบบันทึกจำนวนมากในตารางแถวหลายพันล้าน เนื่องจากนี่เป็นตารางยอดนิยมจึงมีกิจกรรมมากมายในส่วนต่างๆของตารางนี้ กิจกรรมการอัปเดต / ลบขนาดใหญ่ใด ๆ จะถูกปิดกั้นเป็นระยะเวลานาน (เนื่องจากกำลังรอการล็อคในแถวหรือการล็อกหน้าหรือการล็อคตาราง) ทำให้หมดเวลาหรือใช้เวลาหลายวันเพื่อทำงานให้เสร็จ ดังนั้นเรากำลังเปลี่ยนวิธีการลบแถวเล็ก ๆ ในเวลาเดียวกัน แต่เราต้องการตรวจสอบว่าแถวที่เลือก (สมมติว่า 100 หรือ 1,000 หรือ 2,000 แถว) ปัจจุบันถูกล็อคโดยกระบวนการที่แตกต่างกันหรือไม่ ถ้าไม่เช่นนั้นดำเนินการลบ / อัปเดต หากพวกเขาถูกล็อคให้ย้ายไปยังกลุ่มระเบียนถัดไป ในตอนท้ายกลับมาที่จุดเริ่มต้นและพยายามอัปเดต / ลบสิ่งที่เหลือไว้ เป็นไปได้หรือไม่ ขอบคุณ ToC

2
วิธีค้นหาคิวรี่ที่ยังคงล็อคอยู่
การสืบค้นsys.dm_tran_locksDMV แสดงให้เราเห็นว่าเซสชันใด (SPIDs) กำลังล็อคทรัพยากรเช่นตารางหน้าและแถว สำหรับการล็อคแต่ละครั้งที่ได้มามีวิธีใดบ้างที่จะตัดสินว่าคำสั่ง SQL ใด (ลบ, แทรก, อัพเดตหรือเลือก) ทำให้เกิดการล็อคนั้น? ฉันรู้ว่าmost_recent_query_handleคอลัมน์ของsys.dm_exec_connectionsDMV ทำให้เรามีข้อความของการสืบค้นล่าสุดที่ดำเนินการ แต่หลายครั้งแบบสอบถามอื่น ๆ วิ่งมาก่อนภายใต้เซสชั่นเดียวกัน (SPID) และยังคงล็อค ฉันใช้sp_whoisactiveขั้นตอน (จาก Adam Machanic) แล้วและจะแสดงเฉพาะแบบสอบถามที่อยู่ในบัฟเฟอร์อินพุตในขณะนี้ (คิดว่าDBCC INPUTBUFFER @spid) ซึ่งไม่เสมอไป (และในกรณีของฉันมักจะไม่เคย) คือแบบสอบถามที่ได้รับการล็อค ตัวอย่างเช่น: เปิดธุรกรรม / เซสชัน ดำเนินการคำสั่ง (ที่ถือล็อคทรัพยากร) exec คำสั่งอื่นในเซสชั่นเดียวกัน เปิดธุรกรรม / เซสชันอื่นแล้วลองแก้ไขทรัพยากรที่ถูกล็อคในขั้นตอนที่ 2 sp_whoisactiveขั้นตอนจะชี้ให้เห็นคำสั่งในขั้นตอนที่ 3 ซึ่งไม่ได้เป็นผู้รับผิดชอบในการล็อคและจึงไม่เป็นประโยชน์ คำถามนี้มาจากการวิเคราะห์โดยใช้คุณสมบัติรายงานกระบวนการที่ถูกบล็อกเพื่อค้นหาสาเหตุของการบล็อกสถานการณ์ในการผลิต แต่ละธุรกรรมรันหลายเคียวรีและส่วนใหญ่ครั้งล่าสุด (ที่แสดงในอินพุตบัฟเฟอร์ที่ BPR) ไม่ค่อยถือล็อค ฉันมีคำถามติดตาม: …

2
ฐานข้อมูล“ ตรึง” บน ALTER TABLE
สภาพแวดล้อมการผลิตของเราเพิ่งแข็ง * เช้านี้สักพักเมื่อเปลี่ยนโต๊ะเพิ่มคอลัมน์จริง การละเมิด SQL:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[]; * การเข้าสู่ระบบของเราต้องเลือกจากตารางเดียวกันนั้นดังนั้นจึงไม่มีใครสามารถเข้าสู่ระบบในช่วงตารางการเปลี่ยนแปลง เราต้องฆ่ากระบวนการเพื่อให้ระบบกลับมาทำงานตามปกติ โครงสร้างตาราง: CREATE TABLE cliente ( rut character varying(30) NOT NULL, nombre character varying(150) NOT NULL, razon_social character varying(150) NOT NULL, direccion character varying(200) NOT NULL, comuna character varying(100) NOT NULL, ciudad character varying(100) NOT NULL, …

1
การคอมไพล์บล็อกมากเกินไปใน sp_procedure_params_90_rowset
การฟื้นตัวของคำถามนี้ใน MSDN: ถูกบล็อก - กระบวนการรายงาน: แหล่งข้อมูลนี้รออะไร "OBJECT: 32767: 124607697: 0 [คอมไพล์]" ฉันตรวจพบข้อความเหล่านี้ใน Profiler แล้ว พวกเขาทั้งหมดมีระยะเวลามากกว่า 3 วินาที มากกว่า 10 คนขึ้นไป กิจกรรมการปิดกั้นเป็นเช่นเดียวกับการเชื่อมโยงจากMSDN การโทรทั้งหมดใช้การตั้งชื่อ 3 ส่วน ทั้งหมดระบุ proc ที่แตกต่างกันในรูปแบบที่มีลักษณะดังต่อไปนี้: exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, …

1
ทำไม UPDLOCK ทำให้ SELECT เลือกที่จะหยุด (ล็อค)?
ฉันมีตัวเลือกใน SQL Server ที่ล็อคทั้งตาราง นี่คือสคริปต์การตั้งค่า (ตรวจสอบให้แน่ใจว่าคุณไม่ได้เขียนทับอะไรเลย) USE [master] GO IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB') DROP DATABASE LockingTestDB GO CREATE DATABASE LockingTestDB GO USE [LockingTestDB] GO IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable') DROP TABLE LockingTestTable GO CREATE TABLE LockingTestTable ( Id int …

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

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