SqlServer的填充因子

SqlServer 填充因子的说明

使用 fill factor 选项可以指定 Microsoft SQL Server 2005 使用现有数据创建新索引时将每页填满到什么程度。由于在页填充时 SQL Server 必须花时间来拆分页,因此填充因子会影响性能。

仅在创建或重新生成索引时使用填充因子。页面不会维护在任何特定的填充水平上。

fill factor 的默认值为 0,有效值介于 0 和 100 之间。FILLFACTOR 设置为 0 或 100 时,叶级别几乎完全填满,但至少会保留一个其他索引行的空间。这样设置后,叶级别空间会得到有效利用,而且仍有空间可以在必须拆分页之前进行有限扩展。很少需要更改 fill factor 的默认值,因为可以使用 CREATE INDEX 或 ALTER INDEX REBUILD 语句来覆盖其对于指定索引的值。

注意:

填充因子的值 0 和 100 在所有方面都是相同的。

fill factor 选项是一个高级选项。如果使用 sp_configure 系统存储过程来更改该设置,则只有在 show advanced options 设置为 1 时才能更改 fill factor。设置在重新启动服务器后生效。

提供填充因子选项是为了优化索引数据存储和性能。当创建或重新生成索引时,填充因子值可确定每个叶级页上要填充数据的空间百分比,以便保留一定百分比的可用空间供以后扩展索引。例如,指定填充因子的值为 80 表示每个叶级页上将有 20% 的空间保留为空,以便随着在基础表中添加数据而为扩展索引提供空间。

填充因子值是 1 到 100 之间的一个百分比。在大多数情况下,服务器范围的默认值 0 是最佳选项。如果将填充因子设置为 0,将几乎最大限度地填充叶级页,但是至少会留出再添加一个索引行的空间。使用此设置可有效使用叶级空间,但应保留一定的空间以便在不得不拆分页之前进行有限的扩展。

可以使用 CREATE INDEX 或 ALTER INDEX 语句来设置各个索引的填充因子值。若要修改服务器范围的默认值,请使用 sp_configure 系统存储过程。若要查看一个或多个索引的填充因子值,请使用 sys.indexes 目录视图。

重要事项:

只有在创建或重新生成了索引后,才会应用填充因子。SQL Server 2005 Database Engine 并不会在页中动态保持指定的可用空间百分比。如果试图在数据页上保持额外的空间,将有背于使用填充因子的本意,因为随着数据的输入,数据库引擎 将不得不在每个页上进行页拆分,以保持填充因子所指定的可用空间百分比。

页拆分和性能注意事项

如果向已满的索引页添加新行,数据库引擎 将把大约一半的行移到新页中,以便为该新行腾出空间。这种重组称为页拆分。页拆分可为新记录腾出空间,但是执行页拆分可能需要花费一定的时间,此操作会消耗大量资源。此外,它还可能造成碎片,从而导致 I/O 操作增加。正确选择填充因子值可提供足够的空间以便随着向基础表中添加数据而扩展索引,从而减少页拆分可能性。

如果经常发生页拆分,可通过使用新的或现有的填充因子值来重新生成索引,从而重新分发数据。索引重建Sql举例:

ALTER INDEX ALL ON dbo.XS_XJ

REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,

STATISTICS_NORECOMPUTE = ON);

这表示对XS_XJ表上的所有索引,重新生成,填充因子是80

ALTER INDEX Index_XS_XJ_XH ON dbo.XS_XJ

REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,

STATISTICS_NORECOMPUTE = ON);

这表示对XS_XJ表上的Index_XS_XJ_XH索引,重新生成,填充因子是80

尽管采用较低的填充因子值(非 0)可减少随着索引增长而拆分页的需求,但是索引将需要更多的存储空间,并且会降低读取性能。即使对于面向许多插入和更新操作的应用程序,数据库读取次数一般也超过数据库写入次数的 5 到 10 倍。因此,指定一个不同于默认值的填充因子会降低数据库的读取性能,而降低量与填充因子设置的值成反比。例如,当填充因子的值为 50 时,数据库的读取性能会降低两倍。读取性能降低是因为索引包含较多的页,因此增加了检索数据所需的磁盘 I/O 操作。

举例说明

打个比方,为了给一个班的100个同学排一下顺序,我们可以给每一位同学一个编号,如: a. 从1,2,3,4,5,6,7,.....100。这时,我们说填充因子是100.

此时,如果又来了新同学,而其排名要在中间某位置的话,我们就要改变许多个同学的号码,如新同学排5号,就需要将5号以后的同学号码都加1才行.

b.我们又可以给同学这样编号:10,20,30,40,50,60,70.......1000

也同样完成了顺序的排列.我们说这时填充因子是0,此时如果来了新同学,又是排在第七位的话,那么我们只许将其号码编为65就行了.其它同学都不用变.

可以看出,填充因子大的时候,点用的号码空间小,耗费资源少,小的时候呢,占用资源加大,但操作方便,迅速.

所以,在SQL2000O中索引的填充因子就是这个道理,填充因子大的时候,插入或修改记录后重新索引的工作会很大,磁盘IO操作增加,性能必然降,但其占用空间小.填充因子小的时候呢,索引文件占用磁盘及内存空间相对要大,但是,系统身重新索引所需IO操作减少,性能提高,只是多占用一些存储空间.

个人建议

创建索引时,填充因子可以设置一个较高的值,例如:90以上。这样可以避免索引拆分的页数变多,提高IO性能,但可能带来索引碎片的增加,我们可以建立一个维护计划,定期重建数据表上的索引,消除索引碎片,从而提高索引扫描效率和数据的读取效率
--------------------- 

原文:https://blog.csdn.net/baoshan/article/details/2988132 
 

=========================================第二种解释==================================

一张A4纸,用word去写东西, 写了两页 比如,每页10行,且只能容纳10行
现在你要修改第一页的内容,增加一行,在第9行增加,是不是从10行之后全部顺延下去,然后 word自动增加了第三页??
这个时候,如果你的填充因子是20行,但,你每页还是只填入了10行,
那么,你在第一页的第9行增加一行之后,发生了什么事?
恩,结果就是,仍是两页,且,第二页的文档没有发生任何变化。

这个时候,就有个问题啦: 在什么情况下用多大的填充因子呢? 呵呵。的确, 要看具体需要了,写的多,则大,查的多,则小,具体情况具体对待。

延伸:
索引最终要的参数:是填充因子。
当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量。填充因子设置为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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值