Перерахуйте запити, запущені на 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 працює для даного павука з результатів, використовуйте щось подібне:

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.sysprocess" на "dbo.sysprocess"
Кевін

Я б запропонував замінити msквантування на s. Можливо можливе переповнення (трапилося для мене).
Звєрєв Євгеній

Для Azure вам може знадобитися змінити "master.dbo.sysprocess" на "sys.sysprocess"
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. Якщо ваша поточна сумісність баз даних нижча, перейдіть до головного DB, щоб запустити цей запит.
Олександр Правдін

31

Ви можете запустити команду sp_who, щоб отримати список усіх поточних користувачів, сеансів та процесів. Потім можна запустити команду KILL на будь-якому павуці, що блокує інших.


3
Це не завжди корисно. Іноді запити видають нерестові дорожні шпигуни, особливо коли використовується 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, який дає дуже гарну візуальну картину того, що відбувається на сервері. Одне з поганих речей у цьому полягає в тому, що він говорить про те, хто є жертвою, але важко зрозуміти, хто споживає ресурси. Це все-таки допоможе.
dhi

16

У продукт вбудовані різні погляди управління. На SQL 2000 ви б використовували системні процеси . У SQL 2K5 є більше представлень, таких як sys.dm_exec_connections , sys.dm_exec_sesions та sys.dm_exec_requests .

Існують також такі процедури, як sp_who, які підтримують ці погляди. У студії управління 2K5 ви також отримуєте Монітор активності.

І останнє, але не в останню чергу, існують сценарії, створені спільнотою, як « Хто є активний» Адама Маханіка .


11

Насправді, робота EXEC sp_who2в аналізаторі запитів / студії управління дає більше інформації, ніж sp_who.

Крім цього, ви можете налаштувати SQL Profiler для перегляду всього вхідного та вихідного трафіку на сервер. 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.


Це повинен був бути коментарем, але, так, це настільки корисно, і він отримує більшу видимість як відповідь :-) І це мені зараз допомогло. Дякую
Loudenvier

9

У Провіднику об'єктів виберіть на панелі: Сервер -> Управління -> Монітор активності. Це дозволить побачити всі з'єднання на поточному сервері.


1
Я не бачу нічого під назвою "Монітор активності" під управлінням у 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

Спробуйте з цим:

Він надасть вам усі запити користувачів. До 50-ти spid, все це внутрішні сеанси обробки сервера sql. Але, якщо ви хочете, ви можете видалити де пункт:

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

2
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 є унікальними для кожного запиту, який виконується на цьому сеансі чи сервері?
buttowski

1

Використовуйте програму Sql Server Profiler (меню інструментів) для контролю за виконанням запитів та використанням монітора активності в студії управління, щоб побачити, як підключено і чи не блокує їх з'єднання інші з'єднання.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.