SQL Server表索引的填充因子选项是最常见的针对索引的一种调优方法。索引的填充因子是一个百分比,用于告诉SQL Server每个叶级索引页可以填充多少索引数据,多少空间应该保留作为成长空间。如果基础表的列被修改或列被添加或在表中添加数据时,那么就会发生扩展。随着时间的推移索引碎片在增长,或者索引性能表现不佳,这是一个标志你可能需要调整最常用表的索引填充因子。问题是如何进行调整。
首先,你必须做的是避免发生这类状况,手动设置一个实例级的填充因子,也就是说填充因子将影响给定SQL Server实例中的所有表。原因很简单:每张SQL Server表都有自己的操作特性,有其自身的需要。填充因子默认设置为100% 。默认情况下,它可以随时间调整就像调整数据库性能一样。
第二件要记住的事情:有可能在很多实例中不需要调整填充因子。对只有几页的索引不必费心(使用DBCC SHOWCONTIG命令可知),反正这些索引都会被缓存起来。首先确认索引的最大页数和低扫描密度(使用DBCC SHOWCONTIG命令可知)。一个只有12页和50%密度的索引所产生的问题要远远小于一个有7000页和同样密度的索引。
第三,要明确需要调整多大,应该向什么方向调整,因为没有一个神奇数字可以满足所有的需求。填充因子设置太高,就会浪费大量的空间以及被拆分成单页。填充因子设置太低,数据库大小的增加会导致大量的输入/输出操作从而影响性能。
Randal建议开始的时候把70%作为默认值使用一个星期左右,然后根据变化的结果向上或向下调整这个值。在这方面SQL Server性能计数器(sys.dm_os_performance_counters)Page Splits/sec就是一个很大的帮助;计数器值越高,越需要对SQL Server表索引进行调优。
也有人建议,填充因子的设置取决于有问题表的读/写率,低更新(频繁读)的表使用高填充因子,反之亦然。因此,填充因子值不应低于60%-70%,除非你有一些极不寻常的使用方案,一般情况下都是写的数量级多于读。
另一个建议是:如果只是将数据添加到表的末尾,那么填充因子不能设置为0或100%。根据我的经验,追加方式操作的表通常受益于90%的填充因子,如果没有大量的更新操作,只需要空出足够的索引成长空间即可。
SQLTeam.com的Tara Kizer也谈到填充因子的更改如何会降低SELECT的性能,以及任何更改填充因子的动作必须要有定期的数据库性能审计。