解决方案 »

  1.   

    从你的第一个图来看,很有意思。大部分的阻塞都是自己阻塞自己,另外,这些阻塞的情况都出现在,多线程的问题上。比如71阻塞了他自己,他对应了2个线程,也就是kpid是不同的,其他的91更夸张,这个至少说明了,这些会话在执行sql语句时,都采用了并行的执行计划。建议你查看一下,这些会话当前运行的是哪些语句:查看会话71的sql语句dbcc inputbuffer(71)然后看看这个语句的执行计划,运行一下,看看是否很慢
      

  2.   

    阳泉小当家,我现在sqlserver服务器恢复正常了,但是这是个很危险的前兆,4个月前就是这样,刚开始偶尔会卡,后面越来越频繁,直到最后卡的时间比正常时间多到不行,彻底没法用了,我们那个时候用的方法是,晚上下班后,重启web服务器,好像也关闭了数据库吧,忘了,因为用的是虚拟服务器,我们就申请了新增内存,后来就好了,现在又开始这样,且不管这是不是硬件跟不上,就是你所说的哪些问题,是什么原因呢,自己阻塞自己?一般不是都是A阻塞B吗,感觉现在又要做开发,又要当DBA尼玛部门就是将自己当全能用,其实这样也好,可以多学很多东西,但是目前就是出这样的问题,能给个诊断思路吗?
      

  3.   

    2楼那哥们也说并发严重,究竟怎么样才会产生并发呢?你说的这种问题,目前如何快速解决?增加服务器内存可以吗?sql优化以后是要做的,但是太多了,现在是搞不完的,目前就是想要让它正常运行
      

  4.   


    关于自己阻塞自己的问题,我查了一下资料,是这样说的
    置于 CXPACKET和LATCH_EX 往意味着存在大量扫描,总是给人的感觉是你的数据库中存在大量的表扫描,因为这个原因造成缓存中的数据频繁的置换出内存,然后又是物理的IO
    应该是加大内存,或者是优化sql避免一些无所谓的读取操作
      

  5.   

    刚才参考了这个 http://www.cnblogs.com/lyhabc/articles/3236984.html
    看了你几个出现次数比较多的等待,下面可以参考,另外,症状和解决方案-LATCH_XX
     这意味着
     存在非页闩锁
     使用sys.dm_os_latch_stats来分析哪一个闩锁等待时间过长
     和其它同时发生的等待类型结合查看
     比如说CXPACKET和LATCH_EX与ACCESS_METHODs_SCAN_RANGE_GENERATOR往
     往意味着存在大量扫描 症状和解决方案-LCK_M_XX
     解决方案基于最开始被阻塞进程的等待类型
     一个查范围更新或扫描造成的锁升级 症状和解决方案-
     SOS_SCHEDULER_YIELD
     这意味着 线程用完4毫秒的时间片,主动放弃CPU
     存在自旋锁
     不一定是CPU问题(CPU问题往往体现在长Runnable队列或大量signal wait)
     通过执行计划查看是否存在大量扫描
     查看等待类型
     避免望文生义
     更多分析
     注意:该方式没有Resource_wait等待类型,因此一些查另外关于sqltrace的,参考这个
    另外你的服务器硬件配置还有数据库大小是什么样的?
    建议你查询一下执行次数最多的sql和最耗费IO的sql,看看执行计划是不是缺少索引之类的
      

  6.   

    这样的问题不是抱佛脚能解决的,如果临时查段资料就能解决,咱们专门玩DB的都该退出江湖了
    数据库肯定不是简单的Insert/Update/Delete/Select
      

  7.   


    出现这种问题的原因,有2种:1.硬件瓶颈。
    就想你说的,加了内存后,好像又恢复正常了,一段时间又不行了,难道是因为数据量新增的速度远快于,你所加的内存量吗? 
    我觉得从长期来看,随着数据量的增加,确实会导致硬件的瓶颈,这个时候确实考虑要增加内存。
    但是我觉得你这个问题,不是增加内存这么简单的。2.需要优化sql语句。
    sql server说白了,就是执行各种sql语句的一个程序,如果执行这些语句很慢,那么大部分的原因应该是你的sqli写的有问题,或者说你没有建立合理的索引。所以,综合上面的2个,你现在要做的就是找到那些产生阻塞的sql语句,尝试优化这些语句。如果你优化不了,那么可以贴出来,让大家帮你看看,如何优化
      

  8.   


    关于自己阻塞自己的问题,我查了一下资料,是这样说的
    置于 CXPACKET和LATCH_EX 往意味着存在大量扫描,总是给人的感觉是你的数据库中存在大量的表扫描,因为这个原因造成缓存中的数据频繁的置换出内存,然后又是物理的IO
    应该是加大内存,或者是优化sql避免一些无所谓的读取操作
    对于你说的自我阻塞是否可以这样理解,因为外部读取sqlserver时,首先看的是缓冲池里面有没有这样的数据,有就直接取出来,没有的话,就会为其分配空间,然后先查询出来放到这块内存区域,但存和取是两个异步IO线程,彼此无法访问对方的资源,一定要等到先存完OK了,才能够读取吗?假如磁盘速度够快,那这种等待时间就会很小咯?也就数据库的机制就是这样的,看似一查询就出结果,其实底层内部是进行了这两个动作的吧?我们知道没有索引会查的很慢,索引的作用是更快速地检索,真正的内存读取还是靠磁盘速度吧?
      

  9.   

    你说的大量扫描我知道存在,这个系统当初不是我开发的,他们用asp.net的gridview,但是并没有分页,一下子就会查出很多记录,其次我也看了代码,即使用了分页,但是他每一页看似显示的是那几条,不过每点击任何一页,他还是执行了全部查询,没有用分页存储过程,所以只是改了下显示,我真的是醉了,所以sql代码有问题我是知道的,不过现在如果去改,怕又会影响,并且有很多地方sql写的都不规范,一个人改真的会湿了真的很谢谢你,这么耐心的的给我找资料,跟我解释原因,多多少少我也了解了一些,我自己总结下(1,系统设计有些瑕疵,一些查询sql并没有优化,并且数据表的设计不规范,并无索引,这样容易导致造成全表扫描,和大量的查询,加上磁盘速度不够快,导致读写很慢,CXPACKET和LATCH_EX这种类型的wait_type对应的就是扫描过多吧。2,正因为大量查询,导致内存吃紧,这应该是属于代码问题引起的硬件吃不消假象吧,我看不到服务器的硬件配置,这好像是公司给我们部门的一个虚拟服务器吧,数据库大小如何去看呢?)曾经我们时出现过,但是通过增加内存就OK了,看来这次想要治标,就先申请扩张内存吧,不过治本任重道远
      

  10.   

    大哥我不是专业搞DB的,但是一个人扛这个部门的系统运转,虽然这个系统不是很难,但是目前要升级更新,和其他部门做数据共享,还要做开发,外国佬还要和你开开会啥的,感觉自己什么都要会,尼玛上不了网,网线坏了,电脑卡,Excel公式,都来问,有的明显找IT的就好了的 - -!DB这一块我确实只会写增删查改,存储过程,游标,函数,触发器,但是其他的东西几乎不知道。
      

  11.   

    数据库大小用存储过程看
    sp_spaceused你说用gridview自动分页(假分页),就是全部查出来在客户端分页那种了,那优化的余地就很小了,
    应该可以确认上面那些“等待”就是查询问题引起的了,
    另外加内存的问题,数据库查询机制,也是治标不治本
    你任意一个“查询”或者点击一下“下一页”都返回的结果集都比较大,这个一方面会造成大量的IO操作,
    另一方面,会挤压内存,就是每次每个查询结果集都很大,占用大量内存,注意这个是相互的,
    A查询返回大量结果集,B查询页返回大量结果集,相互抢占内存的使用,将其他查询缓存的数据写入磁盘,下次继续从磁盘读取,这个相互的你这个现在去改成分页读取数据的方式不太现实,光UI页面上的修改就够受了
    最现实的是在应用端,在查询时去做一些限制,
    比如一定要选择一个时间段等,不能不要任何条件随意查询,这样,尽可能地去减少每次查询返回的结果集我第一家公司也是这样的,用gridview假分页,但是因为限制了查询条件,比如默认给一个查询的起始时间等
    也没有太明显的问题,当然我也不是说这是个好办法,只是没办法的办法
      

  12.   

    另外,从你说的情况来看,我估计是企业内部用的管理系统
    我不认为是并发引起的,不太可能说同一时刻非常多的人去写数据,最多就是很多查询操作,产生大量的IO操作,
    因为并发引起的等待是pagelatch_XX
    你那个是pageIOlatch_XX,就是你第二个截图第8行的那个,这数据IO等待,
    置于为什么会产生IO等待,应该清楚了,每次查询都没有分页,直接扫描表
    所以这些“等待”事件,应该就是因为大量的IO引起的我也没啥经验,属于事后诸葛亮的类型,哈哈
    就好比病人说肚子疼,原因可能是多样的,
    到底是肠胃炎还是其他原因,医生也不好说,如果病人说中午吃了生冷的事物,那确定原因的可能性是不是大了很多