如何微调一个巨大的有问题的堆表?

0 index sql-server clustered-index heap performance-tuning

问题:

一个巨大的表导致了一个非常重要的生产数据库(MS SQL Server 2016 SP1 标准版)上的严重性能问题。

关于有问题的表的事实:

  • 没有索引的堆表。
  • 450 GB 大小。
  • 超过 1.9 亿条记录。
  • 每次执行简单的 SELECT 查询时,物理 I/O 活动都超过 900 MB/s。如果查询包含 WHERE 子句,则最糟糕。
  • 在此表上执行的查询会导致应用程序 UI 延迟 4-5 分钟。

应用程序/系统制造商建议的解决方案:

  • 将堆表转换为聚集索引表。

与建议解决方案相关的建议性能调整步骤:

  • 截断 db 表(与客户同意删除超过 1 年的记录)。
    • 不要删除记录。将过去 1 年中创建的记录复制到临时表。截断原始表,然后将您从临时表复制的记录插入到清空的原始表中。
  • 对 db 表进行碎片整理。
  • 将 db 表从堆迁移到聚簇表。
  • 创建聚集索引。
  • 创建维护作业并安排它定期重新构建聚集索引。

我对社区的问题:

您将如何提高这种有问题的表的性能?您会在建议的性能调整步骤中添加或删除哪些内容?

非常感谢并提前感谢。

从这里开始编辑:

好的,我不想一一回复所有评论。所以我正在编辑问题并添加更多信息。

第一:我不是专家 DBA。我会说一个高级初学者。这就是为什么我在这里尽可能多地向社区学习。

第二:我们两周前才得到这个客户,我自己还没有完全访问环境。这个关于问题的信息(事实),关于表直接来自客户的系统管理员。

第三:因此,我不知道为什么该表是堆的第一手,没有索引,他们让它在没有任何分区的情况下增长这么多,等等。

第四:建议的解决方案和建议的步骤不是我自己的,而是直接来自整个系统的制造商(这是一个众所周知的统一通信系统,制造商在这方面是最好的。我想你们都知道哪个)。

5th:我希望下周可以完全访问环境,在此之前我只是想分享我手头的东西,并在陷入困境之前尝试获得尽可能多的意见/建议。

第 6 名:因为不幸的是,我将把这个烂摊子从这里拿走,并试图让它更好、更顺畅地工作。

感谢所有已经抽出时间并回复的人。我已经有了一些见识。一旦我手头有更多信息,我肯定会分享更多信息。

Dav*_*oft 5

基于这些事实,190M 行,450GB,未索引的堆,长时间运行的查询,您应该创建一个聚集列存储索引并以压缩的列格式存储数据。

但是,这可能不是最佳解决方案,因为您仍然有一个没有键和索引的表,这很奇怪。