SQL Server长时间运行查询需要数小时但使用低CPU

时间:2015-03-18 12:42:08

标签: sql-server sql-server-2012 database-performance long-running-processes server-configuration

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

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

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

进程具有批量插入,更新和删除(在某些情况下,我可以使用truncate来避免生成日志并节省一些时间)。我在一个表格中进行了一些全文搜索查询。

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

我有几个问题:

  1. 是否可以使用提高查询的性能 并行?
  2. 为什么CPU使用率如此之低?
  3. 配置SQL Server的最佳做法是什么?
  4. 审核服务器的最佳免费工具是什么?我试了一个 来自Microsoft称为SQL Server 2012 BPA,但该报告始终如此 空无任何警告。
  5. 编辑: 我检查了日志,发现了这个:

    03/18/2015 11:09:25,spid26s,未知,SQL Server遇到82次发生的I / O请求需要超过15秒才能完成文件[C:\ Program Files \ Microsoft SQL数据库[tempdb](2)中的Server \ MSSQL11.HLSQLSERVER \ MSSQL \ DATA \ templog.ldf]。 OS文件句柄为0x0000000000000BF8。最新的长I / O的偏移量为:0x00000001fe4000

2 个答案:

答案 0 :(得分:5)

  1. 将最大内存增加到24 GB。
  2. 将tempdb从c驱动器上移开并考虑多个tempdb文件,自动增长至少128 Mbps或256 Mbps。
  3. 安装性能仪表板并运行性能仪表板报告以查看正在运行的查询并检查等待。
  4. 如果您对用户数据日志和10%的日志文件使用alto frow,请将其更改为与上面的tempdb增长类似的内容。
  5. 使用性能仪表板检查明显缺失的索引,预测95%或更高的改进影响。
  6. 无视那些说不做我所建议的人。如果您执行这5项操作,并且仍然无法从性能仪表板发布一些结果,顺便说一下,这是免费的。
  7. 可能有用的另一件事,下载并安装sp_whoisactive存储过程,运行它并查看正在运行的进程。研究运行sp_whoisactive后发现的查询。

答案 1 :(得分:3)

  

查询花费数小时但使用低CPU

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

数据库需要IO。 RAM罪在某些情况下有助于减轻这种情况,但最后它会向下运行到IO。

你知道我在你的问题中看到了什么吗? CPU,内存(以某种方式假设32gb令人印象深刻)但是没有在DISC布局中使用。

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

如果你研究性能计数器,那么你会发现光盘上的延迟非常高 - 因为无论你在那里有什么“可怜”(在sql server术语中)光盘布局,它根本不能完成任务。

开始购买的时间。 SSD比光盘便宜很多。你可能会说“噢,它们如何便宜”。好吧,你不买GB - 你买IO。上次我检查SSD的价格不是光盘价格的100倍 - 但它们有100倍或更多的IO。我们总是谈随机IO。

然后在单独的SSD上隔离Tempdb - tempdb要么没有很多,要么TON,你想要看到它。

然后隔离日志文件。

为数据库和tempdb创建多个数据文件(特别是tempdb - 与核心一样多)。

是的,这会花钱。但最后 - 你需要IO和大多数开发人员一样,你有CPU。数据库不好。