数据库服务器100%,无缘无故

时间:2009-12-02 10:21:04

标签: sql sql-server sql-server-2005

我们有一台作为数据库服务器运行的Windows Server 2003(x64)。 数据库配备了32GB的RAM

通常数据库内存使用量(任务管理器)介于5-10%之间。 然而,有时数据库会突然猛烈地发射到100%,然后随机保留,并且不会对代码或执行进行任何更改。

所有支付或由我支付的研究都指向了一个存储过程。 当数据库为100%时,禁用此过程将使数据库恢复正常。

现在这听起来很明显,但这是一个奇怪的部分。

优化存储过程,内存使用量(来自执行计划)为0.01,这是非常好的。通常执行存储过程将立即返回结果集。我还支付了一个RackSpace Fanatic Support DBA来查看这个,他说他认为存储过程没有问题。

现在额外的奇怪的一点。

  • 立即运行SP。
  • 当DB为100%时,运行SP,会在几分钟后继续执行。
  • 禁用SP,将DB发送至5-10%。
  • 虽然启用了SP,但DB是100%,如果我打开一个新的查询窗口并从SP运行EXACT代码,但作为查询而不是SP,结果将立即返回< /强>

所以,虽然乍一看,听起来SP需要优化,但SP中的实际代码不是问题。

我很绝望!

2 个答案:

答案 0 :(得分:3)

执行计划可以根据SP的输入参数和结果集的大小而改变。

您可以尝试将WITH RECOMPILE添加到存储过程,以便为每个调用获取新的执行计划。它会使它稍慢一些,但有时SQL Server会遇到大多数查询异常糟糕的执行计划,并且重新编译会在这些情况下有所帮助。

答案 1 :(得分:1)

<强>探查:

SQL Server附带了一个名为Profiler的强大工具,可让您实时查看服务器上运行的查询。您应该运行探查器并找出实际发生的情况并使用它来查找罪魁祸首。

查询有4种测量值:内存,CPU,读取,写入。占用大量这些(单独或组合)并以高频率调用的SQL语句是优化的最佳选择。

运行配置文件并捕获输出后,您应该能够识别要优化的项目。然后,您可以运行SQL语句,查看执行计划并对其执行必要的优化。

(编辑:添加内容)

可能不是语句本身不是最优的,而是一些可能导致这种情况的锁定/阻塞/死锁。服务器上可能还有其他东西在占用此SP所需的资源,并导致CPU出现峰值。

阅读Profiler:

http://msdn.microsoft.com/en-us/library/ms187929.aspx