前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >维护索引(2)——填充因子

维护索引(2)——填充因子

作者头像
逸鹏
发布2018-04-11 11:30:10
7350
发布2018-04-11 11:30:10
举报
文章被收录于专栏:逸鹏说道逸鹏说道

前言:

在第九章中,已经介绍了如何使用索引,当一个索引创建时,以B-Tree格式存放数据,拥有根节点、中间节点、叶子节点。叶子节点是最底层的节点,在聚集索引中,包含了实际数据,而每个数据页有8KB。

当表中的数据的增删改发生时,会尝试把数据插入到合适的数据页中。比如有一个聚集索引在SSN上,当插入一个新的SSN数时。SQLServer会尝试把数据插入到合适的数据页,假设SSN从2开始,此时在最后的数据页中找到这个页面是以SSN开始的,SQLServer将会仅仅在这个页中插入新行。如果你的8K页面已经满了,或者没有足够的空间来存放新的SSN,此时就会发生分页,数据页会一分为二,或者分成更多的页,分页的数量根据新数据的大小。如果新数据不大,那么新数据将只会使数据页拆分成两个,且每个页只有一半是有数据的。否则,将要动用更多的页。SQLServer会尝试在同一级别的数据页中,优先从右边插入新数据。

当有足够的空间存放新数据时,进程不需要等待页面拆分和I/O完成。这里有一个很重要的开销,页面拆分会锁住整个页,拒绝其他操作使用这个页,直到进程完成。

此时,填充因子就成为关注点。填充因子决定你的页在初始化情况。假设你填10,那么你的数据页将在10%填满的时候就会分页。当你超过10%时,会保持90%的页面空余,然后创建新页给其他数据。

现在,当你插入新数据时,不用担心由于也分裂导致I/O开销,因为你有90%的空间用于存放新数据,所以如果你的填充因子是一个小值,可以降低由于页分裂而造成的I/O开销,有助于你更快地写数据。

总之,填充因子是一个双刃剑,合理的使用能提高性能。对写入操作的性能提升往往会对读取操作的性能有降低效果。填充因子仅仅在创建或重建一个索引时有影响,在日常的DML操作中,页依然会100%填满。

准备工作:

在学习索引的填充因子如何设置钱,有必要找出当前的填充因子值,以便决定当前的填充因子是否适用和应该使用什么新的值来代替,这些需要根据实际环境而定。这里有两部分需要检查的:

1、 sys.indexes:这个目录视图可以用于查看当前填充因子:

  1. --查看索引的填充因子
  2. SELECT OBJECT_NAME(object_id) AS TableName ,
  3. name AS IndexName ,
  4. type_desc ,
  5. fill_factor
  6. FROM sys.indexes
  7. WHERE type_desc <> 'HEAP'

2、 sys.configurations:这个目录视图可以用于查看服务器上的默认填充因子的值:

  1. SELECT [Description] ,
  2. value_in_use
  3. FROM sys.configurations
  4. WHERE name = 'fill factor (%)'

如果默认值为0,代表不会保留任何空余空间在页上。

分析:

当你决定填充因子需要改变的时候,可以使用以下脚本来更改:

  1. --把填充因子修改成%
  2. ALTER INDEX [idx_refno] ON [dbo].[ordDemo]
  3. REBUILD WITH (FILLFACTOR=80)
  4. GO
  5. --修改服务器的默认填充因子的值:
  6. sp_configure 'show advanced options',1
  7. GO
  8. RECONFIGURE
  9. GO
  10. --改成%
  11. sp_configure 'fill factor',90
  12. GO
  13. RECONFIGURE
  14. GO

当填充因子为90的时候,在数据页初始化的时候,会有90%的空间初始化填满,只保留10%的空间供以后使用,如果执行DML命令时,会找到空间给新数据插入,从而避免分页的I/O开销。

扩展信息:

对于静态表,高的填充因子(90~100%)会比较好,对于那些需要同时更新的表,或者一直在增长的表同样有效。如果高频率更新的表,使用较低的值会比较好,如70~80%。

如果表上自增列有聚集索引,把填充因子设为100%没有任何问题,因为每个数据都会插到最后一页的最后一行。不会存在在中间插入数据的情况。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 准备工作:
  • 分析:
  • 扩展信息:
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档