我有一个大表,它有一个带有标识主键的聚集索引。我正在确定此表的填充因子的正确值,以最大程度地减少页面拆分。我们使用每天运行的脚本来维护索引,该脚本会测量碎片并采取适当的措施。该表包含可变长度列。
我的第一个想法是将其设置为 100(因为记录应该只写入表的末尾),但我认为对可变长度列的更改也可能导致页面拆分,所以我现在转向 90。
任何建议表示赞赏。
我有一个大表,它有一个带有标识主键的聚集索引。我正在确定此表的填充因子的正确值,以最大程度地减少页面拆分。我们使用每天运行的脚本来维护索引,该脚本会测量碎片并采取适当的措施。该表包含可变长度列。
我的第一个想法是将其设置为 100(因为记录应该只写入表的末尾),但我认为对可变长度列的更改也可能导致页面拆分,所以我现在转向 90。
任何建议表示赞赏。
尼克说得很对。
如果您进行更新以增加打包页面上记录的大小,那么您将导致页面拆分,但除此之外,使用标识主键不会导致聚集索引中的页面拆分。
(虽然这样说,存储引擎可以执行 5 种类型的页面拆分,但并非所有这些都会导致碎片和数据移动 - 插入单调递增的标识值时得到的一种是页尾拆分。但是我跑题了……)
我已经帮助了很多客户,并且我围绕它编写了 BOL——如果你只想选择一个值作为基础,70% 的客户取得了最大的成功。正如尼克所说,进行适当的监控和调整。
为任何索引选择填充因子是一种平衡行为,即发生了多少将页面填充度推向 100% 的活动,以及您可以多久采取一次纠正措施来重置填充因子。如果您将填充因子设置得非常低,例如 50%,您需要考虑最初会在页面上“浪费”多少空间,但我再次看到这在某些情况下是合适的。
您还应该考虑如何使用索引。如果它只是用于单例查找,您可能会获得较低的填充因子和更多的重建/碎片整理时间,因为您不会因为在内存中拥有大量稀疏填充的聚集索引而浪费太多的 IOs/内存。对于进行大范围扫描,您希望填充因子稍高一些,以提高 IO 和内存效率。
还有 OLTP 与 DW 的问题 - 通常 DW 是不变的,因此索引将具有 100% 的填充因子。OLTP 是最难的部分。
整理完聚集索引后,请记住非聚集索引也需要注意,因为它们很可能会变得碎片化。
重置填充因子时,请记住您可以在重建和碎片整理之间进行选择。DBCC INDEXDEFRAG/ALTER INDEX ... REORGANIZE 在某些情况下可以为没有严重碎片的索引重置填充因子。
希望这可以帮助!
(对不起'过度回答' - 我的一个热键,已经编写了代码:-)
这取决于
这是一个平衡的行为。如果您的表是读取密集型的,没有太多更新或删除,那么默认值(即 100)应该没问题。
如果您的表是写密集型的,有很多更新,那么低于 80 的值可能更合适。
这些东西没有神奇的公式。(AFAIK,如果有请告诉我)最好的办法是有一个测试环境,有一些工作量来测试。进行更改并查看您的数据库如何处理工作负载。