OA的数据库最近多次出现某进程一直占用资源,导致其他进程无法执行。使用sp_who2 和 sql server profiler跟踪查询,发现有以下几个语句常常占用资源:
1、declare @P1 int set @P1=NULL declare @P2 int set @P2=0 declare @P3 int set @P3=0
exec sp_cursorprepexec @P1 output, @P2 output, N'@P0 nvarchar(4000)',
N'SELECT COUNT(*) AMOUNT FROM (
SELECT DISTINCT WFWorkItem.processChName as processChName,WFWorkItem.workItemDesc as workItemDesc,
...
from WFWorkItem ,WFWIParticipant
where WFWorkItem.workItemID = WFWIParticipant.workItemID
and (WFWorkItem.currentState = 10 AND WFWorkItem.participant = @P0 AND WFWIParticipant.partiInType=''EXE'')) T1 ',
4112, 1, @P3 output, N'chenhuifeng' select @P1, @P2, @P3
2、declare @P1 int set @P1=72 declare @P2 int set @P2=180150071 declare @P3 int set @P3=0
exec sp_cursorprepexec @P1 output, @P2 output, N'@P0 nvarchar(4000),@P1 nvarchar(4000)',
N'SELECT COUNT(*) AMOUNT FROM (
SELECT DISTINCT BH BH,BT BT,RQ RQ,
...
FROM V_CNMC_WFWOCANYULIUCHEN WHERE V_CNMC_WFWOCANYULIUCHEN.MKDM=@P0
and V_CNMC_WFWOCANYULIUCHEN.participant=@P1 ) T1 ', 4112, 1, @P3 output, N'411', N'puxin' select @P1, @P2, @P3
3、 set transaction isolation level read committed
这三条语句都是由普元eos工作流平台产生的,我们的OA使用了该平台,因此我们无法修改这些语句。
后来咨询数据库专家zz,回复说可能是sql server 2000 的问题。后来上网搜索,原来好多人遇到sql 2000出现数据库阻塞的现象,原因是sql2000在程序A对表Table1进行DML操作的时候,如果其他程序想Select 该Table1就会等待,知道程序A的DML操作结束,以免“脏读”。
我估计就是某DML操作一直进行,导致后面的select操作就一直等待。
新的问题又来了:
1、为什么以上列出的三条语句会一直占用资源?
2、OA已经用了至少5个年头,为什么最近会频繁出现阻塞?
3、之前有段时间出现过类似问题,但重启EOS服务就好了,然后一年多都没问题,这个又怎么解释?这一年也是每天用,总数据量也不大,目前工作流主表不到2W行数据。
暂时的解决方案是:升级sql server。