Просмотр блокировок, полученных во время выполнения запроса (SQL Server)

12

План выполнения запроса не показывает детали блокировки по умолчанию, возможно ли просмотреть блокировки вместе с типом, полученным во время выполнения запроса?

Фейсал Мансур
источник

Ответы:

14

Можно ли просмотреть блокировки вместе с типом, полученным во время выполнения запроса?

Да, для определения замков,

  1. Вы можете использовать beta_lockinfoErland Sommarskog

    beta_lockinfoэто хранимая процедура, которая предоставляет информацию о процессах и блокировках, которые они удерживают, а также их активные транзакции. beta_lockinfoпредназначен для сбора как можно большего количества информации о ситуации блокировки, так что вы можете мгновенно найти виновника и убить процесс блокировки, если ситуация отчаянная. Затем вы можете откинуться на спинку кресла и проанализировать выходные данные, beta_lockinfoчтобы понять, как возникла ситуация блокировки, и выяснить, какие действия следует предпринять, чтобы предотвратить повторение ситуации. Выходные данные beta_lockinfoпоказывают все активные процессы, а также пассивные процессы с блокировками, какие объекты они блокируют, какую команду они отправили в последний раз и какую инструкцию они выполняют. Вы также получаете планы запросов для текущих операторов. Обычно вы бежитеbeta_lockinfoсмотреть на вывод напрямую, но есть также режим архивирования, в котором данные сохраняются в таблицу. Это не менее полезно, если вы хотите, чтобы кто-то отправил вам вывод с beta_lockinfoсайта, к которому у вас нет доступа.

  2. Другой метод - использовать 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
    
Кин Шах
источник
спасибо, вышеупомянутые хранимые процедуры отлично подходят для сценариев администрирования БД, но знаете ли вы какие-либо альтернативы для сценариев оптимизации запросов. Я пытаюсь понять поведение блокировки запроса вставки в среде разработки (в которой не так много данных, поэтому запрос не выполняется очень долго). Я хотел бы увидеть все блокировки, полученные запросом после его выполнения, мне интересно посмотреть план блокировки, аналогичный тому, как работает план запроса.
Фейсал Мансур
1
Поскольку вы используете sql server 2012, на уровне детализации запросов вы должны изучить XEvents - Определить, какие запросы удерживают блокировки . Это даст вам хорошее начало.
Кин Шах
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!
спагеттидба
3

Вы можете просмотреть полученную историю блокировок на вкладке «Сообщения» после запуска этого: DBCC TRACEON (1200, 3604, -1) Но ВНИМАНИЕ, это разрешает эти флаги трассировки ГЛОБАЛЬНО, поэтому не забудьте отключить их, как только вы не нужно их.

Ведран
источник
1

Вы можете просмотреть блокировки для сеанса, используя sp_lock или sys.dm_tran_locks. В обоих случаях вы можете фильтровать по сеансу. Вы также можете использовать расширенные события, чтобы сделать это.

Матан Юнгман
источник
0

Да, вы можете просмотреть блокировки и их тип во время выполнения запроса через

  1. SP_whoisactive от Adam mechanics нажмите здесь, чтобы посмотреть

  2. Более того, если вы хотите создать блочный отчет, вы можете сделать это с помощью трассировки, как описано здесь.

KASQLDBA
источник
1
performance countersпросто даст вам широкое поведение экземпляра. ОП хочет на уровне запроса.
Кин Шах
@Kin, спасибо, только что удалил лишнюю информацию :)
KASQLDBA