DFo*_*k42 14 index sql-server sql-server-2008-r2 fill-factor
假设您有一个默认填充因子为 20 的数据库。每当插入数据时,它是否只创建填充到 20% 的页面?
据我了解,插入数据时,页面中将有大约 20% 的数据。但是,当数据更新时,它会扩展到索引的 20% 以上,直到填充它并生成页面拆分,对吗?
Tho*_*ger 16
填充因子仅在创建或重建索引时起作用。 它是在这些操作期间填充的叶级页面的索引的消耗量。(有关受影响的页面级别的更多说明,请参阅下面的注释)
当对数据(INSERT
、UPDATE
和/或DELETE
)有 DML 命令时,它会发生在相应的受影响索引上。换句话说,如果您有一个已填充 20% 的页面,并且您将数据插入该页面,则该页面将包含超过 20% 的数据(假设为 35%,只是为了举例)。再做一次插入,现在页面已填充 64%。重建索引,叶级页面现在将相对包含您指定的空间百分比(或隐式服务器的默认值)。
(请注意,当你没有指定PAD_INDEX
是ON
,填充因子只适用于叶级页。但是当你设置PAD_INDEX = ON
,填充因子会考虑到该指数的中间级页。 默认为OFF
)
调整填充因子(而不是使用默认的 100/0)的原因是为了在插入或更新数据时最小化页面拆分。但请记住,没有什么是免费的。填充因子越低,通常占用的空间数据就越多。如果为索引保留 80% 的可用页面空间,它们将消耗相对较大的磁盘空间,从而导致更多读取。
据我了解,插入数据时,页面中将有大约 20% 的数据。但是,当数据更新时,它会扩展到索引的 20% 以上,直到填充它并生成页面拆分,对吗?
插入数据时,它会插入到相应页面的相应索引中。 这很可能而且很可能会导致页面消耗高于填充因子。
将新数据添加到完整索引页面时,将发生页面拆分。 然后,SQL Server 将拆分页面并将整个页面中大约一半的数据放入一个新页面中。同样,填充因子在这里不起作用。
降低填充因子的合理原因是最小化页面拆分,从而最小化索引页面碎片。