Thomson-Blog ( 学习,学习,再学习;努力,努力,再努力。)
在学习的路上不断成长,成功之路就在脚下。

There are various management views built into the product. On SQL 2000 you'd use sysprocesses. On SQL 2K5 there are more views like sys.dm_exec_connections, sys.dm_exec_sessions and sys.dm_exec_requests.

There are also procedures like sp_who that leverage these views. In 2K5 Management Studio you also get Activity Monitor.

This will show you the longest running SPIDs on a SQL 2000 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 

If you need to see the SQL running for a given spid from the results, use something like this:

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)

here is a query that will show any queries that are blocking. I am not entirely sure if it will just show slow queries:

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 )

if you're running SQL 2005 or 2008, you could use the DMV's to find this...

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


posted on 2010-07-09 09:02  Thomson-Blog  阅读(387)  评论(0编辑  收藏  举报