SQL填充因子的作用(详细点)

qiuzhogyang 2010-12-17 09:59:25
FILLFACTOR 表示填充因子,填充因子实干什么用的
...全文
659 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hi_dzj 2011-11-13
  • 打赏
  • 举报
回复
wxf163 说的很是形象,很不错,容易理解。。。。
ohfox 2010-12-22
  • 打赏
  • 举报
回复 1
比如说一页8k,
每一行是1100,但是因为里面有varchar类型,所以每行是1000,现在正好一页上放了8行

啥时你突然想把其中的一行的varchar给update的更长的,现在被更新的那行有1100了,那这页上不就放不下了,sqlserver就要把这行移走....

填充就是预留这些update导致的增加的空间的
lcw321321 2010-12-22
  • 打赏
  • 举报
回复
楼上意思说堆是100%填充,如果出现页SLIP的话,还是50%原则?
guguda2008 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feixianxxx 的回复:]

引用 4 楼 xman_78tom 的回复:

填充因子用于控制创建索引时叶级索引页的填充率。

如果填充因子设置的过高,并且表上有频繁的 insert 和 update 操作,便会导致叶级索引页很容易便会被填满,需要进行分页。这样不但会导致 insert 和 update 操作性能降低,还容易产生索引碎片。

如果填充因子设置的过低,这样虽然有利于 insert 和 update ……
[/Quote]
堆没有排序,怎么可能有填充因子,本来就是类似于链表的存储方式
lcw321321 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feixianxxx 的回复:]
引用 4 楼 xman_78tom 的回复:

填充因子用于控制创建索引时叶级索引页的填充率。

如果填充因子设置的过高,并且表上有频繁的 insert 和 update 操作,便会导致叶级索引页很容易便会被填满,需要进行分页。这样不但会导致 insert 和 update 操作性能降低,还容易产生索引碎片。

如果填充因子设置的过低,这样虽然有利于 insert 和 update 操……
[/Quote]
...
对了,堆上 有默认填充因子么?

......
我也没找到相关资料,对堆来说,是怎么处理填充因子 以及页撕裂的呢?有些纠结,哈哈
ohfox 2010-12-21
  • 打赏
  • 举报
回复
其实就是为了将来update扩展可变长度字段的列预留空间,省的行在页里面放不下了被sqlserver搬来搬去的
billpu 2010-12-21
  • 打赏
  • 举报
回复
一般来说你insert操作多 设稍微小一点的填充因子
只是查询多的话 那就设稍微高一点的或者系统默认的
ohfox 2010-12-21
  • 打赏
  • 举报
回复
相当于oracle的PCTFREE
feixianxxx 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xman_78tom 的回复:]

填充因子用于控制创建索引时叶级索引页的填充率。

如果填充因子设置的过高,并且表上有频繁的 insert 和 update 操作,便会导致叶级索引页很容易便会被填满,需要进行分页。这样不但会导致 insert 和 update 操作性能降低,还容易产生索引碎片。

如果填充因子设置的过低,这样虽然有利于 insert 和 update 操作,但是由于会导致索引或表占用更多的页面,查询操作……
[/Quote]
...
对了,堆上 有默认填充因子么?
joyhen 2010-12-18
  • 打赏
  • 举报
回复
爱新觉罗好牛X一个,三花聚顶神功我顶
-晴天 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qiuzhogyang 的回复:]
我没那帮助呀!郁闷
[/Quote]

对了,找找看有没有联机丛书...
-晴天 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qiuzhogyang 的回复:]
我没那帮助呀!郁闷
[/Quote]

装一个.
qiuzhogyang 2010-12-17
  • 打赏
  • 举报
回复
我没那帮助呀!郁闷
dawugui 2010-12-17
  • 打赏
  • 举报
回复
这玩艺在帮助中写得清清楚楚.

填充因子
在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中。在表中插入新的数据行或更改索引列中的值时,Microsoft® SQL Server™ 2000 可能必须重新组织表中的数据存储,以便为新行腾出空间,保持数据的有序存储。这同样适用于非聚集索引。添加或更改数据时,SQL Server 可能不得不重新组织非聚集索引页中的数据存储。向一个已满的索引页添加某个新行时,SQL Server 把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片。有关更多信息,请参见表和索引构架。

创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。填充因子的值是从 0 到 100 的百分比数值,指定在创建索引后对数据页的填充比例。值为 100 时表示页将填满,所留出的存储空间量最小。只有当不会对数据进行更改时(例如,在只读表中)才会使用此设置。值越小则数据页上的空闲空间越大,这样可以减少在索引增长过程中对数据页进行拆分的需要,但需要更多的存储空间。当表中数据会发生更改时,这种设置更为适当。

提供填充因子选项是为了对性能进行微调。但是,使用 sp_configure 系统存储过程指定的服务器范围的默认填充因子,在大多数情况下都是最佳的选择。



说明 即使对于一个面向许多插入和更新操作的应用程序来说,数据库读取次数一般也超过数据库写入次数的 5 到 10 倍。因此,指定一个不同于默认设置的填充因子会降低数据库的读取性能,而降低量与填充因子设置值成反比。例如,当填充因子的值为 50% 时,数据库的读取性能会降低两倍。


只有当在表中根据现有数据创建新索引,并且可以精确预见将来会对这些数据进行哪些更改时,将填充因子选项设置为另一个值才有用。

填充因子只在创建索引时执行;索引创建后,当表中进行数据的添加、删除或更新时,不会保持填充因子。如果试图在数据页上保持额外的空间,则将有背于使用填充因子的本意,因为随着数据的输入,SQL Server 必须在每个页上进行页拆分,以保持填充因子指定的空闲空间百分比。因此,如果表中的数据进行了较大的变动,添加了新数据,可以填充数据页的空闲空间。在这种情况下,可以重新创建索引,重新指定填充因子,以重新分布数据。


