![MS Sql Server 因“暂停”查询而超载,主要是读取。有什么方法可以解决这个问题?](https://linux22.com/image/627836/MS%20Sql%20Server%20%E5%9B%A0%E2%80%9C%E6%9A%82%E5%81%9C%E2%80%9D%E6%9F%A5%E8%AF%A2%E8%80%8C%E8%B6%85%E8%BD%BD%EF%BC%8C%E4%B8%BB%E8%A6%81%E6%98%AF%E8%AF%BB%E5%8F%96%E3%80%82%E6%9C%89%E4%BB%80%E4%B9%88%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我有一台 Microsoft Sql Server,它可以处理由 java 和 c# 中的多个客户端组成的公司软件套件的中等量流量。
“暂停”查询导致系统超载。这些查询最终会通过,但有些会超时(尤其是写入)。查询大多是读取。
有什么方法可以加快此速度,或者通过其他方式修复它?
这是照片我的活动监视器来显示我正在谈论的内容:
附注:我们计划迁移到 MySql 已经有一段时间了。这会有帮助吗?我知道 MS Sql 很强大,但是它的默认设置是 Read-Committed,这会有什么影响吗?
答案1
屏幕截图中显示的等待类型是:
- LCK_M_X-当任务等待获取排他锁时发生。
- CXPACKET - 尝试同步查询处理器交换迭代器时,并行查询计划中会发生此问题。如果等待时间过长,且无法通过调整查询(例如添加索引)来减少等待时间,请考虑调整并行性的成本阈值或降低并行度。
(这两张都是 C&Ped 的微软。
MSDN 建议调整查询和/或添加上述索引。这可能是比直接放弃 SQL Server 并切换到其他服务器更好的第一步。(如果问题出在您的查询上,那么在我看来,它们在 MySql 上仍然效率低下。)因此,我建议您查看Brent Ozar 的等待统计资源并寻找类似的东西十大昂贵查询。希望这能为您指明正确的方向。
答案2
好的,问题解决啦。
MS SQL 的默认设置使用服务器的所有核心来执行大型查询。我们有大量读取,因此它会堆积一长串查询等待处理。
为了解决这个问题,我将最大并行度设置为 2 核而不是无限制(在我们的服务器中为 8 核),并将并行度的成本阈值从 5 设置为 10(秒),这是查询开始并行的时间。
可以在 Sql Server Management Studio 中找到这两者,方法是右键单击服务器并选择“属性”,然后单击“高级”选项卡。
我发现这篇文章解释并解决了这个问题:
http://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/