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


14

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

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

Answers:


16

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

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

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

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

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

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

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

降低填充因子的合理原因是要最大程度地减少页面拆分,从而使索引页面碎片最小化。


3
它还最大程度地减少了增加或分配空间所需的IO操作。
JNK 2012年

好的,所以我对行为的工作方式感到错误。谢谢您这么详细的回答!
DForck42 2012年

1
@ DForck42没问题,很乐意提供帮助。
Thomas Stringer 2012年

我们可以总结一下,说设置低填充因子会降低读取速度(增加页面),但会加快插入速度(减少分割)吗?
所有行业的乔恩(Jon of All Trades)2012年

2
@Jon:具有高fillfactor索引碎片,读取速度变慢。对于每个索引,都有一个最佳的填充因子-在其上方和下方均会降低写入和读取的速度。最优性取决于使用模式(每天有多少插入),维护模式(其重建频率),数据(密钥的唯一性)。非唯一索引往往需要更多的可用空间(较低的填充因子)。
wqw 2012年
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.