Список запросов, выполняемых на SQL Server
есть ли способ перечислить запросы, которые в настоящее время выполняются на MS SQL Server (через Enterprise Manager или SQL) и/или кто подключен?
Я думаю, что у меня очень длинный запрос выполняется на одном из моих серверов баз данных, и я хотел бы отследить его и остановить (или человек, который продолжает его запускать).
17 ответов
Это покажет вам самые длинные запущенные SPIDs на сервере SQL 2000 или 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
Если вам нужно увидеть SQL, запущенный для данного spid из результатов, используйте что-то вроде этого:
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)
Если вы используете SQL Server 2005 или 2008, Вы можете использовать DMV, чтобы найти это...
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
- подробнее о Сыс.веб-узле MSDN
- подробнее о Сыс.dm_exec_sql_text, передав ей
вы можете запустить процедуры sp_who команда для получения списка всех текущих пользователей, сеансов и процессов. Затем вы можете запустить убить команда на любом spid, который блокирует другие.
в продукт встроены различные виды управления. В SQL 2000 Вы бы использовали ѕуѕргосеѕѕеѕсистемная. На SQL на 2k5 есть несколько видов, как Сыс.dm_exec_connections, Сыс.dm_exec_sessions и и Сыс.веб-узле MSDN.
есть также такие процедуры, как процедуры sp_who которые используют эти представления. В на 2k5 Управление Студии вы также получаете мониторинг активности.
и последнее, но не менее есть являются ли сценарии сообщества такими, как кто активен Адамом Махаником.
Я бы предложил запроса sys
вид. что-то похожее на
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
таким образом, вы можете получить TotalPagesAllocated
что может помочь вам выяснить spid
что занимает все ресурсы сервера. Есть много раз, когда я даже не могу поднять монитор активности и использовать их sys
вид, чтобы увидеть, что происходит.
Я бы рекомендовал вам прочитать следующую статью. я получил эту ссылку отсюда.
на самом деле, работает EXEC sp_who2
в Query Analyzer / Management Studio дает больше информации, чем sp_who
.
кроме того, вы можете настроить SQL Profiler для просмотра всего входящего и выходящего трафика на сервер. Профилировщик также позволит вам сузить именно то, что вы наблюдаете.
для SQL Server 2008:
START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler
имейте в виду, что профилировщик-это действительно приложение для ведения журнала и просмотра. Он будет продолжать регистрироваться и смотреть, пока он работает. Он может заполнить текстовые файлы или базы данных или жесткие диски, поэтому будьте осторожны, что у вас есть смотреть и как долго.
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
в Обозревателе объектов перейдите к: сервер - > управление - > Монитор активности. Это позволит вам увидеть все подключения к текущему серверу.
в качестве примечания Монитор активности SQL Server для SQL Server 2008 можно найти, щелкнув правой кнопкой мыши текущий сервер и перейдя в контекстное меню "Монитор активности". Я обнаружил, что это самый простой способ убить процессы, если вы используете SQL Server Management Studio.
вот запрос, который покажет любые запросы, которые блокируют. Я не совсем уверен, будет ли он просто показывать медленные запросы:
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 )
правильный скрипт будет выглядеть так:
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
в 2005 вы можете щелкнуть правой кнопкой мыши по базе данных, перейти к отчетам, и есть целый список отчетов о переходах и блокировках и т. д...
вы можете использовать ниже запрос, чтобы найти запуск последнего запроса:
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
используя скрипт ниже, вы также можете найти номер соединения для каждой базы данных:
SELECT
DB_NAME(DBID) AS DataBaseName
,COUNT(DBID) AS NumberOfConnections
,LogiName
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName
для больше деталей пожалуйста посетите: 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, 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
и
KILL @spid
используйте SQL Server Profiler (меню Сервис) для мониторинга выполнения запросов и используйте activity monitor в Management studio, чтобы узнать, как подключено и блокирует ли их соединение другие соединения.
вы должны попробовать очень полезная процедура sp_whoIsActive
который можно найти здесь:http://sqlblog.com/files/default.aspx и это бесплатно.
попробуйте с помощью этого:
он предоставит вам все запросы пользователей. До spid 50 все это сеансы внутреннего процесса sql server. Но, если вы хотите, вы можете удалить предложение 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