fill factor 选项
使用 fill factor 选项指定当使用现有数据创建新索引时,Microsoft® SQL Server™ 应使每一页填满的程度。由于 SQL Server 必须在填充时花费时间分割这些页面,所以 fill factor 百分比会影响系统性能。

fill factor 百分比仅在创建索引时使用。这些页面都不可能被维护在任何特定的饱满水平上。

fill factor 的默认值为 0;其有效值是从 0 到 100。fill factor 的值为 0 并不表示页面的填满程度为 0%。类似于 fill factor 设置为 100 的情况,SQL Server 在 fill factor 值为 0 时,会用页面全部为数据的页来创建聚集索引,用页面全部为数据的叶子页来创建非聚集索引。与 fill factor 设置为 100 的情况不同的是,SQL Server 在索引树的高层级别上预留空间。很少有理由去改变 fill factor 的默认值,因为可以使用 CREATE INDEX 命令来覆盖它。

较小的 fill factor 值将导致 SQL Server 以不饱满的页面创建新索引。例如,将 fill factor 值设置为10 对于想在一个最终将保持较少数据的表上创建索引是合适的。越小的 fill factor 值将导致每一个索引占用更多的存储空间,但同时也允许以后可不进行页面拆分进行插入操作。

如果设置 fill factor 值为 100,SQL Server 以100% 的饱满度创建聚集和非聚集索引。设置 fill factor 的值为 100 仅对只读表是合适的,因为数据从来不被添加到此类表中。

fill factor 是一个高级选项。如果要用 sp_configure 系统存储过程改变该设置,必须把当 show advanced options 设置为 1 时仅能更改 fill factor,该选项在停止并重新启动服务器后生效。

飘零一叶 2010-12-17
  • 打赏
  • 举报
回复
为了减少索引中无序页的,也就是为了减少索引碎片。有利必有弊,具体情况具体分析。
王向飞 2010-12-17
  • 打赏
  • 举报
回复
举个例子
有十个座位 做了10个同学 那么填充因子为100%

1 2 3 4 5 6 7 8 9 10

如果新来同学,加一个座位 加在 5 6中间,那么后面的数据都要移动


如果十个座位做了5个同学
1 3 5 7 9 那么填充因子为50%
如果新来同学6 ,那么只需插入到5 和 7 之间就可以。
xman_78tom 2010-12-17
  • 打赏
  • 举报
回复
填充因子用于控制创建索引时叶级索引页的填充率。

如果填充因子设置的过高,并且表上有频繁的 insert 和 update 操作,便会导致叶级索引页很容易便会被填满,需要进行分页。这样不但会导致 insert 和 update 操作性能降低,还容易产生索引碎片。

如果填充因子设置的过低,这样虽然有利于 insert 和 update 操作,但是由于会导致索引或表占用更多的页面,查询操作便需要读取更多的页面,从而降低查询性能。


-晴天 2010-12-17
  • 打赏
  • 举报
回复
键盘太硬不好使,
"空出一些能手入记录的空间"
应为
"空出一些能插入记录的空间"
-晴天 2010-12-17
  • 打赏
  • 举报
回复
对聚集索引列,行的排列的物理顺序与索引排列的顺序是一致的,这就引起一个问题,如果要向一个表插入一个记录,有可能由于插入在表的中间某个位置,而要使其后的所有列都要向后移动一个行的空间,这种操作是很费时间的.
为此,先考虑在列的物理顺序排列位置上空出一些能手入记录的空间(这样要了解页的概念),然后,要插入的话,就可以不动全表,而只动动页上的内容就行了.
一页上,默认占用的存储空间(不含空的地方)占该页总存储空间的百分之几,就是填充因子.
「已注销」 2010-12-17
  • 打赏
  • 举报
回复
 fill factor 选项指定当使用现有数据创建新索引时,Microsoft® SQL Server™ 应使每一页填满的程度。由于 SQL Server 必须在填充时花费时间分割这些页面,所以 fill factor 百分比会影响系统性能。

fill factor 百分比仅在创建索引时使用。这些页面都不可能被维护在任何特定的饱满水平上。

fill factor 的默认值为 0;其有效值是从 0 到 100。fill factor 的值为 0 并不表示页面的填满程度为 0%。类似于 fill factor 设置为 100 的情况,SQL Server 在 fill factor 值为 0 时,会用页面全部为数据的页来创建聚集索引,用页面全部为数据的叶子页来创建非聚集索引。与 fill factor 设置为 100 的情况不同的是,SQL Server 在索引树的高层级别上预留空间。很少有理由去改变 fill factor 的默认值,因为可以使用 CREATE INDEX 命令来覆盖它。

较小的 fill factor 值将导致 SQL Server 以不饱满的页面创建新索引。例如,将 fill factor 值设置为10 对于想在一个最终将保持较少数据的表上创建索引是合适的。越小的 fill factor 值将导致每一个索引占用更多的存储空间,但同时也允许以后可不进行页面拆分进行插入操作。

如果设置 fill factor 值为 100,SQL Server 以100% 的饱满度创建聚集和非聚集索引。设置 fill factor 的值为 100 仅对只读表是合适的,因为数据从来不被添加到此类表中。

fill factor 是一个高级选项。如果要用 sp_configure 系统存储过程改变该设置,必须把当 show advanced options 设置为 1 时仅能更改 fill factor,该选项在停止并重新启动服务器后生效。

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