Listar as consultas em execução no SQL Server

200

Existe uma maneira de listar as consultas atualmente em execução no MS SQL Server (por meio do Enterprise Manager ou SQL) e / ou quem está conectado?

Acho que tenho uma consulta em execução muito longa sendo executada em um dos meus servidores de banco de dados e gostaria de localizá-la e pará-la (ou a pessoa que continua iniciando).

BIBD
fonte

Respostas:

203

Isso mostrará os SPIDs mais antigos em um servidor SQL 2000 ou SQL 2005:

select
    P.spid
,   right(convert(varchar, 
            dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'), 
            121), 12) as 'batch_duration'
,   P.program_name
,   P.hostname
,   P.loginame
from master.dbo.sysprocesses P
where P.spid > 50
and      P.status not in ('background', 'sleeping')
and      P.cmd not in ('AWAITING COMMAND'
                    ,'MIRROR HANDLER'
                    ,'LAZY WRITER'
                    ,'CHECKPOINT SLEEP'
                    ,'RA MANAGER')
order by batch_duration desc

Se você precisar ver o SQL em execução para um determinado spid a partir dos resultados, use algo como isto:

declare
    @spid int
,   @stmt_start int
,   @stmt_end int
,   @sql_handle binary(20)

set @spid = XXX -- Fill this in

select  top 1
    @sql_handle = sql_handle
,   @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end
,   @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end
from    sys.sysprocesses
where   spid = @spid
order by ecid

SELECT
    SUBSTRING(  text,
            COALESCE(NULLIF(@stmt_start, 0), 1),
            CASE @stmt_end
                WHEN -1
                    THEN DATALENGTH(text)
                ELSE
                    (@stmt_end - @stmt_start)
                END
        )
FROM ::fn_get_sql(@sql_handle)
Mike Forman
fonte
3
Você pode modificar isso para funcionar com o SQL v12 + (por exemplo, Azure) removendo referências ao mestre, por exemplo. substituir 'master.dbo.sysprocesses' com 'dbo.sysprocesses'
Kevin
Eu sugeriria substituir a msquantização por s. Um possível estouro pode ocorrer (aconteceu comigo).
Zverev Evgeniy
Para o Azure, pode ser necessário alterar "master.dbo.sysprocesses" por "sys.sysprocesses"
Danton Heuer
93

Se você estiver executando o SQL Server 2005 ou 2008, poderá usar as DMVs para encontrar isso ...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
Scott Ivey
fonte
1
Esta consulta não está funcionando no SQL Server 2005 se o nível atual de compatibilidade do banco de dados for menor que 90. Se a compatibilidade atual do banco de dados for menor, alterne para o banco de dados mestre para executar esta consulta.
Alexander Pravdin
31

Você pode executar o comando sp_who para obter uma lista de todos os usuários, sessões e processos atuais. Você pode executar o comando KILL em qualquer spid que esteja bloqueando outros.

ichiban
fonte
3
Isso nem sempre é útil. Às vezes, as consultas parecem gerar spid filhos, especialmente quando OPENQUERY ou servidores vinculados estão sendo usados. Pode ser difícil dizer qual é a consulta pai apenas de sp_who.
Nathan
17

Eu sugeriria consultar os syspontos de vista. algo parecido com

SELECT * 
FROM 
   sys.dm_exec_sessions s
   LEFT  JOIN sys.dm_exec_connections c
        ON  s.session_id = c.session_id
   LEFT JOIN sys.dm_db_task_space_usage tsu
        ON  tsu.session_id = s.session_id
   LEFT JOIN sys.dm_os_tasks t
        ON  t.session_id = tsu.session_id
        AND t.request_id = tsu.request_id
   LEFT JOIN sys.dm_exec_requests r
        ON  r.session_id = tsu.session_id
        AND r.request_id = tsu.request_id
   OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) TSQL

Dessa forma, você pode obter um TotalPagesAllocatedque pode ajudá-lo a descobrir o spidque está consumindo todos os recursos do servidor. Muitas vezes não consigo exibir o monitor de atividades e usar essas sysvisualizações para ver o que está acontecendo.

Eu recomendo que você leia o seguinte artigo. Eu tenho essa referência daqui .

dhi
fonte
1
Também usamos a análise de desempenho do Quest DB, que fornece uma imagem visual muito boa do que está acontecendo no servidor. Uma das coisas ruins disso é dizer quem é a vítima, mas é difícil descobrir quem está consumindo os recursos. Isso ajudaria embora.
DHI
16

Existem várias visualizações de gerenciamento incorporadas ao produto. No SQL 2000, você usaria sysprocesses . No SQL 2K5, há mais visualizações como sys.dm_exec_connections , sys.dm_exec_sessions e sys.dm_exec_requests .

Também existem procedimentos como sp_who que aproveitam essas visualizações. No 2K5 Management Studio, você também obtém o Activity Monitor.

E por último, mas não menos importante, existem scripts contribuídos pela comunidade como o Who Is Active, de Adam Machanic .

Remus Rusanu
fonte
11

