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

简介: 原文: 第十章——维护索引(2)——填充因子 前言:       在第九章中,已经介绍了如何使用索引,当一个索引创建时,以B-Tree格式存放数据,拥有根节点、中间节点、叶子节点。
原文: 第十章——维护索引(2)——填充因子

前言:

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

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

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

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

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

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

 

准备工作:

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

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

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


 

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

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


 

 

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

 

分析:

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

--把填充因子修改成%
ALTER INDEX [idx_refno] ON [dbo].[ordDemo]
REBUILD WITH (FILLFACTOR=80)
GO
--修改服务器的默认填充因子的值:
sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
--改成%
sp_configure 'fill factor',90
GO
RECONFIGURE
GO


 

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

 

扩展信息:

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

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

目录
相关文章
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
小程序 Java 关系型数据库
网球爱好者小程序的设计与实现
网球爱好者小程序的设计与实现
605 0
|
机器学习/深度学习 PyTorch API
PyTorch 深度学习实用指南:6~8
PyTorch 深度学习实用指南:6~8
455 0
|
传感器 存储 边缘计算
3000字11张图硬核科普:什么是边缘计算?与云计算有什么联系和区别?
边缘计算是 现代IT 网络架构的一种创新的、革命性的方法,计算处理去中心化并在靠近数据源的网络“边缘”执行它,数据不再发送到云或任何单个数据处理中心,而是被发送到靠近传感器或生成此数据的设备数据源,极大的提高了数据的处理速度,节省了大量的带宽,还提高了数据的安全性。
2059 0
3000字11张图硬核科普:什么是边缘计算?与云计算有什么联系和区别?
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
2158 1
|
8月前
|
供应链 搜索推荐 API
从0到1掌握1688API:图片搜索获取技巧与避坑指南
1688图片搜索API基于图像识别技术,支持上传JPG/PNG格式图片(Base64或URL),实现同款或相似商品搜索。适用于电商选品、供应链管理等场景,提供价格、销量等多维度筛选,返回商品ID、标题、价格、销量及供应商信息。
|
缓存 前端开发 JavaScript
前端性能优化:打造流畅的用户体验
前端性能优化:打造流畅的用户体验
|
10月前
|
存储 机器学习/深度学习 缓存
阿里云九代云服务器怎么样?计算型c9i、通用型g9i、内存型r9i实例介绍
阿里云第9代云服务器主要实例规格包括计算型c9i、通用型g9i、内存型r9i,本文将为大家介绍阿里云九代云服务器中的计算型c9i、通用型g9i、内存型r9i实例的主要性能特点,并分享最新的活动价格信息,以供参考。
885 1
|
存储 搜索推荐 安全
《对话记忆的进化史:智能体大模型如何实现跨轮次的深度交互》
这段内容介绍了智能体大模型在多轮对话中构建长期记忆的技术与应用。通过数据库、向量数据库和知识图谱等工具,智能体能整合用户信息,提供个性化服务。RAG技术连接当前需求与长期记忆,实现精准信息检索与生成。分层记忆架构模仿人类记忆机制,包括工作记忆、短期记忆和长期记忆,确保对话连贯性与准确性。时间感知与情节化管理优化回忆过程,动态参数更新与个性化微调使模型更“聪明”。此外,MemoryBank、记忆变量等设计保障多用户场景下的信息安全。未来,这些技术将在跨语言、情感交互等领域实现更深层次的应用,让智能体成为用户的贴心伙伴。
686 29
|
人工智能 编解码 自然语言处理
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐
Zonos 是 ZyphraAI 推出的开源多语言 TTS 模型,支持语音克隆、情感控制和多种语言,适用于有声读物、虚拟助手等场景。
1230 18
Zonos:油管博主集体转粉!开源TTS神器Zonos爆火:克隆你的声音说5国语言,还能调喜怒哀乐