План выполнения запроса не показывает детали блокировки по умолчанию, возможно ли просмотреть блокировки вместе с типом, полученным во время выполнения запроса?
План выполнения запроса не показывает детали блокировки по умолчанию, возможно ли просмотреть блокировки вместе с типом, полученным во время выполнения запроса?
Ответы:
Можно ли просмотреть блокировки вместе с типом, полученным во время выполнения запроса?
Да, для определения замков,
Вы можете использовать beta_lockinfoErland Sommarskog
beta_lockinfo
это хранимая процедура, которая предоставляет информацию о процессах и блокировках, которые они удерживают, а также их активные транзакции.beta_lockinfo
предназначен для сбора как можно большего количества информации о ситуации блокировки, так что вы можете мгновенно найти виновника и убить процесс блокировки, если ситуация отчаянная. Затем вы можете откинуться на спинку кресла и проанализировать выходные данные,beta_lockinfo
чтобы понять, как возникла ситуация блокировки, и выяснить, какие действия следует предпринять, чтобы предотвратить повторение ситуации. Выходные данныеbeta_lockinfo
показывают все активные процессы, а также пассивные процессы с блокировками, какие объекты они блокируют, какую команду они отправили в последний раз и какую инструкцию они выполняют. Вы также получаете планы запросов для текущих операторов. Обычно вы бежитеbeta_lockinfo
смотреть на вывод напрямую, но есть также режим архивирования, в котором данные сохраняются в таблицу. Это не менее полезно, если вы хотите, чтобы кто-то отправил вам вывод сbeta_lockinfo
сайта, к которому у вас нет доступа.
Другой метод - использовать sp_whoIsActiveАдам Мачаник с@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
Вы можете просмотреть блокировки для сеанса, используя sp_lock или sys.dm_tran_locks. В обоих случаях вы можете фильтровать по сеансу. Вы также можете использовать расширенные события, чтобы сделать это.
Да, вы можете просмотреть блокировки и их тип во время выполнения запроса через
SP_whoisactive от Adam mechanics нажмите здесь, чтобы посмотреть
Более того, если вы хотите создать блочный отчет, вы можете сделать это с помощью трассировки, как описано здесь.
performance counters
просто даст вам широкое поведение экземпляра. ОП хочет на уровне запроса.