แผนการดำเนินการแบบสอบถามจะไม่แสดงรายละเอียดการล็อกตามค่าเริ่มต้นเป็นไปได้หรือไม่ที่จะดูการล็อกพร้อมกับชนิดที่ได้มาระหว่างการดำเนินการค้นหา
แผนการดำเนินการแบบสอบถามจะไม่แสดงรายละเอียดการล็อกตามค่าเริ่มต้นเป็นไปได้หรือไม่ที่จะดูการล็อกพร้อมกับชนิดที่ได้มาระหว่างการดำเนินการค้นหา
คำตอบ:
เป็นไปได้หรือไม่ที่จะดูการล็อกพร้อมกับชนิดที่ได้รับระหว่างการประมวลผลของแบบสอบถาม
ใช่สำหรับการพิจารณาล็อค
คุณสามารถใช้beta_lockinfoโดย Erland Sommarskog
beta_lockinfo
เป็นขั้นตอนการจัดเก็บที่ให้ข้อมูลเกี่ยวกับกระบวนการและการล็อคที่พวกเขาเก็บไว้เช่นเดียวกับการทำธุรกรรมที่ใช้งานของพวกเขาbeta_lockinfo
ถูกออกแบบมาเพื่อรวบรวมข้อมูลมากที่สุดเกี่ยวกับสถานการณ์การบล็อคให้มากที่สุดเพื่อให้คุณสามารถค้นหาผู้กระทำผิดและฆ่ากระบวนการบล็อกหากสถานการณ์หมดหวัง จากนั้นคุณสามารถนั่งดูและวิเคราะห์ผลลัพธ์beta_lockinfo
เพื่อทำความเข้าใจว่าสถานการณ์การบล็อกเกิดขึ้นอย่างไรและคิดออกว่าจะดำเนินการอย่างไรเพื่อป้องกันไม่ให้สถานการณ์เกิดซ้ำอีก เอาต์พุตจากbeta_lockinfo
แสดงกระบวนการที่ใช้งานอยู่ทั้งหมดรวมถึงกระบวนการแบบพาสซีฟที่มีการล็อกวัตถุใดที่พวกเขาล็อคคำสั่งที่พวกเขาส่งครั้งล่าสุดและคำสั่งใดที่พวกเขากำลังดำเนินการ คุณยังได้รับแผนแบบสอบถามสำหรับงบปัจจุบัน ตามปกติคุณจะทำงานbeta_lockinfo
เพื่อดูผลลัพธ์โดยตรง แต่ยังมีโหมดเก็บถาวรที่บันทึกข้อมูลลงในตาราง สิ่งนี้ไม่มีประโยชน์น้อยที่สุดหากคุณต้องการให้ใครบางคนส่งผลลัพธ์beta_lockinfo
ให้คุณที่ไซต์ที่คุณไม่มีสิทธิ์เข้าถึงตัวเอง
อีกวิธีคือการใช้sp_whoIsActiveโดย Adam Machanicด้วย@get_locks = 1
EXEC sp_WhoIsActive
@filter = '',
@filter_type = 'session',
@not_filter = '',
@not_filter_type = 'session',
@show_own_spid = 0,
@show_system_spids = 0,
@show_sleeping_spids = 1,
@get_full_inner_text = 0,
@get_plans = 1,
@get_outer_command = 1,
@get_transaction_info = 0,
@get_task_info = 1,
@get_locks = 1, ----------> 1 = ON (get lock info); 0 = OFF
@get_avg_time = 0,
@get_additional_info = 0,
@find_block_leaders = 0,
@delta_interval = 0,
@output_column_list = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]',
@sort_order = '[start_time] ASC',
@format_output = 1,
@destination_table = '',
@return_schema = 0,
@schema = NULL,
@help = 0
นี่คือวิธีที่ฉันดูการล็อกตามกระบวนการ / ตาราง / ประเภทการล็อก:
SELECT
HostName,
"OS UserName",
Login,
spid,
"Database",
TableID,
"Table Name_________",
IndID,
-- [Index Name],
"Lock Type",
"Lock Mode",
Status,
-- Resource,
Count(*) AS "Lock Count"
FROM (
SELECT
Convert(VarChar(30), RTRIM(P.HostName)) AS HostName,
Convert(VarChar(30), RTRIM(P.nt_UserName)) AS "OS UserName",
Convert(VarChar(30), Suser_SName(p.sid)) AS Login,
Convert(SmallInt, req_spid) AS spid,
Convert(VarChar(30), DB_Name(rsc_dbid)) AS "Database",
rsc_objid AS TableID,
Convert(VarChar(30), Object_Name(rsc_objid, rsc_dbid))
AS [Table Name_________],
rsc_indid AS IndID,
CASE SubString (lock_type.name, 1, 4)
When '' Then 'None'
When 'DB' Then 'Database'
When 'FIL' Then 'File'
When 'IDX' Then 'Index'
When 'TAB' Then 'Table'
When 'PAG' Then 'Page'
When 'KEY' Then 'Key'
When 'EXT' Then 'Extent'
When 'RID' Then 'Row ID'
When 'APP' Then 'Application'
Else SubString (lock_type.name, 1, 4)
END AS "Lock Type",
Case SubString (lock_mode.name, 1, 12)
When NULL Then 'N/A'
When 'Sch-S' Then 'SCHEMA (Stability)'--'SCHEMA stability lock'
When 'Sch-M' Then 'SCHEMA (Modification)'--'SCHEMA modification lock'
When 'S' Then 'SHARED'--'SHARED Lock acquisition'
When 'U' Then 'UPDATE'--'UPDATE lock acquisition'
When 'X' Then 'EXCLUSIVE'--'EXCLUSIVE lock granted'
When 'IS' Then 'SHARED (Intent)'--'INTENT for SHARED lock'
When 'IU' Then 'UPDATE (Intent)'--'INTENT for UPDATE lock'
When 'IX' Then 'EXCLUSIVE (Intent)'--'INTENT for EXCLUSIVE lock'
When 'SIU' Then 'SHARED (Intent UPDATE)'--'SHARED lock with INTENT for UPDATE'
When 'SIX' Then 'SHARED (Intent EXCLUSIVE)'--'SHARED lock with INTENT for EXCLUSIVE'
When 'UIX' Then 'UPDATE'--'UPDATE lock with INTENT for EXCLUSIVE'
When 'BU' Then 'UPDATE (BULK)'--'BULK UPDATE lock'
Else SubString (lock_mode.name, 1, 12)
END AS "Lock Mode",
SubString(lock_status.name, 1, 5) AS Status,
SubString (rsc_text, 1, 16) AS Resource
FROM
Master..SysLockInfo S
JOIN Master..spt_values lock_type on S.rsc_type = lock_type.number
JOIN Master..spt_values lock_status on S.req_status = lock_status.number
JOIN Master..spt_values lock_mode on S.req_mode = lock_mode.number -1
JOIN Master..SysProcesses P on S.req_spid = P.spid
WHERE
lock_type.type = 'LR'
AND lock_status.type = 'LS'
AND lock_mode.type = 'L'
AND DB_Name(rsc_dbid) NOT IN ('master', 'msdb', 'model')
) AS X
WHERE TableID > 0
GROUP BY
HostName,
"OS UserName",
Login,
spid,
"Database",
TableID,
"Table Name_________",
IndID,
"Lock Type",
"Lock Mode",
Status
ORDER BY
spid, "Database", "Table Name_________", "Lock Type", Login
คุณสามารถดูประวัติการล็อคที่ได้รับในแท็บ "ข้อความ" หลังจากเรียกใช้งานนี้: DBCC TRACEON (1200, 3604, -1) แต่ระวังมันเปิดใช้งานการติดตามสถานะเหล่านั้นทั่วโลกดังนั้นอย่าลืมที่จะปิดพวกเขาทันทีที่คุณไม่ได้ ต้องการพวกเขา
คุณสามารถดูล็อกสำหรับเซสชันโดยใช้ sp_lock หรือ sys.dm_tran_locks ในทั้งสองวิธีคุณสามารถกรองตามเซสชัน คุณยังสามารถใช้ Extended Events เพื่อทำสิ่งนั้นได้
ใช่คุณสามารถดูล็อคและประเภทของมันในระหว่างการดำเนินการค้นหาผ่าน
SP_whoisactive ของ Adam mechanics คลิกที่นี่เพื่อดู
ยิ่งกว่านั้นถ้าคุณต้องการสร้างรายงานบล็อกด้วยคุณสามารถทำได้ด้วยความช่วยเหลือในการติดตามตามที่อธิบายไว้ที่นี่
performance counters
จะทำให้คุณมีพฤติกรรมแบบกว้าง OP ต้องการที่ระดับแบบสอบถาม