MS SQL 页面拆分混乱

Mas*_*hax 8 index sql-server page-splits fill-factor

我对 MS SQL 中的页面拆分有点困惑,我正在寻找明确的答案。这个故事似乎有两个版本:

1 - Fillfactor 仅影响创建/重建索引时的完整页面。页面拆分始终为 50/50

2 - Fillfactor 也会影响页面的分割方式。因此,如果有 70% 的填充因子并且页面溢出,它将拆分 70/30

非常感谢

Mic*_*een 10

来自在线书籍(强调我的):

FILLFACTOR =fillfactor 适用于:SQL Server 2008 到 SQL Server 2016,SQL 数据库 V12。

指定一个百分比,该百分比指示数据库引擎在索引创建或重建期间应使每个索引页的叶级达到多少。fillfactor 必须是从 1 到 100 的整数值。如果 fillfactor 为 100,则数据库引擎创建的索引将叶页填满。

FILLFACTOR 设置仅在创建或重建索引时适用。数据库引擎不会在页面中动态保留指定百分比的空白空间。要查看填充因子设置,请使用 sys.indexes 目录视图。

填充因子适用于叶页。PAD_INDEX将决定非叶子页面会发生什么。从同一个 BoL 页面:

PAD_INDEX = { ON | 离开 }

ON 由fillfactor 指定的可用空间百分比应用于索引的中间级页面。

OFF 或 fillfactor is not specified 中级页被填充到接近容量

页面拆分可以发生在 BTree 的所有级别,包括根级别。然而,由于扇出,中间页分裂的频率(通常)比叶子分裂的频率小一个数量级。非叶子页面也比叶子页面少得多。因此,PAD_INDEX 不如 FILLFACTOR 重要。仍然值得考虑,尤其是在随机插入的索引上。

在写入期间,页面将被填充到 100%。然后他们将拆分 50/50,或尽可能接近以确保每一行都完全包含在一个页面上。我相信分裂总是50/50。但是,后续写入可能会出现偏差,因此其中一个新页面的填充速度比另一个快得多。