Zobacz blokady uzyskane podczas wykonywania zapytania (SQL Server)

12

Plan wykonania zapytania domyślnie nie pokazuje szczegółów blokowania, czy możliwe jest przeglądanie blokad wraz z typem uzyskanym podczas wykonywania zapytania?

Faisal Mansoor
źródło

Odpowiedzi:

14

czy możliwe jest przeglądanie blokad wraz z typem uzyskanym podczas wykonywania zapytania?

Tak, do ustalania zamków,

  1. Możesz używać beta_lockinfoprzez Erland Sommarskog

    beta_lockinfoto procedura składowana, która dostarcza informacji o procesach i blokadach, które posiadają, oraz aktywnych transakcjach. beta_lockinfoma na celu zebranie jak największej ilości informacji o sytuacji blokowania, abyś mógł natychmiast znaleźć winowajcę i zabić proces blokowania, jeśli sytuacja jest desperacka. Następnie możesz usiąść i przeanalizować dane wyjściowe z, beta_lockinfoaby zrozumieć, jak powstała sytuacja blokowania i dowiedzieć się, jakie działania należy podjąć, aby zapobiec ponownemu wystąpieniu sytuacji. Wyjście z beta_lockinfopokazuje wszystkie aktywne procesy, a także procesy pasywne z blokadami, które obiekty blokują, jakie polecenia ostatnio przesłały i jakie instrukcje wykonują. Otrzymasz również plany zapytań dla bieżących instrukcji. Zwykle biegnieszbeta_lockinfoaby spojrzeć bezpośrednio na dane wyjściowe, ale istnieje również tryb archiwizacji, w którym dane są zapisywane w tabeli. Nie jest to najmniej przydatne, jeśli chcesz, aby ktoś wysłał Ci dane wyjściowe z beta_lockinfowitryny, do której nie masz dostępu.

  2. Inną metodą jest użycie sp_whoIsActiveprzez Adama machanic z@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
Kin Shah
źródło
dzięki, powyższe przechowywane procy są świetne dla scenariuszy administratora db, ale czy znasz jakieś alternatywy dla scenariuszy optymalizacji zapytań. Próbuję zrozumieć zachowanie blokowania zapytania wstawiającego w środowisku programistycznym (które nie ma dużo danych, więc zapytanie nie działa bardzo długo). Chciałbym zobaczyć wszystkie blokady uzyskane przez zapytanie po jego wykonaniu. Interesuje mnie widok planu blokady, podobnie jak działa plan zapytania.
Faisal Mansoor
1
Ponieważ używasz SQL Server 2012, na poziomie szczegółowości zapytania, powinieneś przyjrzeć się XEvent - Ustal, które zapytania blokują blokady . To da ci dobry początek.
Kin Shah
4

Oto jak patrzę na zamki według typu procesu / tabeli / zamka:

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
Shane Estelle
źródło
3
To świetna odpowiedź i szkoda, że ​​używa widoków zgodności. Chodź, to 2015!
spaghettidba
3

Możesz wyświetlić historię uzyskanych blokad w zakładce „Wiadomości” po uruchomieniu tego: DBCC TRACEON (1200, 3604, -1) Ale UWAGA, włącza te flagi śledzenia GLOBALNIE, więc nie zapomnij wyłączyć ich, gdy tylko tego nie zrobisz potrzebuję ich.

Vedran
źródło
1

Możesz wyświetlić blokady dla sesji za pomocą sp_lock lub sys.dm_tran_locks. W obu przypadkach możesz filtrować według sesji. W tym celu można również użyć zdarzeń rozszerzonych.

Matan Yungman
źródło
0

Tak, możesz wyświetlić blokady i ich typ podczas wykonywania zapytania za pośrednictwem

  1. SP_whoisactive Adama mechanika Kliknij tutaj, aby wyświetlić

  2. Ponadto, jeśli chcesz utworzyć raport blokowy, możesz to zrobić za pomocą śledzenia, jak wyjaśniono tutaj

KASQLDBA
źródło
1
performance counterspo prostu da ci szerokie zachowanie instancji. OP chce na poziomie zapytania.
Kin Shah
@Kin, dzięki, właśnie usunąłem dodatkowe informacje :)
KASQLDBA