it-swarm.com.de

Während der Abfrageausführung erworbene Sperren anzeigen (SQL Server)

Der Abfrageausführungsplan zeigt standardmäßig nicht die Sperrdetails an. Ist es möglich, die Sperren zusammen mit dem Typ anzuzeigen, die während der Ausführung einer Abfrage erfasst wurden?

12
Faisal Mansoor

ist es möglich, die Sperren zusammen mit dem Typ anzuzeigen, die während der Ausführung einer Abfrage erfasst wurden?

Ja, um Schlösser zu bestimmen,

  1. Sie können beta_lockinfo von Erland Sommarskog

    beta_lockinfo Ist eine gespeicherte Prozedur, die Informationen zu Prozessen und den darin enthaltenen Sperren sowie zu ihren aktiven Transaktionen bereitstellt. beta_lockinfo Soll so viele Informationen wie möglich über eine Blockierungssituation sammeln, sodass Sie den Täter sofort finden und den Blockierungsprozess beenden können, wenn die Situation verzweifelt ist. Dann können Sie sich zurücklehnen und die Ausgabe von beta_lockinfo Analysieren, um zu verstehen, wie die Blockierungssituation entstanden ist, und um herauszufinden, welche Maßnahmen zu ergreifen sind, um ein erneutes Auftreten der Situation zu verhindern. Die Ausgabe von beta_lockinfo Zeigt alle aktiven sowie passiven Prozesse mit Sperren an, welche Objekte sie sperren, welchen Befehl sie zuletzt gesendet haben und welche Anweisung sie ausführen. Sie erhalten auch die Abfragepläne für die aktuellen Anweisungen. Normalerweise führen Sie beta_lockinfo Aus, um die Ausgabe direkt anzuzeigen. Es gibt jedoch auch einen Archivierungsmodus , in dem die Daten in einer Tabelle gespeichert werden. Dies ist nicht zuletzt nützlich, wenn Sie möchten, dass Ihnen jemand die Ausgabe von beta_lockinfo An einer Site sendet, auf die Sie keinen Zugriff haben.

  2. Eine andere Methode ist die Verwendung von sp_whoIsActive von Adam Machanic mit @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
    
14
Kin Shah

So betrachte ich Sperren nach Prozess/Tabelle/Sperrtyp:

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
4
Shane Estelle

Sie können den Verlauf der erworbenen Sperren auf der Registerkarte "Nachrichten" anzeigen, nachdem Sie Folgendes ausgeführt haben: DBCC TRACEON (1200, 3604, -1) Beachten Sie jedoch, dass diese Ablaufverfolgungsflags GLOBAL aktiviert werden. Vergessen Sie also nicht, sie zu deaktivieren, sobald Sie dies nicht tun brauche sie.

3
Vedran

Sie können die Sperren für eine Sitzung mit sp_lock oder sys.dm_tran_locks anzeigen. Auf beide Arten können Sie nach Sitzung filtern. Sie können dazu auch Extended Events verwenden.

1
Matan Yungman

Ja, Sie können die Sperren und ihren Typ während der Abfrageausführung über anzeigen

  1. SP_whoisactive --- von Adam Mechanics zum Anzeigen hier klicken

  2. Wenn Sie einen Blockbericht mit erstellen möchten, können Sie darüber hinaus mithilfe der Ablaufverfolgung wie erläutert hier

0
KASQLDBA