Перерахуйте запити, запущені на 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.