Na verdade, a execução EXEC sp_who2no Query Analyzer / Management Studio fornece mais informações do que sp_who.

Além disso, você pode configurar o SQL Profiler para assistir todo o tráfego de entrada e saída do servidor. O Profiler também permite restringir exatamente o que você está assistindo.

Para o SQL Server 2008:

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler

Lembre-se de que o criador de perfil é realmente um aplicativo de registro e visualização. Ele continuará a registrar e assistir enquanto estiver em execução. Ele pode preencher arquivos de texto ou bancos de dados ou discos rígidos; portanto, tenha cuidado com o que vê e por quanto tempo.

tlatourelle
fonte
1
O SQL Server Profiler é onde todos devem começar, definitivamente!
21717 Shane
11
SELECT
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, r.command,
    p.program_name, text 
FROM
    sys.dm_exec_requests AS r,
    master.dbo.sysprocesses AS p 
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle)
WHERE
    p.status NOT IN ('sleeping', 'background') 
AND r.session_id = p.spid
Howard Rothenburg
fonte
11

Como uma observação, o Monitor de Atividade do SQL Server para SQL Server 2008 pode ser encontrado clicando com o botão direito do mouse no servidor atual e acessando "Monitor de Atividade" no menu de contexto. Eu achei que essa era a maneira mais fácil de eliminar processos se você estiver usando o SQL Server Management Studio.

prenster
fonte
Isso deveria ter sido um comentário, mas, sim, é tão útil e ganha mais visibilidade como resposta :-) E isso me ajudou agora. Obrigado
Loudenvier
9

No Pesquisador de Objetos, faça uma busca detalhada em: Servidor -> Gerenciamento -> Monitor de Atividade. Isso permitirá que você veja todas as conexões no servidor atual.

Tyler
fonte
1
Eu não vejo nada chamado Activity Monitor em Gerenciamento em SQL 2008.
jpierson
5

Aqui está uma consulta que mostrará todas as consultas que estão bloqueando. Não tenho muita certeza se isso mostrará apenas consultas lentas:

SELECT p.spid
,convert(char(12), d.name) db_name
, program_name
, convert(char(12), l.name) login_name
, convert(char(12), hostname) hostname
, cmd
, p.status
, p.blocked
, login_time
, last_batch
, p.spid
FROM      master..sysprocesses p
JOIN      master..sysdatabases d ON p.dbid =  d.dbid
JOIN      master..syslogins l ON p.sid = l.sid
WHERE     p.blocked = 0
AND       EXISTS (  SELECT 1
          FROM      master..sysprocesses p2
          WHERE     p2.blocked = p.spid )
Steve Stedman
fonte
5

O script correto seria assim:

select 
p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text
    from sys.dm_exec_requests as r, sys.sysprocesses p 
    cross apply sys.dm_exec_sql_text(p.sql_handle) t
    where p.status not in ('sleeping', 'background')
    and r.session_id=p.spid
Gabriel Aizcorbe
fonte
5

Você pode usar a consulta abaixo para encontrar a última solicitação em execução:

SELECT
    der.session_id
    ,est.TEXT AS QueryText
    ,der.status
    ,der.blocking_session_id
    ,der.cpu_time
    ,der.total_elapsed_time
FROM sys.dm_exec_requests AS der
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est

Usando o script abaixo, você também pode encontrar o número de conexões por banco de dados:

SELECT 
    DB_NAME(DBID) AS DataBaseName
    ,COUNT(DBID) AS NumberOfConnections
    ,LogiName 
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName

Para obter mais detalhes, visite: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

Anvesh
fonte
4

em 2005, você pode clicar com o botão direito do mouse em um banco de dados, acessar relatórios e há uma lista completa de relatórios sobre transições e bloqueios, etc.

DForck42
fonte
4

Tente com isto:

Ele fornecerá todas as consultas de usuário. Até o 50, todos são sessões de processo interno do servidor sql. Mas, se você quiser, pode remover a cláusula where:

select
r.session_id,
r.start_time,
s.login_name,
c.client_net_address,
s.host_name,
s.program_name,
st.text
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
left join sys.dm_exec_connections c
on r.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st where r.session_id  > 50
Shiwangini
fonte
3
SELECT 
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, t.text
FROM
    sys.dm_exec_requests as r,
    master.dbo.sysprocesses as p
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) t
WHERE
    p.status NOT IN ('sleeping', 'background')
AND r.session_id = p.spid

E

KILL @spid
buttowski
fonte
2
isso vai ficar bem .. !! e se eu matar por spid. isso matará apenas uma consulta? minha duvida é resolvida e session_is são exclusivos para cada query que esta rodando naquela sessão ou servidor?
Buttowski
1

Use o Sql Server Profiler (menu Ferramentas) para monitorar a execução de consultas e use o monitor de atividades no Management studio para ver como está conectado e se a conexão deles está bloqueando outras conexões.

Beatles1692
fonte
1

Você deve tentar um procedimento muito útil sp_whoIsActiveque pode ser encontrado aqui: http://whoisactive.com e é gratuito.

Sasa
fonte