具有代理标识键的聚集索引的填充因子的正确值

具有代理标识键的聚集索引的填充因子的正确值

我有一张大表,其中有一个带标识主键的聚集索引。我正在确定此表的填充因子的正确值,以尽量减少页面拆分。我们使用每天运行的脚本来维护索引,该脚本会测量碎片并采取适当的措施。该表包含可变长度的列。

我的第一个想法是将其设置为 100(因为记录应该只写入表的末尾)但我认为对可变长度列的更改也可能导致页面分割,所以我现在转向 90。

任何建议都值得赞赏。

答案1

这取决于

这是一种平衡行为。如果您的表是读取密集型的,没有太多的更新或删除,那么默认值(即 100)应该没问题。

如果您的表写入非常密集,并且有大量更新,那么低于 80 的值可能更合适。

对于这些东西,没有什么神奇的公式。(据我所知,如果有,请告诉我)最好的办法是有一个测试环境,有一些工作负载来测试。进行更改并查看数据库在工作负载下的表现。

答案2

尼克的说法基本正确。

如果您进行的更新增加了打包页面上的记录大小,那么您将导致页面拆分,但除此之外,使用标识主键,没有什么会导致聚集索引中的页面拆分。

(尽管这么说,存储引擎可以进行 5 种类型的页面分割,但并非所有类型的分割都会导致碎片和数据移动 - 插入单调递增的标识值时得到的是页面末尾的分割。但我离题了......)

我已经帮助过很多客户,并且我围绕这一切编写了 BOL - 如果您只想选择一个值作为基础,那么 70% 的成功率最高。正如 Nick 所说,监控并酌情调整。

为任何索引选择填充因子都是一个平衡过程,即有多少活动将页面填充率推向 100%,以及您可以采取纠正措施重置填充因子的频率。您需要考虑如果将填充因子设置得非常低(例如 50%),页面上最初会“浪费”多少空间,但我再次发现在某些情况下这是合适的。

您还应该考虑索引的使用方式。如果仅用于单例查找,则可以使用较低的填充因子并在重建/碎片整理之间留出更多时间,因为您不会因为内存中有大量稀疏填充的聚集索引而浪费太多 IO/内存。对于进行大范围扫描,您需要将填充因子调高一些,以提高 IO 和内存效率。

还有 OLTP 与 DW 的问题 - 通常 DW 是不变的,因此索引的填充因子为 100%。OLTP 是困难的部分。

整理好聚集索引后,请记住非聚集索引也需要注意,因为它们很可能会产生碎片。

重置填充因子时,请记住您可以选择重建或碎片整理。在某些情况下,对于碎片不是太严重的索引,DBCC INDEXDEFRAG/ALTER INDEX ... REORGANIZE 可以重置填充因子。

希望这可以帮助!

(抱歉回答得太多了,这是我写代码时最关心的问题之一:-)

相关内容