填充因子设置的一般性准则和指导

来源:互联网 发布:嘻哈服装男淘宝 编辑:程序博客网 时间:2024/06/07 02:21

  和索引重建最相关的是填充因子。当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量。填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满。

如果你创建一个填充因子为100的聚集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,因为在现存的页上没有这些数据的空间。很多的页拆分会降低sqlserver的性能。

举个例子:假定你刚刚用缺省的填充因子新创建了一个索引。当sqlserver创建它时,它把索引放在相邻的物理页面上,因为数据能够顺序的读所以这样会有最优的i/o访问。但当表随着、、增加和改变时,发生了页拆分。当页拆分发生时,sqlserver必须在磁盘的某处分配一个新的页,这些新的页和最初的物理页不是连续的。因此,访问使用的是随机的i/o,而不是有顺序的i/o,这样访问索引页会变得更慢。

那么理想的填充因子是多少呢?它依赖于应用程序对sqlserver表的读和写的比率。首要的原则,按照下面的指导:

低更改的表(读写比率为100:1):100%的填充因子

高更改的表(写超过读):50-70%的填充因子

读写各一半的:80-90%的填充因子

在为应用程序找到最优的填充因子前也不得不进行试验。不要假定一个低的填充因子总比高的好。低的填充因子会减少页拆分,它也增加了sqlserver查询期间读的页数量,从而减少性能。太低的填充因子不仅增加i/o开销,也影响缓存。当数据页从磁盘移到缓存中时,整个页(包括空的空间)都移到缓存中。所以填充因子越低,不得不移到sqlserver缓存中的页面就越多,意味着同时为其他重要数据页驻留的空间就少,从而降低性能。

如果你没有指定填充因子,缺省的填充因子时0,意味着100%的填充因子(索引的叶页100%的填满,但索引的中间页有预留的空间)。

作为监控的一部分,你要决定新建索引或重建索引时的填充因子是多少。事实上,除了只读数据库,所有的情况,缺省值0都是不适合的。相反,你想要一个填充因子保留合适的自由空间,按照上面的讨论来做。







索引重建任务的时间间隔要相对一致。
如果索引较小,就没有必要去调整填充因子。
在索引级别上进行监控和更新,而不是表级别上。
保存填充一直在0,或者75和100之间。如果你要将填充因子设置为低于75,那么你必须自信你在做什么。保持较低的Scan Density和较低的平均Page Density是十分重要的情形。做一些观察,在将填充因子取值降低前,找出表被读取的频繁程度。
如果Scan Density高于或等于90%,别去改变填充因子,或者调整任务中填充因子至少不应该是首先被调整的。           
如果Scan Density在60%到90%之间,小小地降低一下填充因子,例如降低幅度2%。
如果Scan Density低于60%,则加大降低填充因子的幅度。填充因子的取值我一般会取平均Page Density和最初的填充因子之间的中值。例如Original Fill factor = 100,Average Page Density = 60,那么我就取填充因子为80。
如果Average Page Density大于Original Fill Factor,并且Scan Density接近于100%,那么要提高填充因子取值。这样做很好,因为你可以把更多的数据放在同一个页中。例如:Fill Factor = 80,Scan Density = 98,Average Page Density = 88。此时,在下次索引重建之前,页面按照8%的速度填充,而且该速度相对持续稳定;这种情况吓,就可以提高填充因子取值,但是不要超过92。因为按照8%的增长速度,页面马上会填充到100%而引起页拆分。我建议是提高到88%,并且开始观察下一步数据变化如何。
要力图避免改变填充因子过快。我建议多观察一些周期,然后微调。 


    
原创粉丝点击