SQL 服务器长 运行 查询耗时数小时,但使用率低 CPU

SQL Server long running query taking hours but using low CPU

我 运行 SQL Server 2012 中的一些存储过程位于 Windows Server 2012 下,位于具有 32 GB RAM 和 8 CPU 内核的专用服务器中。 CPU 使用率始终低于 10%,RAM 使用率为 80%,因为 SQL 服务器分配了 20 GB(共 32 GB)。

有一些存储过程有时需要 4 个小时,而其他几天,几乎相同的数据需要 7 或 8 个小时。

我使用的是限制最少的隔离级别,所以我认为这不应该是锁定问题。数据库大小约为 100 GB,最大的 table 有大约 500 万条记录。

进程有批量插入、更新和删除(在某些情况下我可以使用 truncate 来避免生成日志并节省一些时间)。我正在 table.

中进行一些全文搜索查询

我可以完全控制服务器,因此我可以更改任何配置参数。

我有几个问题:

  1. 是否有可能提高查询的性能使用 并行度?
  2. 为什么 CPU 使用率这么低?
  3. 配置 SQL 服务器的最佳做法是什么?
  4. 最好的免费服务器审计工具是什么?我试过一个 来自 Microsoft 的名为 SQL Server 2012 BPA 但报告始终 为空,没有警告。

编辑: 我检查了日志,发现了这个:

03/18/2015 11:09:25,spid26s,Unknown,SQL 服务器遇到 82 次 I/O 请求在文件上完成的时间超过 15 秒 [ C:\Program Files\Microsoft SQL Server\MSSQL11.HLSQLSERVER\MSSQL\DATA\templog.ldf] 数据库 [tempdb] (2)。 OS 文件句柄是 0x0000000000000BF8。最新的longI/O的偏移量是:0x00000001fe4000

  1. 将最大内存增加到 24 GB。
  2. 将 tempdb 移出 c 盘并考虑多个 tempdb 文件,自动增长至少 128 Mbps 或 256 Mbps。
  3. 安装性能仪表板和 运行 性能仪表板报告以查看运行正在执行哪些查询并检查等待。
  4. 如果您在 10% 的用户数据日志和日志文件上使用自动增长,请将其更改为类似于上述 tempdb 增长的内容。
  5. 使用性能仪表板检查明显缺失的指标,预测 95% 或更高的改进影响。
  6. 无视那些说不要按照我的建议去做的反对者。如果您做了这 5 件事,但仍然遇到问题 post 性能仪表板的一些结果,顺便说一句,这是免费的。
  7. 还有一件可能有用的事情,下载并安装 sp_whoisactive 存储过程,运行 它并查看正在 运行 的进程。研究您在 运行ning sp_whoisactive.
  8. 之后找到的查询

query taking hours but using low CPU

你说好像 CPU 对大多数数据库操作都很重要。提示:他们没有。

数据库需要IO。 RAM sin 在某些情况下有助于缓解这种情况,但最终它会耗尽到 IO。

你知道我在你的问题中看到了什么吗? CPU,内存(假设 32gb 令人印象深刻)但没有关于光盘布局的字样。

这才是最重要的。光盘,分发文件以分散负载。

如果你查看性能计数器,那么你会发现光盘上的延迟非常高 - 因为无论你有什么 "pathetic"(在 sql 服务器术语中)光盘布局,它根本就没有启动到任务。

是时候开始购买了。 SSD 比光盘便宜很多。你可能会说 "Oh, how are they cheaper"。好吧,你不买 GB - 你买 IO。上次我检查 SSD 的成本不是光盘价格的 100 倍——但它们的 IO 是其 100 倍或更多。我们总是谈论随机 IO。

然后将 Tempdb 隔离在单独的 SSD 上 - tempdb 要么不做很多事情,要么做很多事情,你想看看这个。

然后隔离日志文件。

为数据库和 tempdb(特别是 tempdb - 有多少核心就有多少)制作多个数据文件。

是的,这需要花钱。但最后 - 你需要 IO 并且像大多数开发人员一样你得到了 CPU。对数据库不利。