基于填充因子的索引中数据的行为

DFo*_*k42 14 index sql-server sql-server-2008-r2 fill-factor

假设您有一个默认填充因子为 20 的数据库。每当插入数据时,它是否只创建填充到 20% 的页面?

据我了解,插入数据时,页面中将有大约 20% 的数据。但是,当数据更新时,它会扩展到索引的 20% 以上,直到填充它并生成页面拆分,对吗?

Tho*_*ger 16

填充因子仅在创建或重建索引时起作用。 它是在这些操作期间填充的叶级页面的索引的消耗量。(有关受影响的页面级别的更多说明,请参阅下面的注释

当对数据(INSERTUPDATE和/或DELETE)有 DML 命令时,它会发生在相应的受影响索引上。换句话说,如果您有一个已填充 20% 的页面,并且您将数据插入该页面,则该页面将包含超过 20% 的数据(假设为 35%,只是为了举例)。再做一次插入,现在页面已填充 64%。重建索引,叶级页面现在将相对包含您指定的空间百分比(或隐式服务器的默认值)。

请注意,当你没有指定PAD_INDEXON,填充因子只适用于叶级页。但是当你设置PAD_INDEX = ON,填充因子会考虑到该指数的中间级页。 默认为OFF

调整填充因子(而不是使用默认的 100/0)的原因是为了在插入或更新数据时最小化页面拆分。但请记住,没有什么是免费的。填充因子越低,通常占用的空间数据就越多。如果为索引保留 80% 的可用页面空间,它们将消耗相对较大的磁盘空间,从而导致更多读取。

据我了解,插入数据时,页面中将有大约 20% 的数据。但是,当数据更新时,它会扩展到索引的 20% 以上,直到填充它并生成页面拆分,对吗?

插入数据时,它会插入到相应页面的相应索引中。 这很可能而且很可能会导致页面消耗高于填充因子。

将新数据添加到完整索引页面时,将发生页面拆分。 然后,SQL Server 将拆分页面并将整个页面中大约一半的数据放入一个新页面中。同样,填充因子在这里不起作用。

降低填充因子的合理原因是最小化页面拆分,从而最小化索引页面碎片。

  • 它还最大限度地减少了增长或分配空间所需的 IO 操作。 (3认同)
  • @Jon:高填充因子索引碎片和读取速度变慢。对于每个索引,都有一个最佳填充因子——高于它和低于它的写入和读取速度都很慢。最优性取决于使用模式(每天插入多少次)、维护模式(重建的频率)、数据(关键是多么独特)。非唯一索引往往需要更多可用空间(较低的填充因子)。 (2认同)