运行环境:
   有一套用pb9.0开发的业务系统。客户端数量在180个左右,有10个站点,每个站点有1-20台电脑使用该系统,系统数据库总数据量为1200万条记录。但每个表的数据都没有超过60万条;中心服务器配为IBM企业级服务器,2*4核2.6CPU,8G内存,Raid5磁盘阵列,SAS磁盘阵列柜,数据库是sqlserver2000,操作系统是WinServer2003;系统中心交换机为24端口准三层交换机,没有做VLAN,所有站的计算机都在同一段ip地址范围。但是交换机的每个端口都做了端口屏蔽的功能(每个站点都可以访问服务器,但是站和站之间不能相互访问)
故障现象:
各站点在使用业务系统处理业务时,系统突然会变得非常慢,数据查询和业务办理都很慢很慢甚至出现假死机。(该业务系统在多个地区运行都没有发现该问题,排除了病毒,系统变慢时在同一网络中运行的OA系统却没有影响)不是所有的机器都出现这个情况,大概每天都会一到两次,每次持续时间为5分钟-1小时不等.而且是随机出现,今天出现在这台电脑上,明天又出现在那台电脑上。出现系统变慢的时候,ping服务器网络通讯是正常的。重启服务器系统又正常了。通过观察sqlserver2000,发现数据库出现拥塞,有时候系统可以自己恢复,有时候要重新启动服务器才可以。数据库出现拥塞的时候,奇怪的是只有某些站点的计算机上的业务系统会变慢,并不是全网操作这套系统的机器都变慢。后来通过优化业务系统原代码和重新安装winServer2003和sqlserver2000(经分析发现阻塞来源为程序中的一条语句:select getdate() from gettimes ;gettimes为自己设计的一个表,里面只有一行数据。搞不清楚这么一条语句怎么引起阻塞,什么都没有提交啊;或者是不是还有其他原因???水品有限想不到其他原因),状况好了一些。但是现象还是会出现。发生频率大概是1到2天出现1次。请教各位朋友怎么找出故障啊?谢谢!

解决方案 »

  1.   

    分析引起阻塞的语句要DBCC INPUTBUFFER 结合sp_lock一起,
    搞清楚引起阻塞的spid锁定了哪些资源,然后再排查相关的语句。
      

  2.   

    关键是要找到对应的语句.
    才能找到问题所在.
    看对应的spid.
      

  3.   

    有啊,通过分析发现引起阻塞的语句:select getdate() from gettimes ;gettimes为自己设计的一个表,里面只有一行数据。搞不清楚这么一条语句怎么引起阻塞,什么都没有提交啊;
      

  4.   

    如何定位阻塞
    http://topic.csdn.net/u/20080714/23/3ef42c96-f92d-4d79-9ccb-9e0de62f55f0.html
    希望对你有帮助
      

  5.   

    我每次保存业务数据时都要先生成一个业务流水号。这个业务流水号是用存储过程来实现的。如下:@xhbm为业务类型,,@xhz 为返回的流水号值。大家看看有没有问题。 
    CREATE  PROCEDURE sp_getxhz @xhbm tinyint,@xhz int output 
    AS 
    begin tran 
      set @xhz=0 
        if not exists(select * from xhb where xhbm=@xhbm) 
          begin 
        set @xhz=0 
        insert into xhb values(@xhbm,0) 
        if @@error!=0 
            begin 
                      rollback tran 
                      return 25 
            end 
    end 
      select @xhz=xhz+1 from xhb where xhbm=@xhbm 
        update xhb set xhz=xhz+1 where xhbm=@xhbm 
    if @@error!=0 
        begin 
                    rollback tran 
            return 25 
        end 
    commit tran 
    return 0 
    GO 
    -------------------------------------------- pb程序里面调用的代码为: 
    ll_sfid=getxhz(100) 
    if ll_sfid <0 then 
        rollback; 
        messagebox("提示","得到收费序号失败。") 
        return 
    end if 
      

  6.   

    select getdate() from gettimes 为什么要这么写?你可以写为 select getdate() 
      

  7.   

    重新帮你修改了一下SP,省去了SELECT加S锁的过程.CREATE  PROCEDURE sp_getxhz @xhbm tinyint,@xhz int output
    AS
    begin tranSET @xhz=1
    UPDATE xhb SET  @xhz=xhz=xhz+1 FROM xhb WHERE xhbm=@xhbm
    IF @@ROWCOUNT=0
    INSERT INTO xhb VALUES (@xhbm,@xhz)
    IF @@ERROR!=0
    BEGIN
    ROLLBACK TRAN
    RETURN 25
    END
    COMMIT TRAN