概述

  今天处理项目,客户反应数据库在某个时间段,反应特别慢。需要我们提供一些优化建议。

现象

由于是特定的时间段慢,排查起来就比较方便。直接查看这个时间段数据库的等待情况。查看等待类型发现了大量的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_description
from sys.dm_exec_requests r
LEFT join sys.dm_os_waiting_tasks t
on r.session_id = t.session_id
where r.session_id >=50
and r.session_id <> @@spid;

 

通过上面的语句我们找到,并行等待正在等待LCK_M_S.说明查询是被其他的操作阻塞了。上面的问题是由于一个写入语句引起的。这个语句是一个很简单的插入动作,为什么写入会这么慢呢。可以查看磁盘响应时间,,磁盘队列

发现都出奇的高。

建议

看来问题是由于磁盘本身引起的。给出如下的解决建议:

1.更换读写速度更快的磁盘

2.目前数据文件和日志文件在同一物理磁盘,分割开来

3.从业务出发。经过和客户沟通后发现,这个表是操作日志表。每次做业务操作都会记录日志。所以特别的大。

对应这样的表,可以单独建立文件夹组,文件,并把表放在单独的磁盘,缓解IO压力

4. 比如传统机械磁盘IOPS往往是瓶颈,而吞吐量并不是,所以磁盘格式化的簇大小就比较重要,较大的簇可以减少IOPS瓶颈。

5.对于日志表,如果能改程序,在前端程序合并写入,或者在情况允许的情况下开trace flag 610最小化日志写入
6.整理磁盘碎片,另外合并&删除日志表的索引减少写入开销也能起到一定作用

SQL调优日记--并行等待的原理和问题排查的更多相关文章

  1. sql server 性能调优之 资源等待 CXPACKET

    一.概述  CXPACKET是指:线程正在等待彼此完成并行处理.什么意思呢? 当sql server发现一条指令复杂时,会决定用多个线程并行来执行,由于某些并行线程已完成工作,在等待其它并行线程来同步 ...

  2. 梁敬彬老师的《收获,不止SQL优化》,关于如何缩短SQL调优时间,给出了三个步骤,

    梁敬彬老师的<收获,不止SQL优化>,关于如何缩短SQL调优时间,给出了三个步骤, 1. 先获取有助调优的数据库整体信息 2. 快速获取SQL运行台前信息 3. 快速获取SQL关联幕后信息 ...

  3. SQL调优常用方法

    在使用DBMS时经常对系统的性能有非常高的要求:不能占用过多的系统内存和 CPU资源.要尽可能快的完成的数据库操作.要有尽可能高的系统吞吐量.如果系统开发出来不能满足要求的所有性能指标,则必须对系统进 ...

  4. SQL调优

    # 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  5. [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优

    最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...

  6. 读书笔记之SQL注入漏洞和SQL调优

    原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...

  7. Oracle SQL 调优健康检查脚本

    Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...

  8. SQL注入漏洞和SQL调优SQL注入漏洞和SQL调优

    SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这 ...

  9. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

随机推荐

  1. JUnit单元测试入门

    什么是单元测试 写了个类,要给别人用,会不会有bug?怎么办?测试一下. 用main方法测试好不好?不好! 不能一起运行! 大多数情况下需要人为的观察输出确定是否正确 为什么要进行单元测试 重用测试, ...

  2. Windows 10忘记登录密码不用怕,系统U盘/光盘轻松重置

    我们有时会遇到忘记Windows10登录密码,或者电脑被其他账户登录后不知道密码无法开机的情况.遇到这些问题后,我们可能会借助一些第三方工具来移除现有密码.然而这些工具本身的安全性还有待检验,肯定不如 ...

  3. Elasticsearch一些常用操作和一些基础概念

    1.查看集群健康状态 [root@ELK-chaofeng01 ~]#curl -XGET http://172.16.0.51:9200/_cat/health?v epoch timestamp ...

  4. 在excel中将缺失数据全部用0补齐

    先ctrl+H ,出现如下对话框 点击“定位”,选择“空值” 在表格中空的位置上编辑栏输入0,CTRL+ENTER,即可将缺失数据全部用0补齐.

  5. 超详细!Github团队协作教程(Gitkraken版)

    超详细!Github团队协作教程(Gitkraken版) 一.前期工作 1. 在 Github 上创建 organization step1. 登录Github网站,点击右上角头像,选择 " ...

  6. java基础面试题(Servlet生命周期)

    Servlet运行在Servlet容器中,其生命周期由容器来管理.Servlet的生命周期通过javax.servlet.Servlet接口中的init().service()和destroy()方法 ...

  7. 【夯实PHP基础】微信小程序开发 2017.02.06

    本文地址 分享提纲 1. 概述 2. 简易教程 1. 概述 1)[小程序是什么] 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 2)[快速体验 ...

  8. work flow 工作流程

    常用git 命令 v-1 # 切换分支 git checkout site-v1.7.8 # 提交代码前,先拉取分支 git pull # 拉取失败说明有冲突,解决冲突... # 保存在stash之中 ...

  9. WPFの数据源事件变更通知

    如果数据绑定的目标是TextBox元素的Text属性,那么默认会使用双向绑定(Mode.TwoWay),此时用户可以通过更改TextBox元素Text属性的值从而更新源属性信息,但是如果在程序代码中更 ...

  10. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...