SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

作者: 时间: 2014-04-9 分类: 技术文章 | 3 评论数 |

背景说明:上周,由于业务需要,公司把业务数据库,拆分成多个库。分别是:Test01、Test02、Test03。拆分方法是:拷贝原始的Test01,还原为Test02、Test03,然后删除里面不需要的数据。

SQL Server 2008 R2 数据库分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

遇到问题:

1)拆分之后,发现“写”操作明显变慢,这个问题是因为“索引丢失”,我们加回去之后正常。至于为什么丢失,确实不知道。
2)前台的客户端一直报错,出现如下错误:查询处理器未能为执行并行查询启动必要的线程资源。

本文将针对第二个问题深入讲解,因为我们花了一个星期,才解决这个问题,为此通宵熬夜多天,而且还被扣绩效了,真心伤不起。

解决问题:

小公司,木有DBA这个神奇的岗位,屌丝程序员必须想办法自己处理。经过一周奋战,总算有成果了。

1)一开始,我们觉得是程序问题,可能连接之后没有释放,导致异常出现。经验证:所有代码都是using,会及时释放。
2)我们还分析了Test01、Test02、Test03的所有结构,最终发现:Test01与Test02、Test03的区别,仅仅在于Test01里多了一些视图,用来执行一些查询操作。经验证,这个并不会导致那个问题出现。
3)我们还修改了最大工作线程数(默认为0,就是不限制),尽管如此,我们还是手动改为 32767,最终发现:还是没用。
4)我们专门部署了一台测试服务器,从正式数据库拷贝过去模拟,但是几个屌丝程序员,写了一堆的线程测试,跑了几个小时,根本没有遇到那个问题。故障不能重现,这就蛋疼了……
5)在进行了多种测试,排除之后,最终把问题锁定在服务器硬件,SQL配置问题上:
我们的服务器CPU是4核(48个逻辑CPU),操作系统会将这些逻辑CPU进行分组。每个分组有分多少个逻辑CPU这个由操作系统决定。(每次重启电脑分组的数量可能会变的)
假设,12个逻辑cpu一组,如果你的“最大并行度”是12那么这个sql只需要在这一组逻辑cpu里执行就可以了,这12个逻辑cpu共享同一块内存空间。也就是说,如果设置的“最大并行度”超出12,例如设置为13,那么就会出现“跨NUMA问题”。

SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

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

SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法

修改了这个“最大并行度”,如果再没出现 cxpacket应该没问题了

补充知识:

并发跟并行是不一样,不是同一样东西。

一个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

本文采用 CC协议 发布,转载请注明:转载自 吾乐吧软件站

本文链接地址:http://www.wuleba.com/?p=25058

3 条评论 给“SQL2008 R2 分库后出现“查询处理器未能为执行并行查询启动必要的线程资源”解决方法”

发表评论


微软MSDN资源免费订阅,MSDN 我告诉你