背景

客户反馈今天8点钟开始进入业务高峰期后,数据库的CPU利用率非常高,基本达到了100%,前端应用也非常慢。怀疑是昨晚业务系统升级导致,请我们紧急协助分析。

现象

登录到SQL专家云,进入相关时间的活动会话的原始数据页面,看到很多会话的等待类型是CXPACKET,并且等待时间达到了几十秒。

查看具体的SQL语句,发现都很简单。

 

分析

首先简单介绍一下CXPACKET等待类型:当SQL Server进行某些复杂的运算(例如大表或索引的扫描)时,为了加快执行速度,采用多线程并行的方式进行,每个线程处理一部分数据,最后再进行结果合并,在等待一个或多个线程返回结果时就会产生CXPACKET等待类型,类似的等待类型还有CXCONSUMER。对于复杂的SQL语句,并行的方式可以大幅的降低执行时间,但是对于简单的、高并发的SQL语句,CXPACKET等待类型就会产生严重的性能问题。

如此简单的SQL语句还要使用并行,第一反应就是缺少合适的索引,通过SQL专家云的智能分析,在执行计划中发现行数为1900多万的表上有缺失索引,而且影响度非常高。

解决

表上创建好索引后,该语句的执行时间降低到几百毫秒,CXPACKET等待类型大幅减少,CPU利用率下降到10%以下。

经验

如果您的数据库有大量的CXPACKET等待类型,并且CPU利用率非常高,以下的经验基本可以帮助您解决问题

    1. 配置最大并行度(Max Degree of Parallelism)参数,该参数是实例级别的(2016以后版本中可以对单独数据库设置) 。默认是0,对于一个SQL请求,可以使用全部的CPU核数进行并行调度,对于单个SQL请求来说是最好的,但是数据库是有并发的,就会导致其他的请求没有CPU资源,所以要在单个语句的执行时间和整体的并发之间取得一个平衡,对于OLTP系统,建议设置成4或者8,对于OLAP系统,可根据实际的并发请求数适当放大。
    2. 创建合适的索引, 一个很简单的语句产生CXPACKET等待,绝大多数原因是没有合适的索引,创建合适索引后,语句会有几倍到几十倍的提升。
    3. 找到高并发的SQL语句分析并行的原因并进行优化,避免并行。

CXPACKET等待类型分析的更多相关文章

  1. SQL SERVER ->> CXPacket等待类型

    最近做了一个项目,把整个数据仓库平台下所有的表和索引都改成页级别的数据压缩.昨天发现测试环境下的某个workload跑得比平时慢.最后我们定位了到这个workload做的事情中可能造成性能下降的地方, ...

  2. SQLSERVER CXPACKET 等待

    --SQLSERVER CXPACKET 等待 2013-6-11 2 --联机丛书: 3 --当尝试同步查询处理器交换迭代器时出现.如果针对该等待类型的争用成为问题时,可以考虑降低并行度 4 5 6 ...

  3. 资源等待类型sys.dm_os_wait_stats

    动态管理视图  sys.dm_os_wait_stats 返回执行的线程所遇到的所有等待的相关信息.可以使用该聚合视图来诊断 SQL Server 以及特定查询和批处理的性能问题. 列名 数据类型 说 ...

  4. DBA_Oracle Event等待事件分析(概念)

    2014-12-18 Created By BaoXinjian

  5. [转载]sql server 等待类型

    下表列出各任务所遇到的等待类型. 等待类型 说明 ASYNC_DISKPOOL_LOCK 当尝试同步并行的线程(执行创建或初始化文件等任务)时出现. ASYNC_IO_COMPLETION 当某任务正 ...

  6. sql server 各种等待类型-转

    等待的类型 资源等待 当某个工作线程请求访问某个不可用的资源(因为该资源正在由其他某个工作线程使用,或者该资源尚不可用)时,便会发生资源等待.资源等待的示例包括锁等待.闩锁等待.网络等待以及磁盘 I/ ...

  7. Wait--常见的等待类型

    --==================================================================================--SLEEP_BPOOL_FL ...

  8. CXPACKET等待事件

    今天收到数据库预警,发现连接数较多.于是立马登录查看机器的基本情况: select * from sys.sysprocesses 查看了一下连接数,发现有两个进程都处于CXPACKET状态,而且看得 ...

  9. sql server等待类型

    sql server 各种等待类型-转 sql server各个等待类型及解决办法:https://www.sqlskills.com/help/waits/writelog/其他等待类型的描述和解决 ...

  10. ElasticSearch 线程池类型分析之SizeBlockingQueue

    ElasticSearch 线程池类型分析之SizeBlockingQueue 尽管前面写好几篇ES线程池分析的文章(见文末参考链接),但都不太满意.但从ES的线程池中了解到了不少JAVA线程池的使用 ...

随机推荐

  1. 关于 const

    const 限定符 在编译器中限制变量,设定该变量不可被改变,但实际上系统里还是将由 const 修饰的值识别为一个变量(只是在编译器中进行限制) 注意: 由 const 修饰的变量必须在定义时就进行 ...

  2. c#时间格式转换汉字大写

    把时间转换为汉字大写 public class DateTimeConvert { public static string ConvertToChineseCapital(DateTime date ...

  3. 通过Unity导出的Android Studio和Google安卓原生工程的结构图对比

    使用Unity导出Android Studio工程前建议查看我之前的文章<Unity2019及Unity2020打包android的环境配置>,替换或修改Unity安装目录下的basePr ...

  4. 从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

    从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系. 项目效果 以下两张图是系统实际运行效果: 1.项目运行方式 运行环境:Python3 数据库:neo4j 预 ...

  5. 样本数量不平衡问题方案(Focal Loss & Circle Loss)

    1.Focal Loss focal loss是最初由何恺明提出的,最初用于图像领域解决数据不平衡造成的模型性能问题.本文试图从交叉熵损失函数出发,分析数据不平衡问题,focal loss与交叉熵损失 ...

  6. 19.13 Boost Asio 发送TCP流数据

    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议.一般tcp::iostream会阻塞当前线程,直到IO操作完成. 首先来看服务端代 ...

  7. LeetCode刷题日记 2020/03/25

    力扣刷题继续! 题目:计算三维形体表面积 题干 在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i ...

  8. 6、后端学习规划:Java学习 - 学习规划系列文章

    Java语言在现在的编程语言排行榜上也是前5的存在.经过这么些年的发展,Java的发展没有C#这么大,但是在编程领域,因为有MVC架构,以及Spring框架的支持,以及微服务架构等等,Java这些年也 ...

  9. Linux(Centos7)升级MySQL 5.7到8.0.31

    一.下载MySQL安装包 下载地址:https://downloads.mysql.com/archives/community/ 二.备份 mkdir /home/mysqlback mysqldu ...

  10. SP277 CTGAME - City Game 题解

    题目传送门 前置知识 单调栈 解法 令 \(f_{i,j}(1 \le i \le n,1 \le j \le m)\) 表示从 \((1,j)\) 到 \((i,j)\) 中以 \((i,j)\) ...