呵呵,可能是SQL语句设计有问题,设计程序时尽量少用锁(只读除外),否则性能肯定不佳切调试麻烦。有900个锁在我看来是不正常的,除非有这麽多同时连接的客户,还是要说具体些,才能判断清楚

解决方案 »

  1.   

    SQL sverver会自动设计锁的运用,但是如果自己该怎么利用锁呢?还请高手多多探讨这个话题吧
      

  2.   

    设计问题,你得逐步诊断你的问题所在,查询执行最长的50个语句:
    select top 50 
    qs.plan_handle, 
    qs.total_worker_time
    from 
    sys.dm_exec_query_stats qs
    order by qs.total_worker_time desc
    然后逐个检查,一步步调优
    可以使用nolock提示去处理,但不是最好的,你需要是去做啄木鸟,找出毛毛虫来,呵呵
      

  3.   

    LZ 应该优化一下Sql语句,很多select语句建议根据情况加上 with(nolock) 或者是 能忽略行级锁的WITH(UPDLOCK, READPAST),这样能避免很多超时的情况
    死锁的原因很多还是业务逻辑的原因,这个就比较麻烦了
      

  4.   

    转贴:
    Sql Server 2000数据库死锁的解决
    昨天下午准备给单位的服务器将趋势杀毒网络版换成服务器版。
    因为趋势的杀毒网络版需要一些我以前有在服务器上关掉的一些属性:
    一、注册表部分
    1.系统自动启用管理共享
    2.系统自动启用服务器共享
    3.不能隐藏自己的共享文件夹
    二、网卡部分
    1.要安装NetBios协议
    三、服务
    1.需要远程注册表修改服务(Remote Registry)必须启动。
    四、以前的网络版必须卸载掉
     
    因为要安装趋势杀毒服务版以上的条件缺一不可,在安装过程中服务器就重启好几次,在一次重启中,发现趋势杀毒服务版安装到77%停了下来,在服务器上也登陆不进去,等待了大概3分钟进去后发现MS SQL Server 2000启动不起来。
    经过几次重启服务器,MS SQL Server 2000依然不能启动。
    察看C:\Program Files\Microsoft SQL Server\MSSQL\LOG下的错误日志,发现其中有一条:
    ... server    使用 dynamic 锁分配。[2500] 锁块,[5000] 锁所有者块。
    我尝试着用单机(参数-m)或者最小模式(参数-f)来启动MS SQL Server 2000,但服务器系统中存在SQLSERVR的进程存在,启动失败。
    使用“Windows 任务管理器”不能杀掉此进程,后利用Norton的任务管理器强制杀掉此进程。C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.exe -m -f 
    以单机、最小模式启动sqlservr,成功。
    参看显示日志如下:
    ... server Warning: -f command line flag used...minimal server configured. 
    ... server SQL Server 正在以优先级“normal”(已检测到 2 CPUs)启动。      
    ... server 已为 thread 模式处理而配置了 SQL Server。                       
    ... server 使用 dynamic 锁分配。[2500] 锁块,[5000] 锁所有者块。           
    ... server 由于启动选项的原因跳过了 <a name="MS DTC"></a> 初始化。         
    ... spid4  警告 ******************                                         
    ... spid4  SQL Server 以单用户模式启动。允许对系统目录进行更新。           然后重启计算机,MS SQL Server 2000启动成功。
    事后分析看来这是MS DTC(Microsoft Distributed Transaction Coordinator)冲突,也就是趋势杀毒服务版的安装过程和MS Sql Server 2000启动可能是利用了同一的组件对象模块 (COM),因此产生了事务冲突。
    造成MS Sql Server 2000启动的事务冲突死锁。
      

  5.   

    楼上的是高手,但是似乎和我的问题关系不大。
    我这两天也在尝试着把数据库一些程序在优化,但是效果不大,我知道这样的过程需要很长的时间,不过还是希望能够得到大家的帮助。
    谢谢各位的回复,我很感激,我们的数据库现在的情况真的很严重。
    有的ERP的操作人员也在埋怨我们的系统好慢,有的时候在保存数据的时候都会超时,让人感觉很郁闷。
    希望大家共同讨论。。
    希望得到大家的帮助
      

  6.   

    个人认为正是因为没有合理使用事务和使用锁而造成的例如在存储过程中使用事务,创建表,然后又进行复杂的事物操作,系统在执行该过程时历时相对会比较长时间一点
    如果在这个时候去又又客户端使用DDL,DDL使用会等待该过程执行完毕,因为系统表被锁住了。临时想几个注意点给你:
    1.大事务,要限制其执行时间,超时就回滚,客户端捕抓该超时错误,稍后再自动提交给数据库处理
    2.多事务相争同一资源的时候,设置牺牲事务,同样返回错误给客户端,让前台语言包处理错误,稍后再提交,这样就不会造成:你等我的资源,我等你的资源,彼此相持的局面
    我认为前面两点比较重要
    3.合理锁定资源粒度,行级锁就够的,不要锁页,甚至锁表,这样其他并发事务就只能等它释放锁后才能执行
    4.一般少执行DDL,因为任何select查询在进行中,DDL只能等待;而一旦DDL在执行中又会让所有对该表操作的
    session处于等待中。
    5.定时使用的长事务,大事务,Job,数据库压缩等操作放在系统不忙得时间进行已经很久不用mssql了,即时所想,希望对你有启发