ดูการล็อกที่ได้รับระหว่างการดำเนินการสืบค้น (SQL Server)


12

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

คำตอบ:


14

เป็นไปได้หรือไม่ที่จะดูการล็อกพร้อมกับชนิดที่ได้รับระหว่างการประมวลผลของแบบสอบถาม

ใช่สำหรับการพิจารณาล็อค

  1. คุณสามารถใช้beta_lockinfoโดย Erland Sommarskog

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

  2. อีกวิธีคือการใช้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

ขอบคุณ procs ที่เก็บไว้ข้างต้นเหมาะสำหรับสถานการณ์สมมติของผู้ดูแลระบบ db แต่คุณรู้จักทางเลือกใด ๆ สำหรับสถานการณ์การเพิ่มประสิทธิภาพคิวรี ฉันพยายามที่จะเข้าใจพฤติกรรมการล็อคของคิวรีแทรกในสภาพแวดล้อมการพัฒนา (ซึ่งไม่มีข้อมูลจำนวนมากดังนั้นเคียวรีจึงไม่ทำงานนานนัก) ฉันต้องการที่จะเห็นล็อคทั้งหมดที่ได้มาจากแบบสอบถามหลังจากดำเนินการแล้วฉันสนใจที่จะเห็นแผนล็อคคล้ายกับวิธีการทำงานของแผนแบบสอบถาม
Faisal Mansoor

1
เนื่องจากคุณกำลังใช้ SQL Server 2012 ที่แบบสอบถามระดับที่ละเอียดคุณควรมีลักษณะเป็น XEvents - ตรวจสอบว่าแบบสอบถามล็อคโฮลดิ้ง นี่จะเป็นการเริ่มต้นที่ดีสำหรับคุณ
Kin Shah

4

นี่คือวิธีที่ฉันดูการล็อกตามกระบวนการ / ตาราง / ประเภทการล็อก:

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

3
มันเป็นคำตอบที่ยอดเยี่ยมและเป็นความอัปยศที่ใช้มุมมองที่เข้ากันได้ มาเลยปี 2015!
spaghettidba

3

คุณสามารถดูประวัติการล็อคที่ได้รับในแท็บ "ข้อความ" หลังจากเรียกใช้งานนี้: DBCC TRACEON (1200, 3604, -1) แต่ระวังมันเปิดใช้งานการติดตามสถานะเหล่านั้นทั่วโลกดังนั้นอย่าลืมที่จะปิดพวกเขาทันทีที่คุณไม่ได้ ต้องการพวกเขา


1

คุณสามารถดูล็อกสำหรับเซสชันโดยใช้ sp_lock หรือ sys.dm_tran_locks ในทั้งสองวิธีคุณสามารถกรองตามเซสชัน คุณยังสามารถใช้ Extended Events เพื่อทำสิ่งนั้นได้


0

ใช่คุณสามารถดูล็อคและประเภทของมันในระหว่างการดำเนินการค้นหาผ่าน

  1. SP_whoisactive ของ Adam mechanics คลิกที่นี่เพื่อดู

  2. ยิ่งกว่านั้นถ้าคุณต้องการสร้างรายงานบล็อกด้วยคุณสามารถทำได้ด้วยความช่วยเหลือในการติดตามตามที่อธิบายไว้ที่นี่


1
performance countersจะทำให้คุณมีพฤติกรรมแบบกว้าง OP ต้องการที่ระดับแบบสอบถาม
Kin Shah

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