是整个服务器的sp_who2,为什么它没有检测到所有高优先级进程?

时间:2012-02-24 17:15:27

标签: sql-server sql-server-2000

我正在看sp_who2,好像所有进程都处于睡眠模式,而我们的网站速度非常慢。如果sp_who2只查看当前数据库,或者查看另一个数据库可能导致问题而sp_who2只查看当前数据库,那我就在徘徊。

还有一种方法可以检测sql进程是否以更高的优先级运行并阻止其他进程。当我运行sp_who2时,我们有几个通常处于可运行状态的进程,但它们都处于休眠状态,我试图找出阻塞它们的内容。很高兴检测一个进程是否阻止了其他sql进程。

还有一个BlkBy列,我们设置相同的进程ID为77,我认为这意味着阻止所有其他进程,但我不确定。有谁知道BlkBy的意思?

我把asterics ** **放在了我认为是罪魁祸首的地方。有没有办法改变优先级或阻止,所以它不再阻止。 THX

SPID    Status                          Login       HostName        BlkBy   DBName  Command CPUTime DiskIO  LastBatch   ProgramName SPID
76      sleeping                        db\uname    UNAME             .     db  AWAITING COMMAND    0   0   02/24 09:15:54  srv / db                                        76   
77      sleeping                        db\uname    UNAME             .     db  SELECT              705422  0   02/24 09:25:49  srv / db                                        77   
77      sleeping                        db\uname    UNAME             .     db  SELECT              16  0   02/24 09:25:49  srv / db                                        77   
77      sleeping                        db\uname    UNAME           **77**      db  SELECT              32  0   02/24 09:25:49  srv / db                                        77   
77      sleeping                        db\uname    UNAME           **77**      db  SELECT              31  0   02/24 09:25:49  srv / db                                        77   
77      sleeping                        db\uname    UNAME             .     db  SELECT              16  0   02/24 09:25:49  srv / db                                        77   

感谢。

1 个答案:

答案 0 :(得分:1)

如果未明确指定spid,

sp_who2将显示整个服务器连接

对于锁定,请参阅

exec sp_locks

详细了解谁阻止谁:

set nocount on

create table #t_sql (EventType text, Parameters int,EventInfo text, spid smallint default(0))
declare @qs_blocking_list table (
    spid int,
    blocked int,
    loginame sysname,
    nt_username sysname,
    lastwaittype sysname,
    waitresource sysname,
    status sysname,
    waittime bigint,
    program_name sysname,
    cmd sysname,
    cpu bigint,
    physical_io bigint,
    hostname sysname,
    dbid int
)   
    insert into @qs_blocking_list (
        spid ,
        blocked ,
        loginame, 
        nt_username ,
        lastwaittype ,
        waitresource ,
        status ,
        waittime ,
        program_name ,
        cmd ,
        cpu ,
        physical_io ,
        hostname ,
        dbid 
    )
    select  
        spid ,
        blocked ,
        loginame, 
        nt_username ,
        lastwaittype ,
        waitresource ,
        status ,
        waittime ,
        program_name ,
        cmd ,
        cpu ,
        physical_io ,
        hostname ,
        dbid 
    from master.dbo.sysprocesses
delete from @qs_blocking_list
where not ( blocked <> 0 or (spid in (select blocked from @qs_blocking_list)) )
declare @spid   smallint
declare @sql    nvarchar(255)
set @spid = 0
while 1=1
begin
    select @spid = min(spid) from @qs_blocking_list where @spid<spid
    if @spid is null
        break 
    set @sql = 'dbcc inputbuffer ('+convert(nvarchar(20),@spid)+')'
    insert into #t_sql (EventType, Parameters, EventInfo)
    exec (@sql)
    update #t_sql set spid = @spid where spid = 0
end
set nocount off
select  b.spid              as 'spid'
    ,   blocked             as 'BlockedBySPID'
    ,   rtrim(loginame)     as 'SQLUser'
    ,   rtrim(nt_username)  as 'NTUser'
    ,   rtrim(lastwaittype) as 'Type'
    ,   rtrim(waitresource) as 'Resource'
    ,   rtrim(status) + 
            case when blocked > 0 then ' and blocked' else '' end +
            case when b.spid in (select blocked from @qs_blocking_list) then ' and blocking' else '' end as 'Status'
    ,   waittime            as 'WaitTimeMS'
    ,   rtrim(program_name) as 'Program'
    ,   rtrim(cmd)          as 'Command'
    ,   cpu                 as 'CPU'
    ,   physical_io         as 'PhysicalIO'
    ,   rtrim(hostname)     as 'HostName'
    ,   case
            when dbid = 0 then ''
        else
            db_name(dbid)       
        end                 as 'DBName'
    ,   isnull(sql.EventInfo,'/* SQL Text not available */')    as 'sql_text'
from @qs_blocking_list b
left outer join #t_sql sql on b.spid = sql.spid

drop table #t_sql