Является ли sp_who2 для всего сервера и почему он не обнаруживает все процессы с высоким приоритетом? - PullRequest
2 голосов
/ 24 февраля 2012

Я смотрю на sp_who2, и кажется, что все процессы находятся в спящем режиме, а наш сайт работает очень медленно. Я бродил, если sp_who2 просматривает только текущую базу данных, или она смотрит на другую базу данных, может быть причиной проблемы, а sp_who2 смотрит только на текущую базу данных.

Также есть способ определить, выполняется ли процесс sql с более высоким приоритетом и блокирует ли он другие процессы. Когда я запустил sp_who2, у нас было несколько процессов, которые обычно находятся в работоспособном состоянии, но все они были в спящем состоянии, и я пытался выяснить, что их блокировало. Было бы неплохо определить, блокирует ли процесс другие процессы SQL.

Существует также столбец BlkBy, в котором мы установили одинаковый идентификатор процесса 77, что, я думаю, означает блокирование всех других процессов, но я не уверен. Кто-нибудь знает, что означает BlkBy?

Я поместил звездочки ** ** вокруг того, что я считаю виновником. Есть ли способ изменить приоритет или блокировку, чтобы он больше не блокировал. ТНХ

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 Ответ

1 голос
/ 24 февраля 2012

sp_who2 показать все соединения с сервером, если вы не указали spid явно

О блокировках см.

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
...