SQL Server에서 실행 중인 쿼리 나열
(Enterprise Manager 또는 SQL을 통해) MS SQL Server에서 현재 실행 중인 쿼리 및/또는 연결된 사용자를 나열할 수 있는 방법이 있습니까?
데이터베이스 서버 중 하나에서 실행 중인 쿼리가 매우 길어서 이를 추적하여 중지하고 싶습니다.
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
결과에서 특정 스파이드에 대해 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)
SQL Server 2005 또는 2008을 실행하고 있는 경우 DMV를 사용하여 다음 정보를 찾을 수 있습니다.
SELECT *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
- sys.dm_exec_module 상세
- sys.dm_exec_sql_text 상세
sp_who 명령을 실행하여 현재 모든 사용자, 세션 및 프로세스의 목록을 가져올 수 있습니다.그런 다음 다른 스파이드를 차단하는 모든 스파이드에서 KILL 명령을 실행할 수 있습니다.
질문할 것을 제안합니다.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
뷰에서 확인할 수 있습니다.
다음 기사를 읽으시길 권합니다.이 레퍼런스는 여기서 얻은 것입니다.
참고로 SQL Server 2008용 SQL Server Activity Monitor는 현재 서버를 오른쪽 클릭하여 컨텍스트메뉴의 [Activity Monitor](액티비티 모니터)로 이동합니다.SQL Server Management Studio를 사용하는 경우 이 방법이 프로세스를 종료하는 가장 쉬운 방법입니다.
제품에는 다양한 관리 뷰가 내장되어 있습니다.SQL 2000에서는 syspprocesses를 사용합니다.SQL 2K5에는 sys.dm_exec_connections, sys.dm_exec_sec 및 sys.dm_exec_sec 등의 뷰가 더 있습니다.
이러한 뷰를 활용하는 sp_who와 같은 절차도 있습니다.2K5 Management Studio에서는 Activity Monitor도 사용할 수 있습니다.
마지막으로 Adam Machanic의 Who Is Active와 같은 커뮤니티에 공헌한 스크립트가 있습니다.
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
사실, 달리는 중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
프로파일러는 실제로 로깅 및 감시 앱이라는 점에 유의하십시오.동작하고 있는 동안은, 로그와 감시를 계속합니다.텍스트 파일, 데이터베이스 또는 하드 드라이브가 가득 찰 수 있으므로 무엇을 얼마나 오래 시청할 수 있는지 주의하십시오.
오브젝트 탐색기에서 [Server]-> [ Management ]-> [ Activity Monitor ]으로 드릴다운합니다.그러면 현재 서버에 대한 모든 연결을 볼 수 있습니다.
다음 쿼리를 사용하여 실행 중인 마지막 요청을 찾을 수 있습니다.
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/ 를 참조해 주세요.
다음은 차단 중인 쿼리를 표시하는 쿼리입니다.느린 쿼리만 표시될지는 잘 모르겠습니다.
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 )
적절한 스크립트는 다음과 같습니다.
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
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
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,
MAX(p.loginame) AS loginame,
(SELECT SUBSTRING(text, COALESCE(NULLIF(spid.stmt_start, 0), 1) + 1, CASE spid.stmt_end WHEN -1 THEN DATALENGTH(text) ELSE (spid.stmt_end - spid.stmt_start) END) FROM ::fn_get_sql(spid.[sql_handle])) AS [sql]
FROM
master.dbo.sysprocesses p
LEFT JOIN (
SELECT
ROW_NUMBER() OVER(PARTITION BY spid ORDER BY ecid) AS i,
spid,
[sql_handle],
CASE stmt_start WHEN 0 THEN 0 ELSE stmt_start / 2 END AS stmt_start,
CASE stmt_end WHEN -1 THEN -1 ELSE stmt_end / 2 END AS stmt_end
FROM sys.sysprocesses
) spid ON p.spid = spid.spid AND spid.i = 1
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')
GROUP BY
p.spid,
p.last_batch,
p.[program_name],
p.hostname,
spid.stmt_start,
spid.stmt_end,
spid.[sql_handle]
ORDER BY
batch_duration DESC,
p.spid
;
SQL Server Profiler(도구 메뉴)를 사용하여 실행 쿼리를 모니터링하고 Management 스튜디오에서 액티비티 모니터를 사용하여가 연결되어 있는지, 그 연결이 다른 연결을 차단하고 있는지 확인합니다.
한 절차를 .sp_whoIsActive
http://whoisactive.com에서 무료로 보실 수 있습니다.
언급URL : https://stackoverflow.com/questions/941763/list-the-queries-running-on-sql-server
'programing' 카테고리의 다른 글
SQL Server의 임시 테이블과 테이블 변수의 차이점은 무엇입니까? (0) | 2023.04.07 |
---|---|
T-SQL을 사용하여 하위 문자열의 마지막 항목 색인 찾기 (0) | 2023.04.07 |
잭슨:각 값에 대해 올바른 유형의 맵으로 역직렬화 (0) | 2023.04.02 |
사용자 정의 유효성 검사 angularjs 지시문을 테스트하려면 (0) | 2023.04.02 |
H2-콘솔이 브라우저에 표시되지 않음 (0) | 2023.04.02 |