Список запросов, выполняемых на SQL Server
есть ли способ перечислить запросы, которые в настоящее время выполняются на MS SQL Server (либо через Enterprise Manager, либо SQL) и/или кто подключен?
Я думаю, что у меня очень длинный запрос выполняется на одном из моих серверов баз данных, и я хотел бы отследить его и остановить (или человека, который продолжает его запускать).
17 ответов:
Это покажет вам самые длинные запущенные Spid на сервере 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)
- подробнее о sys. dm_exec_requests
- подробнее о sys. dm_exec_sql_text
вы можете запустить процедуры sp_who команда для получения списка всех текущих пользователей, сеансов и процессов. Затем вы можете запустить убить команда на любом spid, который блокирует другие.
в продукт встроены различные виды управления. На SQL 2000 Вы бы использовали sysprocesses. На SQL 2K5 есть больше представлений, таких какsys. dm_exec_connections, sys. dm_exec_sessions и sys. dm_exec_requests.
есть также процедуры, такие как процедуры sp_who которые используют эти взгляды. В на 2k5 Management Studio вы также получаете мониторинг активности.
и последнее, но не менее есть являются ли сценарии сообщества, такие как кто активен Адамом Махаником.
Я бы предложил запроса
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 (меню Сервис) для мониторинга выполнения запросов и используйте монитор активности в среде 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
Comments