Перечислите запросы, работающие на 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.