2009-06-02 42 views
154

Có cách nào để liệt kê các truy vấn hiện đang chạy trên MS SQL Server (thông qua Enterprise Manager hoặc SQL) và/hoặc ai đã kết nối không?Liệt kê các truy vấn đang chạy trên SQL Server

Tôi nghĩ rằng tôi đã có một truy vấn chạy rất dài đang được thực hiện trên một trong các máy chủ cơ sở dữ liệu của tôi và tôi muốn theo dõi nó xuống và ngăn chặn nó (hoặc người bắt đầu nó).

+1

Tôi đang sử dụng SQL Sever 8.0.x – BIBD

Trả lời

157

này sẽ cho bạn thấy spids chạy dài nhất trên SQL 2000 hoặc SQL 2005 server:

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 

Nếu bạn cần phải xem SQL chạy trong một spid đưa ra từ kết quả, sử dụng một cái gì đó như thế này:

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 master.dbo.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) 
26

Bạn có thể chạy lệnh sp_who để nhận danh sách tất cả người dùng, phiên và quy trình hiện tại. Sau đó, bạn có thể chạy lệnh KILL trên bất kỳ spid nào đang chặn người khác.

+2

Điều này không phải lúc nào cũng hữu ích. Đôi khi các truy vấn dường như đẻ trứng của con, đặc biệt là khi OPENQUERY hoặc các máy chủ được liên kết đang được sử dụng. Nó có thể được khó khăn để biết truy vấn cha mẹ chỉ là từ sp_who là gì. – Nathan

0

Sử dụng Sql Server Profiler (trình đơn công cụ) để theo dõi các truy vấn thực thi và sử dụng giám sát hoạt động trong Management studio để xem cách kết nối và kết nối của chúng có chặn các kết nối khác không.

3

năm 2005 bạn có thể nhấp chuột phải vào một cơ sở dữ liệu, đi đến báo cáo và có một danh sách toàn bộ các báo cáo về quá trình chuyển đổi và ổ khóa vv ...

3

đây là một truy vấn mà sẽ hiển thị bất cứ thắc mắc rằng đang chặn. Tôi không hoàn toàn chắc chắn nếu nó sẽ chỉ hiển thị các truy vấn chậm:

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) 
10

Trên thực tế, chạy EXEC sp_who2 trong Query Analyzer/Management Studio cho biết thêm hơn sp_who.

Ngoài ra bạn có thể thiết lập SQL Profiler để xem tất cả lưu lượng vào và ra cho máy chủ. Profiler cũng cho phép bạn thu hẹp chính xác những gì bạn đang xem.

Đối với SQL Server 2008:

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

Hãy ghi nhớ rằng các hồ sơ thực sự là một khai thác gỗ và xem ứng dụng. Nó sẽ tiếp tục đăng nhập và xem miễn là nó đang chạy. Nó có thể điền vào các tập tin văn bản hoặc cơ sở dữ liệu hoặc ổ đĩa cứng, vì vậy hãy cẩn thận những gì bạn có nó xem và trong bao lâu.

+0

SQL Server Profiler là nơi mọi người nên bắt đầu, chắc chắn! – Shane

14

Có nhiều chế độ xem quản lý khác nhau được tích hợp vào sản phẩm. Trên SQL 2000 bạn muốn sử dụng sysprocesses. Trên SQL 2K5 có nhiều lượt xem hơn như sys.dm_exec_connections, sys.dm_exec_sessionssys.dm_exec_requests.

Cũng có các quy trình như sp_who tận dụng các chế độ xem này. Trong 2K5 Management Studio bạn cũng nhận được Giám sát hoạt động.

Và cuối cùng nhưng không kém phần quan trọng là các tập lệnh được cộng đồng đóng góp như Who Is Active by Adam Machanic.

+1

SQL 8.0.x cũng được biết đến. SQL 2000 –

74

Nếu bạn đang chạy SQL Server 2005 hoặc 2008, bạn có thể sử dụng của DMV để tìm thấy điều này ...

SELECT * 
FROM sys.dm_exec_requests 
     CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
+0

Truy vấn này không hoạt động trong SQL Server 2005 nếu mức độ tương thích của cơ sở dữ liệu hiện tại thấp hơn 90. Nếu khả năng tương thích cơ sở dữ liệu hiện tại của bạn thấp hơn, hãy chuyển sang db chính để chạy truy vấn này. –

7

Trong Object Explorer, hãy xem chi tiết: Server -> Management -> Activity Monitor. Điều này sẽ cho phép bạn xem tất cả các kết nối trên máy chủ hiện tại.

+0

Tôi không thấy bất cứ điều gì được gọi là Hoạt động giám sát theo quản lý trên SQL 2008. – jpierson

14

Tôi khuyên bạn nên truy vấn chế độ xem sys. một cái gì đó tương tự như

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 

Bằng cách này bạn có thể nhận được một TotalPagesAllocated mà có thể giúp bạn tìm ra spid được tham gia tất cả các nguồn tài nguyên máy chủ. Có rất nhiều lần tôi thậm chí không thể theo dõi hoạt động và sử dụng các chế độ xem sys này để xem điều gì đang diễn ra.

Tôi khuyên bạn nên đọc bài viết sau. I got this reference from here.

+0

Chúng tôi cũng sử dụng phân tích hiệu suất Quest DB cung cấp cho một hình ảnh trực quan rất tốt về những gì đang xảy ra trong máy chủ. Một trong những điều xấu về điều đó là nó nói với ai là nạn nhân nhưng thật khó để tìm ra ai đang tiêu thụ tài nguyên. Điều này sẽ giúp mặc dù. – dhi

1
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 
+1

điều này sẽ ổn thôi .. !! và nếu tôi giết bằng spid. sẽ chỉ giết một truy vấn? nghi ngờ của tôi là spid và session_is là duy nhất cho mỗi truy vấn đang chạy trong phiên hoặc máy chủ đó? – buttowski

+0

Từ đâu đến?Truy vấn này có lỗi cú pháp đối với tôi. – jpierson

+0

Tôi nghĩ rằng truy vấn này được viết trên bay vì vậy tôi chỉnh sửa nó;). –

10
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 
4

Các kịch bản đúng sẽ là như thế này:

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 
3

Bạn có thể sử dụng dưới đây truy vấn để tìm chạy yêu cầu cuối cùng:

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 

Sử dụng dưới kịch bản bạn cũng có thể tìm thấy số lượng kết nối cho mỗi cơ sở dữ liệu:

SELECT 
    DB_NAME(DBID) AS DataBaseName 
    ,COUNT(DBID) AS NumberOfConnections 
    ,LogiName 
FROM sys.sysprocesses 
WHERE DBID > 0 
GROUP BY DBID, LogiName 

Để biết thêm chi tiết vui lòng truy cập: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

3

Là một lưu ý, Monitor SQL Server Hoạt động cho SQL Server 2008 có thể được tìm thấy bằng cách nhấp chuột phải vào máy chủ hiện tại của bạn và đi tới "Activity Monitor" trong menu ngữ cảnh. Tôi thấy đây là cách dễ nhất để giết các quá trình nếu bạn đang sử dụng SQL Server Management Studio.

+0

Điều này cần phải có một bình luận, nhưng, có, nó rất hữu ích và nó được hiển thị nhiều hơn như là một câu trả lời :-) Và nó đã giúp tôi ra ngay bây giờ. Cảm ơn bạn – Loudenvier

Các vấn đề liên quan