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


12

План виконання запитів за замовчуванням не відображає деталі блокування, чи можливо переглядати замки разом із типом, набутим під час виконання запиту?

Відповіді:


14

чи можна переглянути замки разом із типом, набутим під час виконання запиту?

Так, для визначення замків,

  1. Ви можете використовувати beta_lockinfoЕрланда Соммарського

    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

спасибі, вищезазначені збережені програми відмінно підходять для сценаріїв адміністрування db, але чи знаєте ви альтернативи для сценаріїв оптимізації запитів. Я намагаюся зрозуміти поведінку блокування вставки запиту в середовищі розробки (що не має багато даних, тому запит працює не дуже довго). Я хотів би побачити всі замки, отримані запитом після його виконання, мені цікаво побачити план блокування, подібний до того, як працює план запитів.
Faisal Mansoor

1
Оскільки ви використовуєте sql-сервер 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 Адама Механіка натисніть тут, щоб переглянути

  2. Крім того, якщо ви хочете створити звіт про блоки, ви можете зробити це за допомогою сліду, як пояснено тут


1
performance countersпросто дасть вам широку поведінку. ОП хоче на рівні запиту.
Кін Шах

@Kin, спасибі, щойно видалили додаткову інформацію :)
KASQLDBA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.