SQL 服务器可用性问题:大型查询会阻止其他连接

SQL 服务器可用性问题:大型查询会阻止其他连接

我有一台运行 MS SQL 2008 的高规格(多核、RAID)服务器,上面有多个数据库。我有一个低吞吐量进程,它定期需要从其中一个数据库获取少量信息,代码似乎运行良好。

然而,有时当我的一位同事对另一个数据库进行大量查询时,我会看到机器的 CPU 使用率已达到满负荷状态,并且来自我的应用程序的连接超时。

为什么会发生这种情况?我原本以为许多核心和硬盘(与巧妙编写的数据库服务器一起)能够以某种方式为其他应用程序保留至少部分资源?我很确定他不会在查询中使用多个连接。

我该怎么做才能防止这种情况发生?

编辑

我对硬件没有太多了解。它使用普通硬盘,已进行 RAID,带有 Server 2k3。这是一台 HP 电脑,可能已有几年历史了。基本上,我认为硬件是问题所在,这毫无道理,所以我猜想我可能配置错了?

答案1

这意味着你的查询非常不理想。常见的怀疑对象有:

  • 没有索引或索引不好
  • WHERE 子句中列上的函数(=忽略索引)
  • 数据类型转换/优先级(=忽略索引)
  • SELECT 子句中带有表访问的标量 udfs(= CURSOR 影响)
  • 视图查询/与视图连接(视图是一个扩展的宏)

这也可能是一个简单的资源问题:返回的数据是否触及整个数据库,因此占用了太多内存,导致分页?或者您是否遇到了 ASYNC_NETWORK_IO 等待,这可能意味着客户端接受结果的速度不够快?

一般来说,如果服务器达到最大限度,那么是代码和/或设计不佳,而不是数据库引擎。

答案2

只要您确定自己已经尽可能地进行了优化,您可能就想查看并行度设置;默认设置是使用所有处理器进行并行查询,您可以根据您拥有的处理器数量将其更改为最大值较低的数字,查询可能需要更长时间才能运行,但它应该会留下足够的处理能力来处理登录请求。如果问题仅限于这一个查询,您可以让您的同事通过添加 MAXDOP 选项来更改他/她的查询,而不是进行系统范围的设置更改,看看是否有帮助。

相关内容