Plan wykonania zapytania domyślnie nie pokazuje szczegółów blokowania, czy możliwe jest przeglądanie blokad wraz z typem uzyskanym podczas wykonywania zapytania?
Plan wykonania zapytania domyślnie nie pokazuje szczegółów blokowania, czy możliwe jest przeglądanie blokad wraz z typem uzyskanym podczas wykonywania zapytania?
Odpowiedzi:
czy możliwe jest przeglądanie blokad wraz z typem uzyskanym podczas wykonywania zapytania?
Tak, do ustalania zamków,
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 zbeta_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 zbeta_lockinfowitryny, do której nie masz dostępu.
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 = 0Oto 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
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.
Tak, możesz wyświetlić blokady i ich typ podczas wykonywania zapytania za pośrednictwem
SP_whoisactive Adama mechanika Kliknij tutaj, aby wyświetlić
Ponadto, jeśli chcesz utworzyć raport blokowy, możesz to zrobić za pomocą śledzenia, jak wyjaśniono tutaj
performance counterspo prostu da ci szerokie zachowanie instancji. OP chce na poziomie zapytania.