2

我在具有 32 GB RAM 和 8 个 CPU 内核的专用服务器上运行 Windows Server 2012 下的 SQL Server 2012 中的一些存储过程。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 的报告,但报告始终是空的,没有任何警告。

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

2015 年 3 月 18 日 11:09:25,spid26s,未知,SQL Server 遇到 82 次 I/O 请求发生时间超过 15 秒才能完成文件 [C:\Program Files\Microsoft SQL Server\MSSQL11 .HLSQLSERVER\MSSQL\DATA\templog.ldf] 在数据库 [tempdb] (2) 中。操作系统文件句柄为 0x0000000000000BF8。最近的long I/O的偏移量是:0x00000001fe4000

4

2 回答 2

5
  1. 将最大内存提高到 24 GB。
  2. 将 tempdb 移出 c 驱动器并考虑多个 tempdb 文件,自动增长至少 128 Mbps 或 256 Mbps。
  3. 安装性能仪表板并运行性能仪表板报告以查看正在运行的查询并检查等待。
  4. 如果您在用户数据日志和 10% 的日志文件上使用自动增长,请将其更改为类似于上述 tempdb 增长的内容。
  5. 使用性能仪表板检查可预测 95% 或更高改进影响的明显缺失索引。
  6. 不要理会那些说不要做我建议的事情的反对者。如果您做了这 5 件事,但仍然无法从性能仪表板发布一些结果,顺便说一句,这些结果是免费的。
  7. 另一件事可能会有所帮助,下载并安装 sp_whoisactive 存储过程,运行它并查看正在运行的进程。研究运行 sp_whoisactive 后发现的查询。
于 2016-04-13T04:27:47.103 回答
4

查询需要数小时但使用低 CPU

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

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

你知道我在你的问题中看到了什么吗?CPU、内存(不知何故假设 32gb 令人印象深刻)但没有关于磁盘布局的信息。

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

如果您查看性能计数器,那么您会看到磁盘上的延迟非常高 - 因为无论您在那里拥有什么“可悲”(用 sql server 术语)磁盘布局,它根本无法胜任这项任务。

是时候开始购买了。SSD比光盘便宜很多。你可能会说“哦,它们怎么便宜”。好吧,你不买 GB - 你买 IO。上次我检查 SSD 并没有花费 100 倍于磁盘的价格——但它们的 IO 是它们的 100 倍或更多。我们总是谈论随机 IO。

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

然后隔离日志文件。

为数据库和 tempdb 制作多个数据文件(特别是 tempdb - 与您拥有的核心一样多)。

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

于 2016-04-13T04:37:57.923 回答