日期:2014-05-18  浏览次数:20497 次

关于锁/进程ID的问题
想请问一下,在管理器里打开管理-> 当前活动-> 锁/进程ID里看到最大一个spid   383,请问这是不是指共383个进程在运行?还是这是导致SQL   SERVER慢的原因吗?

------解决方案--------------------
--查詢分析中執行下面語句即可找到所有死鎖的進程了
select * from master.dbo.sysprocesses where blocked=1

------解决方案--------------------
--查进程锁,执行语句

CREATE PROCEDURE usp_sys_getblockedprocessinfo AS
declare @begin_id int,--开始ID
@end_id int,--结束ID
@spid int,--进程ID
@exec_sql varchar(8000)--执行语句


--创建进程临时表(不使用游标避免锁的发生)
CREATE TABLE [#tmp_sysprocesses] (
[id] [numeric] (18,0) IDENTITY(1,1) NOT NULL,
[BLOCKED] [smallint] NOT NULL,
[spid] [smallint] NOT NULL ,
[eventinfo] nvarchar(3500) NULL,
[userid] varchar(20) null,
[cpu] int null,
[hostname] varchar(30) null
)


if exists(select * from master..sysprocesses with(nolock) where blocked <> 0)
begin

--创建进程最后一次提交语句临时表
create table #tmp_inputbuffer(
EventType nvarchar(30) NULL,
Parameters int NULL,
EventInfo nchar(255) NULL)


--插入进程数据
insert into #tmp_sysprocesses(spid,blocked,userid,cpu,hostname)
select a.spid,a.blocked,b.user_name,a.cpu,a.hostname
from master..sysprocesses a with(nolock),
kfc_user b with(nolock)
where (a.blocked <> 0 or a.spid in (select blocked from master..sysprocesses with(nolock) where blocked <> 0 )
) and a.loginame = b.user_id
--循环取进程最后执行语句
select @begin_id = min(id),
@end_id = max(id)
from #tmp_sysprocesses
while @begin_id <= @end_id
begin
--取进程ID
select @spid = spid
from #tmp_sysprocesses
where id = @begin_id
select @exec_sql = 'DBCC INPUTBUFFER ( ' + convert(varchar(10),@spid) + ') '
delete from #tmp_inputbuffer
--取进程最后执行语句
insert into #tmp_inputbuffer(EventType,Parameters,EventInfo)
exec(@exec_sql)
select top 1 @exec_sql = EventInfo
from #tmp_inputbuffer
--更新进程最后执行语句
update #tmp_sysprocesses
set EventInfo = @exec_sql
where id = @begin_id
--循环变量累加
select @begin_id = @begin_id + 1
end
--drop table #tmp_inputbuffer
--显示进程信息
end

select spid,blocked,EventInfo,userid,cpu,hostname from #tmp_sysprocesses ORDER BY blocked
drop table #tmp_sysprocesses
GO
------解决方案--------------------
mark '
------解决方案--------------------
建議gahade(与君共勉)將--delete from #tmp_inputbuffer
改為:truncate table #tmp_inputbuffer

truncate table #tmp_sysprocesses --drop 之前加上此句減少日誌備份
drop table #tmp_sysprocesses
------解决方案--------------------
mark~~~
------解决方案--------------------
rockyljt(江濤) ( ) 信誉:100 Blog 2007-03-31 15:52:44 得分: 0


建議gahade(与君共勉)將--delete from #tmp_inputbuffer
改為:truncate table #tmp_inputbuffer

truncate table #tmp_sysprocesses --drop 之前加上此句減少日誌備份
drop table #tmp_sysprocesses

--------------------------
对临时表的操作不记录日志文件中.
只记录于tempdb中.
------解决方案--------------------
用sp_lock也可以看锁的情况
------解决方案--------------------
383只是一个ID而已,不一定就代表383个进程的。
sqlserver慢的原因有很多,建议参考sqlserver服务器配置。。
------解决方案--------------------