SQL Server에서 실행되는 쿼리 나열


200

현재 MS SQL Server (Enterprise Manager 또는 SQL을 통해)에서 실행중인 쿼리 및 / 또는 누가 접속 한 쿼리를 나열 할 수 있습니까?

데이터베이스 서버 중 하나에서 매우 오래 실행되는 쿼리가 실행되고 있다고 추적하고 추적을 중지하고 싶습니다 (또는 계속 시작하는 사람).

답변:


203

SQL 2000 또는 SQL 2005 서버에서 가장 오래 실행되는 SPID가 표시됩니다.

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

결과에서 주어진 spid에 대해 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
예를 들어 master에 대한 참조를 제거하여 SQL v12 + (예 : Azure)에서 작동하도록이를 수정할 수 있습니다. 'master.dbo.sysprocesses'를 'dbo.sysprocesses'로 교체
Kevin

ms양자화를로 바꾸는 것이 좋습니다 s. 가능한 오버플로가 발생할 수 있습니다 (나를 위해).
Zverev Evgeniy

Azure의 경우 "sys.sysprocesses"를 사용하여 "master.dbo.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
현재 데이터베이스 호환성 수준이 90보다 낮 으면이 쿼리가 SQL Server 2005에서 작동하지 않습니다. 현재 데이터베이스 호환성이 낮은 경우이 쿼리를 실행하려면 마스터 데이터베이스로 전환하십시오.
Alexander Pravdin

31

sp_who 명령을 실행하여 모든 현재 사용자, 세션 및 프로세스 목록을 얻을 수 있습니다 . 그런 다음 다른 사람을 차단하는 모든 spid 에서 KILL 명령 을 실행할 수 있습니다 .


3
항상 도움이되는 것은 아닙니다. 때로는 OPENQUERY 또는 연결된 서버를 사용하는 경우 쿼리가 하위 spid를 생성하는 것처럼 보입니다. sp_who의 부모 쿼리가 무엇인지 말하기가 어려울 수 있습니다.
Nathan

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에서는 sysprocesses를 사용 합니다. SQL 2K5에는 sys.dm_exec_connections , sys.dm_exec_sessionssys.dm_exec_requests 와 같은 뷰가 더 있습니다 .

이러한 뷰를 활용하는 sp_who 와 같은 절차도 있습니다. 2K5 Management Studio 에는 Activity Monitor도 있습니다.

마지막 으로 Adam MachanicWho Is Active 같은 커뮤니티 기여 스크립트가 있습니다 .


11

실제로 EXEC sp_who2Query Analyzer / Management Studio에서 실행 하면 더 많은 정보가 제공됩니다.sp_who .

그 외에도 서버에 대한 모든 인 / 아웃 트래픽을 감시하도록 SQL 프로파일 러를 설정할 수 있습니다. 프로파일 러는 또한보고있는 내용을 정확하게 좁힐 수 있습니다.

SQL Server 2008의 경우 :

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler

프로파일 러는 진정으로 로깅 및 시청 앱입니다. 실행중인 한 계속 기록하고 감시합니다. 텍스트 파일이나 데이터베이스 또는 하드 드라이브를 채울 수 있으므로보고있는 내용과 시간을주의하십시오.


1
SQL Server 프로파일 러는 모두가 시작해야 할 곳입니다.
Shane

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 2008 용 SQL Server 활동 모니터는 현재 서버를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 "활동 모니터"로 이동하면 찾을 수 있습니다. SQL Server Management Studio를 사용하는 경우 이것이 프로세스를 종료하는 가장 쉬운 방법이라는 것을 알았습니다.


이것은 코멘트 였어야하지만, 그렇습니다. 매우 유용하고 답변으로 더 많은 가시성을 얻습니다. 감사합니다
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

이것으로 시도하십시오 :

모든 사용자 쿼리를 제공합니다. 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

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로 죽이면 하나의 쿼리 만 죽일 것입니까? 내 의심은 spid이고 session_is는 해당 세션이나 서버에서 실행중인 각 쿼리에 고유합니까?
buttowski

1

SQL Server 프로파일 러 (도구 메뉴)를 사용하여 실행 쿼리를 모니터링하고 Management Studio에서 활동 모니터를 사용하여 연결 방법 및 연결이 다른 연결을 차단하는지 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.