SQL SERVER索引原理及填充因子

在SQL Server中,索引是按B树(平衡树)结构进行组织的,索引B树中的每一页称为一个索引节点,B树的顶端节点称为根节点,索引中的底层节点称为叶节点,根节点与叶节点之间的任何索引级别统称为中间级,当加入新的数据时,为了保证需要相同次数的读取来找到每个页,中间级页会进行拆分生成新的层,如图所示。
SQL SERVER索引原理及填充因子_第1张图片
每个层的宽度增加为上一层能够记录的页数,当现有的树不能记录更多的页时,则会创建一个新的层,索引记录的大小受到编入索引列的大小影响,因此编入索引列越窄,则可以放到一个页的索引越多,从而索引需要的层数越少,每一层需要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)