Перечислите запросы, работающие на SQL Server


200

Есть ли способ перечислить запросы, которые в настоящее время выполняются на MS SQL Server (через Enterprise Manager или SQL) и / или кто подключен?

Я думаю, что у меня есть очень долго выполняющийся запрос, который выполняется на одном из моих серверов баз данных, и я хотел бы отследить его и остановить его (или человека, который продолжает его запускать).

Ответы:


203

Это покажет вам самые длительные 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    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)

3
Вы можете изменить это для работы с SQL v12 + (т.е. Azure), удалив ссылки на master, например. замените 'master.dbo.sysprocesses' на 'dbo.sysprocesses'
Кевин

Я бы предложил заменить msквантование на s. Может произойти переполнение (произошло для меня).
Зверев Евгений

Для Azure вам может потребоваться изменить «master.dbo.sysprocesses» на «sys.sysprocesses»
Danton Heuer

93

Если вы используете SQL Server 2005 или 2008, вы можете использовать DMV, чтобы найти это ...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  

1
Этот запрос не работает в SQL Server 2005, если текущий уровень совместимости базы данных ниже 90. Если ваша текущая совместимость базы данных ниже, переключитесь на master db, чтобы выполнить этот запрос.
Александр Правдин

31

Вы можете запустить команду sp_who, чтобы получить список всех текущих пользователей, сеансов и процессов. Затем вы можете запустить команду KILL на любом спиде, который блокирует других.


3
Это не всегда полезно. Иногда кажется, что запросы порождают дочерние spid, особенно когда используются OPENQUERY или связанные серверы. Может быть трудно сказать, что является родительским запросом только из sp_who.
Натан

17

Я бы предложил запросить 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представления, чтобы увидеть, что происходит.

Я бы порекомендовал вам прочитать следующую статью. Я получил эту ссылку отсюда .


1
Мы также используем анализ производительности Quest DB, который дает очень хорошую визуальную картину того, что происходит на сервере. Одна из неприятностей в том, что она говорит, кто является жертвой, но трудно определить, кто потребляет ресурсы. Это поможет, хотя.
Dhi

16

В продукт встроены различные управленческие представления. В SQL 2000 вы бы использовали системные процессы . В SQL 2K5 есть больше представлений, таких как sys.dm_exec_connections , sys.dm_exec_sessions и sys.dm_exec_requests .

Есть также процедуры, такие как sp_who, которые используют эти представления. В 2K5 Management Studio вы также получаете Activity Monitor.

И, наконец, что немаловажно, есть сценарии сообщества, такие как « Кто активен» Адама Маханича .


11

На самом деле, работа 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

Имейте в виду, что профилировщик действительно приложение для регистрации и просмотра. Он будет продолжать регистрироваться и смотреть, пока он работает. Он может заполнять текстовые файлы, базы данных или жесткие диски, поэтому будьте осторожны с тем, что у вас есть и как долго.


1
SQL Server Profiler - это то, с чего все должны начинать!
Шейн

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

11

Как примечание, Монитор активности SQL Server для SQL Server 2008 можно найти, щелкнув правой кнопкой мыши текущий сервер и выбрав «Монитор активности» в контекстном меню. Я обнаружил, что это был самый простой способ убить процессы, если вы используете SQL Server Management Studio.


Это должен был быть комментарий, но, да, он настолько полезен, и в ответ он становится более заметным :-) И он помог мне прямо сейчас. Спасибо
Loudenvier

9

В обозревателе объектов перейдите к: Сервер -> Управление -> Монитор активности. Это позволит вам увидеть все соединения с текущим сервером.


1
Я не вижу ничего под названием Activity Monitor под управлением на SQL 2008.
jpierson

5

Вот запрос, который покажет любые запросы, которые блокируют. Я не совсем уверен, будут ли показываться медленные запросы:

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 )

5

Правильный сценарий будет выглядеть так:

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

5

Вы можете использовать запрос ниже, чтобы найти запущенный последний запрос:

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/


4

в 2005 году вы можете щелкнуть правой кнопкой мыши по базе данных, перейти к отчетам и получить полный список отчетов о переходах, блокировках и т. д.


4

Попробуйте с этим:

Он предоставит вам все пользовательские запросы. До spid 50, это все сеансы внутреннего процесса sql сервера. Но, если вы хотите, вы можете удалить предложение 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

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

И

KILL @spid

2
это будет хорошо .. !! и если я убью спидом. это убьет только один запрос? я сомневаюсь, что spid и session_is уникальны для каждого запроса, который выполняется в этом сеансе или на сервере?
Бутовски

1

Используйте Sql Server Profiler (меню инструментов) для мониторинга выполнения запросов и используйте монитор активности в Management studio, чтобы увидеть, как подключено, и блокирует ли их подключение другие подключения.


1

Вы должны попробовать очень полезную процедуру, sp_whoIsActiveкоторую можно найти здесь: http://whoisactive.com, и это бесплатно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.