SQL SERVER索引原理及填充因子

在SQL Server中,索引是按B树(平衡树)结构进行组织的,索引B树中的每一页称为一个索引节点,B树的顶端节点称为根节点,索引中的底层节点称为叶节点,根节点与叶节点之间的任何索引级别统称为中间级,当加入新的数据时,为了保证需要相同次数的读取来找到每个页,中间级页会进行拆分生成新的层,如图所示。

每个层的宽度增加为上一层能够记录的页数,当现有的树不能记录更多的页时,则会创建一个新的层,索引记录的大小受到编入索引列的大小影响,因此编入索引列越窄,则可以放到一个页的索引越多,从而索引需要的层数越少,每一层需要1次逻辑读,所以索引树层次越少越好。

填充因子是指每个叶子层页填充数据的百分比,提供填充因子选项是为了优化索引数据存储和性能,使用fill factor选项可以指定Microsoft SQL Server使用现有数据创建新索引时将每页填满到什么程度。fill factor选项是一个高级选项,如果使用sp_configure系统存储过程来更改该设置,则只有在show advanced options设置为1时才能更改fill factor,设置在重新启动服务器后生效。

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

填充因子可设置值为1到100之间的一个百分比,在大多数情况下,服务器范围的默认值为0,如果将填充因子设置为0,则表示填充满整个叶级页,但在实际测试过程中一般不会设置为填充满叶级页,因为至少需要留出再添加一个索引行的空间,使用此设置可有效使用叶级空间,但应保留一定的空间以便在不得不拆分页之前进行有限的扩展。

注意:填充因为设置为0和设置为100含意相同,都表示填充满整个叶级页。并且只有在创建或重新生成了索引后,才会应用填充因子,SQL Server Database Engine 并不会在页中动态保持指定的可用空间百分比,如果试图在数据页上保持额外的空间,将有背于使用填充因子的本意,因为随着数据的输入,数据库引擎将不得不在每个页上进行页拆分,以保持填充因子所指定的可用空间百分比。

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

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

索引里面的填充因子是什么意思

假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水。结果会怎样呢?水会溢出来。

  SQL Server 的情况也是如此。当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的行移动到新页,以便为新添加的行腾出空间。这就是通常所说的“页面分割”。页面分割可为新记录腾出空间,但却既费时又非常耗费资源,并且会产生碎片,从而可能对 I/O 操作产生负面影响。那么,如何避免此类情况呢?

  要防止此类情况的发生,必须主动确定填充因子值。创建或重新构建索引后,填充因子值会确定每个叶级页中用于填充数据的空间百分比,其余部分留作将来扩充之用。例如,将填充因子值配置为 60 就意味着每个叶级页的 40% 都是空的,以便在向基础表中添加数据时为索引扩展提供空间。

  默认填充因子值始终是 0,此值对大多数情况都适用。一般来讲,填充因子值为 0 意味着叶级别几乎已填满,但留出了一些空间,至少能再添加一个索引行。(请注意,填充因子为 0 和 100 是相似的。)

sql索引的填充因子多少最好,填充因子有什么用?

和索引重建最相关的是填充因子。当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量。填充因子设置为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都是不适合的。相反,你想要一个填充因子保留合适的自由空间,按照上面的讨论来做。

转载:

SQL SERVER索引原理及填充因子 - 知乎

索引里面的填充因子是什么意思-CSDN论坛

sql索引的填充因子多少最好,填充因子有什么用 - 巴蒂青葱 - 博客园

