SQL调优日记--并行等待的原理和问题排查
来源:互联网 发布:win7本地网络连接红叉 编辑:程序博客网 时间:2024/06/13 23:23
前言
今天处理项目,客户反应数据库在某个时间段,反应特别慢。需要我们提供一些优化建议。
现象
由于是特定的时间段慢,排查起来就比较方便。直接查看这个时间段数据库的等待情况。查看等待类型发现了大量的CXPAKET等待类型且等待时间长.
有的看官可能知道,出现这个等待类似时,可以适当降低最大并行度来解决。但是为什么这么做呢?降低并行度就一定可以解决问题吗?
CXPAKET原理
那什么是CXPAKET 等待呢。 当数据库引擎分析查询的开销超过设定的阀值时,SQL SERVER会选择并行执行。数据库引擎会为这个请求创建多个任务。每个任务处理数据的一个子集。每个任务可以在一个分开的CPU/核上执行。请求主要使用生产-消费 队列跟这些任务交互。如果这个队列是空的,(即生产者没有推入任何数据到这个队列)。这个消费者必须暂停并且等待。相应等待类型就是CXPACKET 等待类型。显示这个等待类型的请求 说明这个任务应该提供,但是没有提供任何(或足够)数据来消费。这些生产商任务反过来可能会暂停,等待一些其他类型的等待.
如下图:索引扫描就是一个并行执行的动作。
打个比方
客户端程序就是老板,数据库引擎是部门领导,老板发出一个要求(request),查看最近一年的销售数据。领导一看这任务工作量大,一个人查太慢,要查到猴年马月。果断决定多派几个人。一次最多可以派多少个攻城狮呢?(就取决于最大并行度)这里假设是4个。这就分配4个人 小李、小王、小张、小陈去完成。 那这一年的任务怎么分配呢? 以后再细说。 因为各种原因,其他人都做得了,小王还没有完成。领导不可能拿着半成品的数据就去找老板,只能等着小王。这就是CXPACKET.
问题排查
弄懂了CXPACKET的原理,那我们怎么来排查这类问题呢?首先,小王并不是偷懒,他的工作能力和其他人是相同的。所以,我们需要找出小王慢的原因,
使用下面的脚本:
select r.session_id,status,command,r.blocking_session_id,r.wait_type as[request_wait_type],r.wait_time as[request_wait_time],t.wait_type as[task_wait_type],t.wait_duration_ms as[task_wait_time],t.blocking_session_id,t.resource_descriptionfrom sys.dm_exec_requests rLEFT join sys.dm_os_waiting_tasks ton r.session_id = t.session_idwhere r.session_id >=50and r.session_id <> @@spid;
通过上面的语句我们找到,并行等待正在等待LCK_M_S.说明查询是被其他的操作阻塞了。上面的问题是由于一个写入语句引起的。这个语句是一个很简单的插入动作,为什么写入会这么慢呢。可以查看磁盘响应时间,,磁盘队列发现都出奇的高。
建议
看来问题是由于磁盘本身引起的。给出如下的解决建议:
1.更换读写速度更快的磁盘
2.目前数据文件和日志文件在同一物理磁盘,分割开来
3.从业务出发。经过和客户沟通后发现,这个表是操作日志表。每次做业务操作都会记录日志。所以特别的大。
对应这样的表,可以单独建立文件夹组,文件,并把表放在单独的磁盘,缓解IO压力
4. 比如传统机械磁盘IOPS往往是瓶颈,而吞吐量并不是,所以磁盘格式化的簇大小就比较重要,较大的簇可以减少IOPS瓶颈。
5.对于日志表,如果能改程序,在前端程序合并写入,或者在情况允许的情况下开trace flag 610最小化日志写入
6.整理磁盘碎片,另外合并&删除日志表的索引减少写入开销也能起到一定作用
阅读全文
1 0
- SQL调优日记--并行等待的原理和问题排查
- SQL实战日记--数据库文件还原问题排查
- SQL调优日记--sleeping进程导致的性能问题
- 等待 --- 旧的日记
- 排查问题的工具和技能
- sql 2000 关于用户权限以及sp3问题的排查
- JVM 调优命令排查死锁问题
- 并行,并发和锁的问题
- ajax请求串行和并行的问题
- 有关并发和并行的问题解析
- 【转】线上问题排查的常用工具和方法
- 记一次死锁问题的排查和解决
- Java应用线上问题排查的常用工具和方法
- linux问题排查 - 高cpu占用率的进程和线程
- Java应用线上问题排查的常用工具和方法
- Java应用线上问题排查的常用工具和方法
- Linux的IP配置和网络问题排查
- SQLServer实战日记--日志传送中断问题排查
- TCP/IP详解学习笔记
- Altium Designer PCB中让元器件旋转任意角度方法
- 人类简史--经典语句摘录
- form表单提交的几种方法
- 链家笔试题整理
- SQL调优日记--并行等待的原理和问题排查
- stm32 TFTLCD驱动原理(一)
- UVA 1328 KMP算法
- 【深度学习】神经网络异或问题
- 同过js使浏览器后退键失效
- 《Android开发艺术探索》笔记——Bitmap的加载和Cache(三)
- 统计量分析--极差、标准差、变异系数、四分位数间距
- 小米品牌广告引擎与算法实践
- spring容器要点总结