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 / 187794
Accepted
Randy Minder
Randy Minder
Asked: 2017-10-06 11:26:52 +0800 CST2017-10-06 11:26:52 +0800 CST 2017-10-06 11:26:52 +0800 CST

Por que alguns valores spid não estão aparecendo em sys.dm_exec_requests?

  • 772

Estou executando a seguinte consulta dmv no SQL Server 2014 para encontrar todas as atividades em um servidor e quaisquer atividades de bloqueio:

SELECT Distinct
   ...
FROM sys.dm_exec_requests er
    OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
    LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id
    LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id
WHERE st.text IS NOT NULL And DB_Name(er.database_id) IN ('Vincent', 'Vincent_Audit')
ORDER BY BlockingSessionId Desc, SessionId

Os resultados de exemplo desta consulta são os seguintes:

insira a descrição da imagem aqui

Você pode ver que a sessão 120 está bloqueada por 112 e 112 está bloqueada por 69. No entanto, o processo 69 não aparece porque não existe em sys.dm_exec_requests.

Portanto, a consulta a seguir não retorna resultados:

SELECT *
FROM sys.dm_exec_requests
Where session_id = 69

Alguém sabe por que isso seria?

sql-server dmv
  • 2 2 respostas
  • 3006 Views

2 respostas

  • Voted
  1. Best Answer
    Hannah Vernon
    2017-10-06T11:47:02+08:002017-10-06T11:47:02+08:00

    As sessões podem existir sem uma solicitação ativa, mas ainda bloquear outras sessões.

    Considere se você tem uma janela aberta no SSMS onde você executa isto:

    BEGIN TRANSACTION
    INSERT INTO dbo.SomeTable DEFAULT VALUES;
    

    Então em outra janela você executa:

    BEGIN TRANSACTION
    SELECT * FROM dbo.SomeTable;
    

    A primeira sessão será travada em dbo.SomeTable, sem que apareça em sys.dm_exec_requests. Você verá a sessão em sys.dm_exec_sessions, e poderá ver a transação aberta em sys.dm_tran_session_transactions.

    Eu recomendaria o sp_whoisactive de Adam Machanic, no entanto, se você não tiver permissão para baixar scripts para executar em seu servidor, considere algo como o seguinte código que pode identificar transações abertas sem uma solicitação ativa que esteja bloqueando outras sessões:

    /*
        This query shows sessions that are blocking other sessions, including sessions that are 
        not currently processing requests (for instance, they have an open, uncommitted transaction).
    
        By:  Max Vernon, 2017-03-20
    */
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --reduce possible blocking by this query.
    
    USE tempdb;
    
    IF OBJECT_ID('tempdb..#dm_tran_session_transactions') IS NOT NULL
    DROP TABLE #dm_tran_session_transactions;
    SELECT *
    INTO #dm_tran_session_transactions
    FROM sys.dm_tran_session_transactions;
    
    IF OBJECT_ID('tempdb..#dm_exec_connections') IS NOT NULL
    DROP TABLE #dm_exec_connections;
    SELECT *
    INTO #dm_exec_connections
    FROM sys.dm_exec_connections;
    
    IF OBJECT_ID('tempdb..#dm_os_waiting_tasks') IS NOT NULL
    DROP TABLE #dm_os_waiting_tasks;
    SELECT *
    INTO #dm_os_waiting_tasks
    FROM sys.dm_os_waiting_tasks;
    
    IF OBJECT_ID('tempdb..#dm_exec_sessions') IS NOT NULL
    DROP TABLE #dm_exec_sessions;
    SELECT *
    INTO #dm_exec_sessions
    FROM sys.dm_exec_sessions;
    
    IF OBJECT_ID('tempdb..#dm_exec_requests') IS NOT NULL
    DROP TABLE #dm_exec_requests;
    SELECT *
    INTO #dm_exec_requests
    FROM sys.dm_exec_requests;
    
    ;WITH IsolationLevels AS 
    (
        SELECT v.*
        FROM (VALUES 
                  (0, 'Unspecified')
                , (1, 'Read Uncomitted')
                , (2, 'Read Committed')
                , (3, 'Repeatable')
                , (4, 'Serializable')
                , (5, 'Snapshot')
            ) v(Level, Description)
    )
    , trans AS 
    (
        SELECT dtst.session_id
            , blocking_sesion_id = 0
            , Type = 'Transaction'
            , QueryText = dest.text
        FROM #dm_tran_session_transactions dtst 
            LEFT JOIN #dm_exec_connections dec ON dtst.session_id = dec.session_id
        OUTER APPLY sys.dm_exec_sql_text(dec.most_recent_sql_handle) dest
    )
    , tasks AS 
    (
        SELECT dowt.session_id
            , dowt.blocking_session_id
            , Type = 'Waiting Task'
            , QueryText = dest.text
        FROM #dm_os_waiting_tasks dowt
            LEFT JOIN #dm_exec_connections dec ON dowt.session_id = dec.session_id
        OUTER APPLY sys.dm_exec_sql_text(dec.most_recent_sql_handle) dest
        WHERE dowt.blocking_session_id IS NOT NULL
    )
    , requests AS 
    (
    SELECT des.session_id
        , der.blocking_session_id
        , Type = 'Session Request'
        , QueryText = dest.text
    FROM #dm_exec_sessions des
        INNER JOIN #dm_exec_requests der ON des.session_id = der.session_id
    OUTER APPLY sys.dm_exec_sql_text(der.sql_handle) dest
    WHERE der.blocking_session_id IS NOT NULL
        AND der.blocking_session_id > 0 
    )
    , Agg AS (
        SELECT SessionID = tr.session_id
            , ItemType = tr.Type
            , CountOfBlockedSessions = (SELECT COUNT(*) FROM requests r WHERE r.blocking_session_id = tr.session_id)
            , BlockedBySessionID = tr.blocking_sesion_id
            , QueryText = tr.QueryText
        FROM trans tr
        WHERE EXISTS (
            SELECT 1
            FROM requests r
            WHERE r.blocking_session_id = tr.session_id
            )
        UNION ALL
        SELECT ta.session_id
            , ta.Type
            , CountOfBlockedSessions = (SELECT COUNT(*) FROM requests r WHERE r.blocking_session_id = ta.session_id)
            , BlockedBySessionID = ta.blocking_session_id
            , ta.QueryText
        FROM tasks ta
        UNION ALL
        SELECT rq.session_id
            , rq.Type
            , CountOfBlockedSessions =  (SELECT COUNT(*) FROM requests r WHERE r.blocking_session_id = rq.session_id)
            , BlockedBySessionID = rq.blocking_session_id
            , rq.QueryText
        FROM requests rq
    )
    SELECT agg.SessionID
        , ItemType = STUFF((SELECT ', ' + COALESCE(a.ItemType, '') FROM agg a WHERE a.SessionID = agg.SessionID ORDER BY a.ItemType FOR XML PATH ('')), 1, 2, '')
        , agg.BlockedBySessionID
        , agg.CountOfBlockedSessions
        , agg.QueryText
        , des.host_name
        , des.login_name
        , des.is_user_process
        , des.program_name
        , des.status
        , TransactionIsolationLevel = il.Description
    FROM agg 
        LEFT JOIN #dm_exec_sessions des ON agg.SessionID = des.session_id
        LEFT JOIN IsolationLevels il ON des.transaction_isolation_level = il.Level
    GROUP BY agg.SessionID
        , agg.BlockedBySessionID
        , agg.CountOfBlockedSessions
        , agg.QueryText
        , des.host_name
        , des.login_name
        , des.is_user_process
        , des.program_name
        , des.status
        , il.Description
    ORDER BY 
        agg.BlockedBySessionID
        , agg.CountOfBlockedSessions
        , agg.SessionID;
    
    • 8
  2. Randy Minder
    2017-10-06T11:46:41+08:002017-10-06T11:46:41+08:00

    Isso realmente acabou sendo muito educativo. A razão pela qual o spid 69 não estava aparecendo em sys.dm_exec_requests era porque sys.dm_exec_requests mostra apenas processos em execução ativa como Sean Gallardy apontou. Então, executei sp_who e 69 apareceu como um processo suspenso. Uma operação de inserção estava sendo executada pelo spid 69 e estava aguardando a liberação de um recurso. Portanto, foi suspenso e não aparece em sys.dm_exec_requests.

    • 0

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