数据库中索引原理及填充因子相关推荐

  1. SQL SERVER索引原理及填充因子

    在SQL Server中,索引是按B树(平衡树)结构进行组织的,索引B树中的每一页称为一个索引节点,B树的顶端节点称为根节点,索引中的底层节点称为叶节点,根节点与叶节点之间的任何索引级别统称为中间级, ...

  2. 数据库中索引的填充因子

    在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中.在表中插入新的数据行或更改索引列中的值时,Microsoft® SQL Server™ 2000 可能必须重新组织表中的数据存 ...

  3. Sqlserver (优化Sqlserver数据库)页分裂 和填充因子

    页分裂 概念 不管是聚集索引 还是非聚集索引 我们在插入数据后 难免的会对数据增删改 那么我们涉及到一个问题 我们建立的索引会因为数据的变动 而变得混乱 比如 下面 聚集索引 如果我insert 了1 ...

  4. 数据库中索引(index)介绍

    本文主要介绍数据库中索引(index)的相关知识. 1 概述 1.1 What 数据库中的索引(index),是数据库管理系统(DBMS)中的一个排序的数据结构,用于协助快速查询.更新数据库表中的数据 ...

  5. 关于事物型数据库的索引原理

    1.二分查找算法 二分查找法的时间复杂度为Ο(log2n).大家如果有兴趣可以去验证一下这个结果,这里我就不做解释了. 我们具体来感受一下二分查找法有多强大,假设:集合里面有40亿个元素,排序方式为从 ...

  6. T-SQL查询高级—SQL Server索引中的碎片和填充因子

        写在前面:本篇文章需要你对索引和SQL中数据的存储方式有一定了解.标题中高级两个字仅仅是因为本篇文章需要我的T-SQL进阶系列文章的一些内容作为基础. 简介 在SQL Server中,存储数据 ...

  7. 阿里P8架构师谈:MySQL数据库的索引原理、与慢SQL优化的5大原则

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修 ...

  8. 面试题(一)- 谈谈你对数据库中索引的理解

    转载自<http://www.cnblogs.com/newpanderking/p/3781043.html> 1.首先要明白无名无实莫要用索引:因为数据中的记录很多,为了方便我们查找, ...

  9. sql server 创建唯一性非聚集索引语句_数据库专题—索引原理

    深入浅出数据库索引原理 参见:https://www.cnblogs.com/aspwebchh/p/6652855.html 1.为什么给表加上主键? 1.平时创建表的时候,都会给表加上主键.如果没 ...

  10. [数据库]MySQL索引原理和深度优化

    一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如 ...

最新文章

  1. 最短路径—Dijkstra算法和Floyd算法
  2. 让asp.net程序在修改web.config后不重启
  3. 语言分类,我接触和我想学习的
  4. django得到Model的全部字段名(field)
  5. stm32使用stlink烧录后jlik烧不进去_【MCU实战经验】+用stm32单片机做J-Link和ST-Link...
  6. python 近期用到的基础知识汇总(主要是numpy和pytorch的相关矩阵变化函数)(一)
  7. 新机发布会用鸿蒙吗,鸿蒙操作系统及华为全场景新品发布会即将到来,硬件生态发展有望迎来加速度...
  8. jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏
  9. 191030_Lda主题模型
  10. Python经典前端框架:Django,第一天【Django环境搭建】
  11. 如何免密操作 github、gitee 远程仓库
  12. 解决浏览器Adobe Flash Player不是最新版本问题
  13. Intel_80386寄存器
  14. 单词自动换行 css,CSS让英文单词的自动换行的方法介绍
  15. 打开我的电脑的快捷键
  16. 感觉丧的时候,读一读曾国藩
  17. XTU 1148 三角形
  18. java Long详解
  19. UE4 Atmospheric Fog组件问题记录(未解决)
  20. 单片机控制雷达测距模块HC-SR04测量距离(通过测试)

热门文章

  1. FATAL: License file expired:金仓数据库过期了...
  2. 记录下SpringBoot父子工程使用jib构建docker镜像的过程(跳过多余模块)
  3. 数字记忆好方法:数字编码
  4. c语言课程设计黄金矿工,unity简易版黄金矿工源码
  5. ac68无线网卡 linux驱动下载,华硕ac68驱动|华硕USB-AC68无线网卡驱动下载 V2.1.2.1 官方版 - 比克尔下载...
  6. Python中的逻辑运算符:‘and‘与‘or‘的用法
  7. CentOS7上使用history删除部分历史记录
  8. SSH 端口转发与 SOCKS 代理
  9. 操写一盒酥三字于盒上
  10. zoomit的使用 - 一个可以直接在演示的时候写字的软件