我完全意识到我正在删除一个 8 年前(撰写本文时)开始的线程,但是对于 NEWID()、NEWSEQUENTIALID()、“不断增加的整数”存在一些严重的误解”,以及我简称为“ExpAnsive Updates”(带有“A”)的东西,它实际上是 ExpEnsive(带有“E ")。
让我们先讨论后者,这可能是 OP 遇到的真正问题......
只有很小的区别,当涉及到不必要的页面拆分创建和由此产生的碎片时,这并不重要,NEWSEQUENTIALID 和“不断增加的 INT”都以相同的方式工作......它们本身,它们只创建“好的”页面拆分(这也是“坏的”,但这是一个不同讨论的主题)。因此,参考最初发布的问题,Op 表示从完全随机的 NEWID 切换到“不断增加的”NEWSEQUENTIALID 似乎对正在创建的碎片量没有影响。
原因不是 NEWSEQUENTIALID 有问题(它没有)。碎片问题很可能是正在插入新行(这将导致 NEWSEQUENTIALID 没有碎片),然后这些新行会受到另一个进程来更新它们。如果更新是“ExpAnsive”,其中一行中的某些可变宽度列变得更宽,那么这将导致大量页面拆分。即使您使用相当低的 FILL FACTOR 构建索引也会发生这种情况,因为 INSERTS 不会因为它们达到 FILL FACTOR 而停止插入页面。相反,大量插入将插入到页面中,直到它们几乎 100% 填满(取决于每页的行数,这取决于插入的行的宽度),然后使用“好”页面创建一个新页面分裂几乎没有碎片,就像你使用一个不断增加的整数一样。
因此,您将所有这些行插入到连续的页面中,它们会被填充到尽可能接近 100% 的位置。一切都很好......没有碎片。但是随后您执行“插入后处理”来更新您刚刚插入的行。如果行的大小由于“ExpAnsive”而增加,那么 KAAAA-BOOOOOM !!!所有这些完全完整的页面最终都会分裂。
这种扩展的最常见来源之一是人们使用“穷人的审计”并且他们有一个从 NULL 变为某个值的“Modified_BY”列。有很多方法可以解决这个特定问题,但同样超出了本主题和帖子的范围。
转向由 NEWID() 生成的随机 GUID... 有很多不使用它们的理由,但是,与你一直相信的完全相反,碎片实际上不是其中之一。我已经以非常“爱丽丝的餐厅时尚”(大量图形和图形上的符号)的方式进行了几次演示,证明了这一点。为了制作适合这篇文章的超过 1 小时的演示文稿,我会告诉你,这一切都归结为人们不断犯的几个小但致命的错误......
他们继续使用 REORGANIZE,因为它被认为是“最佳实践”是主要问题。他们没有意识到 REORGANIZE 实际上并不能像他们认为的那样对 GUID 起作用。它实际上并没有在页面上提供额外的空间,而是删除了额外的空间,而且,我的索引管理员伙伴,实际上使 GUID 的碎片化。在随机指南上进行索引维护时,您不得使用重组!时期!!!即使您使用的是 Express 或 Standard Edition,也不会。如果您没有时间、资源或磁盘空间来重建它们,那么实际上最好不要对随机 GUID 进行任何索引维护,而不是使用 REORGANZE 来做错事。等到可以进行重建。
您必须在随机 GUID 键控索引上设置较低的 FILL FACTOR。将它们留在“0”几乎与重组它们一样糟糕。当然,取决于索引的行有多宽,每天插入多少行,以及您希望在随机 GUID 上使用绝对零页面拆分(甚至不应该是“好”的!!!)多长时间索引,我告诉人们将他们的 FILL FACTOR 设置为 71、81 或 91。我让所有这些都以“1”结尾的原因是因为当“ExpAnsive”更新时,你需要为随机 GUID 修复最后一件事不存在,这是下面的第 3 项。
您必须每天晚上检查基于随机 GUID 的索引。我选择给他们所有以“1”结尾的填充因子的原因是因为这就是你正在寻找的逻辑碎片的百分比。只要它们超过 1% 标记,您就必须重新构建它们,因为几乎整个索引中的每一页都处于将要拆分的位置。 (我称这些为“低阈值重建”)。现在,不要混淆。如果一切设置正确并且没有“ExpAnsive”更新,那么您的 GUID 键控聚集索引可以持续数周而没有分页或相关碎片,而您的更窄的非聚集索引可以在几个月内完全没有碎片!
当然,另一个大错误是“ExpAnsive”更新。这些将杀死几乎所有东西,但令人惊讶的是,随机 GUID 实际上比使用上述相同步骤的大多数其他东西更能经受住这样的冲击。
您真正需要做的是修复“ExpAnsive”更新,使它们不再是“ExpAnsive”。就像我说的那样,这是一个完整的主题,对于这篇文章来说是非常渴望的。