SqlServer 填充因子的说明
CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfact
or=30
使用 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性能,但可能带来索引碎片的增加,我们可以建立一个维护计划,定期重建数据表上的索引,消除索引碎片,从而提高索引扫描效率和数据的读取效率
SqlServer 填充因子的说明的更多相关文章
- sql索引的填充因子多少最好,填充因子的作用?
当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满. 如果 ...
- sql 索引 填充因子(转)
和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味 ...
- sql索引的填充因子多少最好,填充因子有什么用
和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味 ...
- 转: SQL Server索引的维护 - 索引碎片、填充因子
转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题 ...
- 数据库的索引和填充因子fillfactor
索引分为聚簇索引和非聚簇索引 1.聚簇索引/聚集索引 聚簇索引的顺序就是数据的物理存储顺序,对于一个表来说,只有一个聚簇索引 create unique clustered index id_inde ...
- SQL SERVER 之 填充因子
填充因子依附索引而存在,但创建索引,就意味着要对表进行DML时,必须处理额外的工作量(也就是对索引结构的维护)以及存储方面的IO开销. 所以创建索引时,需要考虑创建索引所带来的查询性能方面的提高,与引 ...
- SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多), ...
- sql server 索引阐述系列七 索引填充因子与碎片
一.概述 索引填充因子作用:提供填充因子选项是为了优化索引数据存储和性能. 当创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余存储空间作为以后扩展 ...
- 如何检查SQL Server索引填充因子
假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水.结果会怎样呢?水会溢出来. SQL Server 的情况也是如此.当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的 ...
随机推荐
- JavaScript高级程序设计学习笔记第九章--客户端检测
1.能力检测:能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力.(我的理解就是识别浏览器能做什么不能做什么) 2.怪癖检测:目标是识别浏览器的特殊行为.但与能力检测确认浏览器支持什么能力不同, ...
- php file_get_contents超时处理
因为要用php去向我的虚拟主机管理系统发送开通空间等的请求,需要Post传值,由于开通空间过程很慢,同时需要延时处理.以下找到了一下file_get_contents的超时处理,网上有人用2个方法解决 ...
- Oracle查看表空间和表空间中的对象
select * from user_tables;--查询所有用户表 select username,default_tablespace from user_users;--查询当前表空间sele ...
- 在MongoDB中修改数据类型
引言 本文主要讲解Mongodb的类型转换.包括:string转double, string转int, string转Date. 0. 出现类型不一致的原因 ES导入数据到Mongo后,会出现类型统一 ...
- MongoDB官方C#驱动的AsQueryable踩到坑了
collection.AsQueryable().Where()有4个重载,分别是: public static IQueryable<TSource> Where<TSource& ...
- \n和\r\n的区别
\r是回车符,\n是换行符计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好 ...
- Weekly Contest 113
949. Largest Time for Given Digits (string::compare) Given an array of 4 digits, return the largest ...
- [Lintcode]Word Squares(DFS|字符串)
题意 略 分析 0.如果直接暴力1000^5会TLE,因此考虑剪枝 1.如果当前需要插入第i个单词,其剪枝如下 1.1 其前缀(0~i-1)已经知道,必定在前缀对应的集合中找 – 第一个词填了ball ...
- SpringMVC 的数据绑定
1.数据自动绑定 SpringMVC 框架支持不需要任何数据绑定的注解直接将表单参数绑定到我们的执行方法的参数上. 表单参数:包括 POST 以及 GET 发送过来的参数 就是以内容类型为:encty ...
- 聊聊 Laravel 5.5 的 「自动发现」
ThinkSNS是什么? ThinkSNS(简称TS),一款全平台综合性社交系统,目前最新版本为ThinkSNS+.ThinkSNS V4 ThinkSNS[简]. 看了Taylor Otwell发表 ...