쿼리 실행 중 획득 한 잠금보기 (SQL Server)


답변:


14

쿼리 실행 중에 획득 한 잠금 유형과 유형을 볼 수 있습니까?

예, 잠금을 결정하기 위해

  1. Erland Sommarskog에서 사용할 수 있습니다beta_lockinfo

    beta_lockinfo프로세스 및 프로세스가 보유한 잠금 및 활성 트랜잭션에 대한 정보를 제공하는 저장 프로 시저입니다. beta_lockinfo차단 상황에 대해 최대한 많은 정보를 수집하여 상황이 절실한 경우 즉시 범인을 찾아 차단 프로세스를 중단 할 수 있습니다. 그런 다음 앉아서 결과를 분석하여 beta_lockinfo블로킹 상황이 어떻게 발생했는지 이해하고 상황이 재발하지 않도록 수행 할 조치를 파악할 수 있습니다. 의 출력 결과는 beta_lockinfo잠금이있는 수동 프로세스뿐만 아니라 잠그는 오브젝트, 마지막으로 제출 한 명령 및 실행중인 명령문을 보여줍니다. 현재 명령문에 대한 쿼리 계획도 얻습니다. 일반적으로, 당신은 실행beta_lockinfo출력을 직접 볼 수 있지만 데이터가 테이블에 저장 되는 아카이브 모드 도 있습니다 . 다른 사람 beta_lockinfo이 자신에게 액세스 할 수없는 사이트에서 출력물을 보내려면이 방법이 가장 유용 하지 않습니다.

  2. 또 다른 방법은 sp_whoIsActiveAdam Machanic 과 함께 사용 하는 것 입니다@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
    

덕분에 위의 저장된 procs는 db 관리 시나리오에는 훌륭하지만 쿼리 최적화 시나리오에 대한 대안을 알고 있습니까? 개발 환경에서 삽입 쿼리의 잠금 동작을 이해하려고합니다 (많은 데이터가 없으므로 쿼리가 오래 실행되지 않습니다). 쿼리가 실행 된 후 쿼리에 의해 획득 된 모든 잠금을보고 싶습니다. 쿼리 계획이 작동하는 방식과 유사한 잠금 계획을 보는 데 관심이 있습니다.
파이살 만수르

1
쿼리 단위 수준에서 SQL Server 2012를 사용하고 있으므로 XEvents- 잠금을 보유하고있는 쿼리 결정을 살펴보십시오 . 이것은 당신에게 좋은 시작을 줄 것입니다.
Kin Shah

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 년입니다!
spaghettidba

3

DBCC TRACEON (1200, 3604, -1)을 실행 한 후 "메시지"탭에서 획득 한 잠금 히스토리를 볼 수 있습니다. 그러나이 추적 플래그를 GLOBALLY로 설정하고 있으므로 즉시 해제하지 마십시오. 그것들이 필요하다.


1

sp_lock 또는 sys.dm_tran_locks를 사용하여 세션의 잠금을 볼 수 있습니다. 두 가지 방법으로 세션별로 필터링 할 수 있습니다. 확장 이벤트를 사용하여이를 수행 할 수도 있습니다.


0

예, 쿼리를 실행하는 동안 잠금 및 유형을 볼 수 있습니다.

  1. Adam mechanics의 SP_whoisactive 보려면 여기를 클릭하십시오

  2. 또한 블록 보고서를 작성하려면 여기에 설명 된대로 추적을 사용하여 수행 할 수 있습니다.


1
performance counters단지 당신에게 넓은 행동을 줄 것입니다. OP는 쿼리 수준에서 원합니다.
Kin Shah

@Kin, 감사, 그냥 추가 정보 : 제거
KASQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.