SQL调优日记--并行等待的原理和问题排查

原文:SQL调优日记--并行等待的原理和问题排查

概述

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

现象

由于是特定的时间段慢,排查起来就比较方便。直接查看这个时间段数据库的等待情况。查看等待类型发现了大量的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.整理磁盘碎片,另外合并&删除日志表的索引减少写入开销也能起到一定作用

原文地址:https://www.cnblogs.com/lonelyxmas/p/8289107.html

时间: 2024-10-12 02:34:33

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

sql server 性能调优之 资源等待PAGEIOLATCH

原文:sql server 性能调优之 资源等待PAGEIOLATCH 一.概念 在介绍资源等待PAGEIOLATCH之前,先来了解下从实例级别来分析的各种资源等待的dmv视图sys.dm_os_wait_stats.它是返回执行的线程所遇到的所有等待的相关信息,该视图是从一个实际级别来分析的各种等待,它包括200多种类型的等待,需要关注的包括PageIoLatch(磁盘I/O读写的等待时间),LCK_xx(锁的等待时间),WriteLog(日志写入等待),PageLatch(页上闩锁)Cxpa

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

原文:sql server 性能调优之 资源等待 CXPACKET 一.概述  CXPACKET是指:线程正在等待彼此完成并行处理.什么意思呢? 当sql server发现一条指令复杂时,会决定用多个线程并行来执行,由于某些并行线程已完成工作,在等待其它并行线程来同步,这种等待就叫CXPACKET. 为什么会有并行线程呢?  因为在sql server 里有个任务调度SCHEDULER是跟操作系统CPU个数 默认是一 一匹配的,  我们也可能通过sp_configure来设置最大并行度,也就是M

sql server 性能调优之 资源等待 LCk

原文:sql server 性能调优之 资源等待 LCk 一.  概述 这次介绍实例级别资源等待LCK类型锁的等待时间,关于LCK锁的介绍可参考 “sql server 锁与事务拨云见日”.下面还是使用sys.dm_os_wait_stats 来查看,并找出耗时最高的LOK锁. select wait_type, waiting_tasks_count, wait_time_ms , max_wait_time_ms, signal_wait_time_ms from sys.dm_os_wai

SQL调优

# 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优 化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL语句,提高系统的可用性. 在多数情况下,Oracle

Oracle SQL 调优健康检查脚本

Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性能问题的有力保证. 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前我们通常的做法,是通过AWR报告或者调试手段,发现某某SQL有问题,之后从Librar

11g新特性-自动sql调优(Automatic SQL Tuning)

11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中,通过运行sql tuning advisor加强了自动sql调优功能.默认情况下是每天夜间通过自动任务的方式运行"自动sql调优". 自动sql调优的过程: 1.识别需要调优的sql语句  根据AWR中的CPU和I/O负载来识别 2.调优,生成新的sql profile 在维护窗口(mai

SQL调优常用方法

在使用DBMS时经常对系统的性能有非常高的要求:不能占用过多的系统内存和 CPU资源.要尽可能快的完成的数据库操作.要有尽可能高的系统吞吐量.如果系统开发出来不能满足要求的所有性能指标,则必须对系统进行调整,这个工作被称为调优.绝定DBMS的性能的因素有两个因素:硬件和软件.使用频率高的CPU.使用多处理器.加大内存容量.增加Cache.提高网络速度等这些都是非常有效的硬件调优方式,不过对硬件进行调优对系统性能的提高是有限的,如果有非常好的硬件条件但是如果编写的SQL质量非常差的话系统的性能并不

Oracle技术沙龙《SQL调优-从手工到工业化》

 无dba 不调优 没有学过oracle能调优吗? 告诉你  YES I DO AWR出来好几年了,有关它的作用真正理解的有多少?ADDM能干啥?试一试就知道了! Oracle 10a 的出现,DBA会失业吗? SQL优化从传统模式进入工业化,你了解得有多少? SQL Tuning Advisor能够做哪些优化? SQL Access Advisor能够做哪些优化? 本次技术沙龙以上内容一锅端,使用真实的案例来一一的演绎SQL调优的乐趣 特邀讲师陈卫星:从2010至今,已经在Oracle总部做过

MySQL索引和SQL调优

MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引. MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. MySQL索引原理 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,