sql-server - developer - sql server gratuito



Listar as consultas em execução no SQL Server (12)

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

Acho que tenho uma consulta muito longa sendo executada em um dos meus servidores de banco de dados e gostaria de rastreá-lo e pará-lo (ou a pessoa que continua começando).


Answer #1

Aqui está uma consulta que mostrará todas as consultas que estão bloqueando. Não tenho 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 )

Answer #2

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


Answer #3

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 exibições. No 2K5 Management Studio, você também recebe o Activity Monitor.

E por último, mas não menos importante, há scripts com contribuições da comunidade, como o Who Is Active, de Adam Machanic .


Answer #4

Isso mostrará os SPIDs mais longos 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 dado spid 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    master.dbo.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)

Answer #5

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


Answer #6

O roteiro certo 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

Answer #7

Tente com isso:

Ele fornecerá todas as consultas do usuário. Até o spid 50, tudo são sessões internas do processo do sql server. 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

Answer #8

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


Answer #9

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


Answer #10

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 mais detalhes, visite: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/


Answer #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

Answer #12
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




sql-server