sql-server - gratuito - sql server management studio 2017
Listar as consultas em execução no SQL Server (12)
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 )
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).
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.
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 .
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)
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.
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
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
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.
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/
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
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