AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 117599
Accepted
Collin Dauphinee
Collin Dauphinee
Asked: 2015-10-10 12:39:48 +0800 CST2015-10-10 12:39:48 +0800 CST 2015-10-10 12:39:48 +0800 CST

Como posso ver quanto tempo uma consulta passou esperando por bloqueios, sem um criador de perfil?

  • 772

Estou tentando diagnosticar uma consulta que está demorando muito tempo intermitentemente. Eu suspeito que pode ser bloqueado tentando adquirir um bloqueio. Não tenho permissão para usar um criador de perfil no ambiente com o problema.

Existe alguma maneira de obter estatísticas sobre quanto tempo essa consulta individual está bloqueada, sem usar um criador de perfil externo?

sql-server sql-server-2014
  • 1 1 respostas
  • 1094 Views

1 respostas

  • Voted
  1. Best Answer
    Kin Shah
    2015-10-10T12:54:32+08:002015-10-10T12:54:32+08:00

    (Se você tiver acesso a DMVs, procure sp_whoisactive com @find_block_leaders = 1. Basta dizer ao DBA (se não tiver) para implantá-lo e conceder permissão de execução.)

    As exibições de gerenciamento dinâmico do servidor SQL são suas melhores amigas:

    Abaixo estão várias maneiras de descobrir o bloqueio:

    --Ref: https://sqlserverperformance.wordpress.com/category/diagnostic-queries/
    select t1.resource_type as 'lock type'
        ,db_name(resource_database_id) as 'database'
        ,t1.resource_associated_entity_id as 'blk object'
        ,t1.request_mode as 'lock req'
        ,--- lock requested
        t1.request_session_id as 'waiter sid'
        ,t2.wait_duration_ms as 'wait time'
        ,-- spid of waiter  
        (
            select [text]
            from sys.dm_exec_requests as r -- get sql for waiter
            cross apply sys.dm_exec_sql_text(r.sql_handle)
            where r.session_id = t1.request_session_id
            ) as 'waiter_batch'
        ,(
            select substring(qt.text, r.statement_start_offset / 2, (
                        case 
                            when r.statement_end_offset = - 1
                                then LEN(CONVERT(nvarchar(max), qt.text)) * 2
                            else r.statement_end_offset
                            end - r.statement_start_offset
                        ) / 2)
            from sys.dm_exec_requests as r
            cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
            where r.session_id = t1.request_session_id
            ) as 'waiter_stmt'
        ,-- statement blocked
        t2.blocking_session_id as 'blocker sid'
        ,-- spid of blocker
        (
            select [text]
            from sys.sysprocesses as p -- get sql for blocker
            cross apply sys.dm_exec_sql_text(p.sql_handle)
            where p.spid = t2.blocking_session_id
            ) as 'blocker_stmt'
    from sys.dm_tran_locks as t1
    inner join sys.dm_os_waiting_tasks as t2 on t1.lock_owner_address = t2.resource_address;
    

    Uma visão mais profunda do bloqueio:

    -- Pedro Lopes (Microsoft) [email protected] (http://blogs.msdn.com/b/blogdoezequiel/)
    -- Waiter and Blocking Report
    SELECT -- blocked
        er.session_id AS blocked_spid
        ,ot.task_state AS [status]
        ,owt.wait_type AS blocked_spid_wait_type
        ,owt.wait_duration_ms AS blocked_spid_wait_time_ms
        ,
        -- Check sys.dm_os_waiting_tasks for Exchange wait types in http://technet.microsoft.com/en-us/library/ms188743.aspx.
        -- Wait Resource e_waitPipeNewRow in CXPACKET waits – Producer waiting on consumer for a packet to fill.
        -- Wait Resource e_waitPipeGetRow in CXPACKET waits – Consumer waiting on producer to fill a packet.
        owt.resource_description AS blocked_spid_res_desc
        ,CASE 
            WHEN owt.pageid = 1
                OR owt.pageid % 8088 = 0
                THEN 'Is_PFS_Page'
            WHEN owt.pageid = 2
                OR owt.pageid % 511232 = 0
                THEN 'Is_GAM_Page'
            WHEN owt.pageid = 3
                OR (owt.pageid - 1) % 511232 = 0
                THEN 'Is_SGAM_Page'
            WHEN owt.pageid IS NULL
                THEN NULL
            ELSE 'Is_not_PFS_GAM_SGAM_page'
            END AS blocked_spid_res_type
        ,(
            SELECT qt.TEXT AS [text()]
            FROM sys.dm_exec_sql_text(er.sql_handle) AS qt
            FOR XML PATH('')
                ,TYPE
            ) AS [blocked_batch]
        ,es.last_request_start_time AS blocked_last_start
        ,LEFT(CASE COALESCE(er.transaction_isolation_level, es.transaction_isolation_level)
                WHEN 0
                    THEN '0-Unspecified'
                WHEN 1
                    THEN '1-ReadUncommitted(NOLOCK)'
                WHEN 2
                    THEN '2-ReadCommitted'
                WHEN 3
                    THEN '3-RepeatableRead'
                WHEN 4
                    THEN '4-Serializable'
                WHEN 5
                    THEN '5-Snapshot'
                ELSE CONVERT(VARCHAR(30), er.transaction_isolation_level) + '-UNKNOWN'
                END, 30) AS blocked_tran_isolation_level
        ,er.total_elapsed_time / 1000 AS total_elapsed_time_sec
        ,
        -- blocker
        er2.session_id AS blocker_spid
        ,CASE 
            -- blocking session is either not blocked or has open trans
            WHEN owt.waiting_task_address IN (
                    SELECT owt2.blocking_task_address
                    FROM sys.dm_os_waiting_tasks owt2
                    )
                AND (
                    er2.session_id IS NULL
                    OR owt.blocking_session_id IS NULL
                    OR owt.[blocking_task_address] IS NULL
                    )
                THEN 1
            ELSE 0
            END AS is_head_blocker
        ,(
            SELECT qt2.TEXT AS [text()]
            FROM sys.dm_exec_sql_text(er2.sql_handle) AS qt2
            FOR XML PATH('')
                ,TYPE
            ) AS [blocker_batch]
        ,es2.last_request_start_time AS blocker_last_start
        ,LEFT(CASE COALESCE(er2.transaction_isolation_level, es2.transaction_isolation_level)
                WHEN 0
                    THEN '0-Unspecified'
                WHEN 1
                    THEN '1-ReadUncommitted(NOLOCK)'
                WHEN 2
                    THEN '2-ReadCommitted'
                WHEN 3
                    THEN '3-RepeatableRead'
                WHEN 4
                    THEN '4-Serializable'
                WHEN 5
                    THEN '5-Snapshot'
                ELSE CONVERT(VARCHAR(30), er2.transaction_isolation_level) + '-UNKNOWN'
                END, 30) AS blocker_tran_isolation_level
        ,
        -- other data
        DB_NAME(er.database_id) AS DBName
        ,es.host_name AS blocked_host
        ,es.program_name AS blocked_program
        ,es.login_name AS blocked_login
        ,CASE 
            WHEN es.session_id = - 2
                THEN 'Orphaned_distributed_tran'
            WHEN es.session_id = - 3
                THEN 'Deffered_recovery_tran'
            WHEN es.session_id = - 4
                THEN 'Unknown_tran'
            ELSE NULL
            END AS blocked_session_comment
        ,es.is_user_process AS [blocked_is_user_process]
        ,es2.host_name AS blocker_host
        ,es2.program_name AS blocker_program
        ,es2.login_name AS blocker_login
        ,CASE 
            WHEN es2.session_id = - 2
                THEN 'Orphaned_distributed_tran'
            WHEN es2.session_id = - 3
                THEN 'Deffered_recovery_tran'
            WHEN es2.session_id = - 4
                THEN 'Unknown_tran'
            ELSE NULL
            END AS blocker_session_comment
        ,es2.is_user_process AS [blocker_is_user_process]
    FROM (
        --In some cases (e.g. parallel queries, also waiting for a worker), one thread can be flagged as
        --waiting for several different threads.  This will cause that thread to show up in multiple rows
        --which is irrelevant.  Use ROW_NUMBER to select the longest wait for each thread
        SELECT [waiting_task_address]
            ,[session_id]
            ,[wait_duration_ms]
            ,[wait_type]
            ,[blocking_task_address]
            ,[blocking_session_id]
            ,[resource_description]
            ,CASE 
                WHEN [wait_type] LIKE 'PAGE%'
                    AND [resource_description] LIKE '%:%'
                    THEN CAST(RIGHT([resource_description], LEN([resource_description]) - CHARINDEX(':', [resource_description], LEN([resource_description]) - CHARINDEX(':', REVERSE([resource_description])))) AS INT)
                ELSE NULL
                END AS pageid
            ,ROW_NUMBER() OVER (
                PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC
                ) AS row_num
        FROM sys.dm_os_waiting_tasks --ORDER BY session_id
        ) owt
    INNER JOIN sys.dm_os_tasks ot ON ot.task_address = owt.waiting_task_address
    LEFT OUTER JOIN sys.dm_exec_requests er ON er.session_id = ot.session_id
        AND er.request_id = ot.request_id
    LEFT OUTER JOIN sys.dm_exec_sessions es ON es.session_id = er.session_id
    LEFT OUTER JOIN sys.dm_exec_sessions es2 ON es2.session_id = owt.blocking_session_id
    LEFT OUTER JOIN sys.dm_exec_requests er2 ON er2.session_id = owt.blocking_session_id
    OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) est
    OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) eqp
    WHERE owt.row_num = 1
        AND es.session_id <> @@SPID
        AND es.is_user_process = 1
    ORDER BY blocked_spid
        ,is_head_blocker DESC
        ,blocked_spid_wait_time_ms DESC
        ,blocker_spid
    GO
    

    Usando Extended Event ou BLOCKED_PROCESS_REPORT , você pode encontrar e ser alertado quando o bloqueio ocorrer.

    • 14

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve