带有替代标识密钥的聚簇索引的填充因子的正确值


8

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

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

任何建议表示赞赏。

Answers:


6

这取决于

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

如果您的表的写操作非常繁琐,并且有很多更新,那么低于80的值可能更合适。

这个东西没有魔术公式。(AFAIK,如果有,请让我知道。)最好的方法是拥有测试环境,要测试一些工作量。进行更改并查看数据库如何处理工作负载。


8

尼克几乎是正确的。

如果进行更新以增加打包页面上的记录大小,则会导致页面拆分,但除此之外,使用身份主键不会导致聚集索引中的页面拆分。

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

我已经为许多客户提供了帮助,我围绕这一切编写了BOL-如果您只是想作为实物入账的一种价值,那么70%的成功就是最大的。正如尼克所说,请进行适当的监视和调整。

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

您还应该考虑如何使用索引。如果仅用于单例查找,您可能会因为较低的填充因子以及在重建/碎片整理之间花费更多时间而得不到解决,因为您不会因为在内存中拥有很多稀疏的聚集索引而浪费过多的IO /内存。为了进行大范围扫描,您需要将填充系数提高一些,以提高IO和内存效率。

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

整理完聚集索引之后,请记住,非聚集索引也需要引起注意,因为它们很可能会变得零散。

重置填充因子时,请记住,您可以在重建和碎片整理之间进行选择。DBCC INDEXDEFRAG / ALTER INDEX ...在某些情况下,REORGANIZE可以重置索引的填充因子,这些索引的碎片不很严重。

希望这可以帮助!

(对不起,“过度回答”-我的快捷按钮之一,已编写了代码:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.