SQL提示查询处理器未能为执行并行查询启动必要的线程资源

最近SQL经常提示“查询处理器未能为执行并行查询启动必要的线程资源”反应速度变慢。

SQL环境为两台服务器做故障转移群集,一主一备,主为48核心,64G内存,备为24核心,64G内存。

经检查发现服务已转移到备用节点(转移原因后续排查),因之前未出现过此问题,故障锁定在了计算机硬件,SQL配置问题上:我们的服务器CPU是4核(48个逻辑CPU),操作系统会将这些逻辑CPU进行分组。每个分组有分多少个逻辑CPU这个由操作系统决定。(每次重启电脑分组的数量可能会变的)假设,12个逻辑cpu一组,如果你的“最大并行度”是12那么这个sql只需要在这一组逻辑cpu里执行就可以了,这12个逻辑cpu共享同一块内存空间。也就是说,如果设置的“最大并行度”超出12,例如设置为13,那么就会出现“跨NUMA问题”。

当第二个组运算好之后,当一个组运算好之后,如果第二个组的另外两个逻辑cpu还没有运算好,那么就需要等待B、又或者第二个组已经运算好,出结果了,但是由于线程切换,或者服务器忙不过来

先检查服务器的CPU设置

属性--处理器--展开

CPU每次重启都会分组,而且每次分组的数量可能不同,查看备用机上SQL设置CPU分为了4组,每组6个核心,因此我们设置最大并发数的时候尽量不要超过6,否则就会出现查询跨NUMA问题

解决方法:

最大并行度改为5,单击运行值(点击后,最大并行度会显示灰色,不用管),点确定,不需要重启,等待十几秒生效。

备注: 并发跟并行是不一样,不是同一样东西。一个sql语句 /查询 的某个运算符如果需要多线程执行,sqlserver就会开启多线程来处理这个运算符。这个由sqlserver判断如果你没有设置并行度,假设你的cpu是四线程的那么sqlserver会用4个线程去执行如果你设置了并行度为2那么sqlserver只会用2个线程去执行你的查询而另外2个资源就给其他软件/操作系统使用并行度只是一个开关,决定是由sqlserver来决定的–查看哪些sql线程属于哪个处理器编组select [thread_address],[started_by_sqlservr],[creation_time],[processor_group],[scheduler_address] FROM sys.dm_os_threads

时间: 2024-11-10 10:57:25

SQL提示查询处理器未能为执行并行查询启动必要的线程资源的相关文章

sql server 2008 System.Data.SqlClient.SqlException (0x80131904): 查询处理器未能为执行并行查询启动必要的线程资源 处理方法

修改并行度: 修改了这个“最大并行度”,如果再没出现 cxpacket应该没问题了 参考资料:http://jingyan.baidu.com/article/5d6edee22daf8799eadeeca2.html

SQL 取消当前的所有在执行的查询语句进程

DECLARE @sql NVARCHAR(MAX),@currDbName NVARCHAR(100) SET @currDbName=DB_NAME() --如果在当前库上执行,可改为: SET @currDbName = DB_NAME() WHILE EXISTS( SELECT 1 FROM sys.sysprocesses WHERE dbid=DB_ID(@currDbName) AND [email protected]@SPID ) BEGIN SELECT TOP 1 @sq

SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用

pq_distribute提示通常被用于提升数据仓库中分区表间的连接操作性能. pq_distribute提示允许你确定参与连接的表数据行在生产和消费并行查询服务进程间如何分配. pq_distribute提示接受三个参数:表名,外分配和内分配. 当执行并行查询连接时,我们总是想着避免PARALLEL_TO_PARALLEL执行计划.PARALLEL_TO_PARALLEL操作意味着输入输出数据流都是并行的,导致连接性能低下.另一方面,PARALLEL_COMBINED_WITH_PARENT操

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的陷阱

mer_stage 表有 216423 条记录,DDL: CREATE TABLE `mer_stage` ( `STAGE_ID` int(11) NOT NULL AUTO_INCREMENT, `MER_ID` int(11) NOT NULL, `MER_CODE` varchar(16) DEFAULT NULL, `MER_NAME` varchar(80) NOT NULL, `INS_CODE` varchar(16) NOT NULL, `INS_NAME` varchar(6

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/46745143 mer_stage 表有 216423 条记录,DDL:CREATE TABLE `mer_stage` ( `STAGE_ID` int(11) NOT NULL AUTO_INCREMENT, `MER_ID` int(11) NOT NULL, `MER_CODE` varch

mysql 用多次查询代替一次复杂join查询的优点分析

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt344 多高性能的应用都会对关联查询进行分解.简单地,可以对每一个表进行一次单表查询,然后将结果在应用程序中进行关联.例如,下面这个查询: 可以分解为下面这些查询来代替: 到底为什么要这样做?乍一看,这样做并没有什么好处,原本一条查询,这里却变成多条查询,返回的结果又是一模一样的.事实上,用分解关联查询的方式重构查询有如下的优势: ?让缓存的效率更高.许多应用程序可以方便地缓

一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_info where id = 1; 返回结果为: +----+----------+----------+--------+------+---------------------+---------------------+ | id | username | password | openid |

深入理解SQL原理:一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_info where id = 1; 返回结果为: +----+----------+----------+--------+------+---------------------+---------------------+ | id | username | password | openid |

MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file记录日志的文件名. 4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. 二