可以在不重建索引的情况下更改特定表的填充因子吗?

Dav*_*ims 5 sql-server-2008 sql-server clustered-index fill-factor index-maintenance

我一直在四处挖掘,但没有任何运气。

SQL Server 2008:是否可以在不重建整个表的情况下调整特定聚集索引/表的填充因子?

例如,如果它有 4 亿条记录,我们是否可以调整填充因子并让 SQL Server 在所有尚未超过该限制的页面(以及新拆分)上使用新的填充因子,然后调整已超出该限制的页面?索引维护期间超限?

是否可以预先定义在下一次索引维护期间应该构建索引的填充因子?

Sol*_*zky 5

这不是FILLFACTOR工作方式。它仅适用于在 aCREATEREBUILD操作期间写入的页面。页面总是在创建或拆分时尽可能多地填充。

根据CREATE INDEX的 MSDN 文档:

FILLFACTOR 设置仅在创建或重建索引时适用。

因此,即使您FILLFACTOR在 a 期间更改了REBUILD(因为您的聚集索引已经存在),也只有现有页面会使用该值。随着新页面的创建和现有页面的拆分,它们将被填充,就像FILLFACTOR被设置为 一样100

或者,换句话说:重建操作在这里不是你的问题,因为你永远不会得到新的和拆分的页面来使用FILLFACTOR下面的100.

另外:不,不可能“预定义”对FILLFACTOR值的更改,该更改将在下次有REBUILD. 它只能在操作的WITH子句中指定REBUILD。但是,一旦您在重建期间应用了新值,该新值将被存储sys.indexes并再次用于后续重建,除非有人指定WITH (FILLFACTOR = x).

或者,再次以另一种方式表示:

  1. 只有在实际执行 a 时FILLFACTOR才能更改该值(我不认为索引的a和 re-是“更改”)。REBUILDDROPCREATE
  2. FILLFACTORCREATE INDEXand 使用ALTER INDEX ... REBUILD(从技术上讲也是如此DBCC DBREINDEX,但不应使用该值,因为它已从SQL Server 2005开始弃用);FILLFACTOR使用作为行被插入或更新作为会破坏具有在第一位置该选项的目的。

    FILLFACTOR现有数据页上保留空间,以便可以使用该空间(从而减少页面拆分的机会);不允许页面填充超出该FILLFACTOR值将永久保留该空间,从而有效地减少数据页面的大小,这实际上会增加而不是减少页面拆分的机会。

    页面拆分操作总是将大约 50% 移动到新页面。