今天收到数据库预警,发现连接数较多。于是立马登录查看机器的基本情况:

select  * from sys.sysprocesses

查看了一下连接数,发现有两个进程都处于CXPACKET状态,而且看得到一条查询有N个并发,这里没有保留当时的记录,所以就不贴图片了。

我们看下为什么会出现这种CXPACKET等待呢?CXPACKET又是什么呢?

CXPACKET:当尝试同步查询处理器交换迭代器时出现。如果针对该等待类型的争用成为问题时,可以考虑降低并行度。

也就是说当一个SQL并发执行的时候,必须等待所有的进程执行完毕,才能一起返回结果,如果有一个进程没有执行完毕,执行完毕的只能是出于CXPACKET的等待状态。一条语句能不能够并行执行主要是由以下两个参数控制的:

cost threshold for parallelism和MAXDOP

cost threshold for parallelism 选项指定 Microsoft SQL Server 创建和运行并行查询计划的阈值。仅当运行同一查询的串行计划的估计开销高于在 cost threshold for parallelism 中设置的值时,SQL Server 才创建和运行该查询的并行计划。开销指的是在特定硬件配置中运行串行计划估计需要花费的时间(秒)。只能在对称多处理器系统上设置 cost threshold for parallelism。默认值为5S。

并行计划对需时较长的查询通常更加有益;其性能优势将抵消初始化、同步和终止并行计划所需的额外时间开销。短时间和长时间查询混合运行时,可以灵活使用 cost threshold for parallelism 选项。短时间查询使用串行计划运行,而长时间查询使用并行计划运行。cost threshold for parallelism 的值确定哪些查询是短时间查询,因而应该使用串行计划运行。
在某些情况下,即使查询的开销计划小于当前 cost threshold for parallelism 的值,也有可能选择并行计划。出现这种情况,是因为使用并行还是串行计划是根据完成完全优化之前所提供的开销估计确定的。

这个参数我们可以手动修改,立即生效(修改默认值为30秒):

sp_configure 'show advanced options', 1;
GO
reconfigure;
GO
sp_configure 'cost threshold for parallelism', 30;
GO
reconfigure;
GO

MAXDOP是sqlserver的最大并行度,默认为0表示不限制。我们可以手动修改(设置为8):

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'max degree of parallelism', 8;
GO
RECONFIGURE WITH OVERRIDE;
GO

sqlserver出现大量CXPACKET等待,一般情况下说明我们的这两个设置是有部分问题的。当然这也要看我们的业务需求。OLAP和OLTP的设置是不同的。

根据不同的系统我们也有不同的建议,参考了一些外文资料:

OLAP:长事物,处理较慢,建议不修改默认值,直接为0,cost threshold for parallelism的值也可以设置稍微大一些。

OLTP:小事物,处理快的我们可以设置MAXDOP为1,cost threshold for parallelism值可以设置较小,建议默认值不修改。

还有一种设置就是设置MAXDOP=2,这样可以避免并行度过高,又可以使小事物能够直接串行执行。

另外我们也可以直接指定SQL的并行度:option(maxdop 1)

select * from table_name option(maxdop 1)

当然这个也是要受制于MAXDOP的设置值。

由于我的这个是OLAP的系统,所以认为0设置还是比较合理的,基本上大多数都是长事物,并没有做修改。杀掉了一个长事物,就OK了,不过这个学习过程还是要分享一下给大家。

CXPACKET等待事件的更多相关文章

  1. [翻译]SQL Server等待事件—THREADPOOL

      前言: 本文是对SQLSkills上一篇关于SQL Server中THREADPOOL等待的博客的翻译,本文也不是完全翻译,有些地方适当加入了自己的一些认知.如有翻译不对或不好的地方,敬请指出,大 ...

  2. SQL Server等待事件新解

    资源等待类型 并行:CXPACKET Buffer:PAGEIOLATCH_X 非Buffer:LATCH_X I/O:ASYNC_IO_COMPITION:IO_COMPITION CPU:SOS_ ...

  3. Oracle Tuning 基础概述01 - Oracle 常见等待事件

    对Oracle数据库整体性能的优化,首先要关注的是在有性能问题时数据库排名前几位等待事件是哪些.Oracle等待事件众多,随着版本的升级,数量还在不断增加,可以通过v$event_name查到当前数据 ...

  4. SQL SERVER中的OLEDB等待事件

    OLEDB等待事件介绍 OLEDB等待类型是SQL SERVER 数据库中最常见的几种等待类型之一.它意味着某个会话(SPID)通过SQL Server Native Client OLEDB Pro ...

  5. ORACLE等待事件:enq: TX - row lock contention

    enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...

  6. ORACLE等待事件: log file parallel write

    log file parallel write概念介绍 log file parallel write 事件是LGWR进程专属的等待事件,发生在LGWR将日志缓冲区(log_buffer)中的重做日志 ...

  7. 数据库服务器CPU持续百分之百、部分Session一直处于执行状态---等待事件为:asynch descriptor resize(Oracle Bug )

    问题描述: 项目反馈数据库服务器的CPU持续100%的情况,跟踪发现很多活动会话的等待事件是“asynch descriptor resize”,并且这些会话一直处于Active状态,而这些会话执行的 ...

  8. DB SQL Monitor 阻塞及等待事件监控工具

    SQL Monitor Designed By zhaoguan wang 说明------------------------------------------------------------ ...

  9. truncate表hang住(等待时间较长),出现enq:RO fast object reuse等待事件

    有一个应用truncate表等待了一晚上,一个定时任务,跑了几年了,今天早上来发现昨晚没有执行完成,hang住了,查询发现等待事件 fast object reuse. 10.2.0.4的库 Bug ...

随机推荐

  1. js map()初步学习

    //array.map(callback,thisObject?),callback需要有return值 //map:'映射' 被映射成新的数组  eg1: let data = [3,4,2]; l ...

  2. redis 网络库文件 重构

    https://blog.csdn.net/yangbodong22011/article/details/65444273 相关博客 https://blog.csdn.net/tanswer_/a ...

  3. numpy多维矩阵,取出第一行或者第一列,方法和df一样

    # 定义一个多维矩阵 arr = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 取出第一行 arr[0,:] # 取出第一列 arr[:,0]

  4. CentOS7 MongoDB安装及基本配置

    一.安装包的获取 1.创建文件: vi /etc/yum.repos.d/mongodb-org-4.0.repo 2.在上一步创建的文件中,写入如下内容: [mongodb-org-4.0] nam ...

  5. IOS Intro - Write file

    #import <sys/xattr.h> + (NSString *)getFullFilePathInDocuments:(NSString *)subFilePath fileNam ...

  6. oracle mybatis批量插入,无匹配找默认

    批量插入<insert id="insertIndi" parameterType="java.util.HashMap" useGeneratedKey ...

  7. Failed to start NodeManager caused by "/var/lib/hadoop-yarn/yarn-nm-recovery/yarn-nm-state/LOCK: Permission denied"

      Hadoop 安装步骤: 0. 安装前准备(节点机器,环境设置,yum源设置) 1. 配置并安装Cloudera-Manager 2. 启动 CM 服务 3. 安装CDH,并配置集群 4. 启动 ...

  8. (转)Linux strace命令

    原文:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html https://linux.cn/article-6444-1 ...

  9. 深入理解子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  10. mysql 导入 excel 数据

    客户准备了一些数据存放在   excel 中, 让我们导入到 mysql 中.先上来我自己把数据拷贝到了 txt 文件中, 自己解析 txt 文件,用 JDBC 循环插入到数据库中. 后来发现有更简单 ...