SQL Server索引碎片的基本知识(附Demo)

news2024/11/16 20:13:05

目录

  • 前言
  • 1. 基本知识
  • 2. 检索碎片
    • 2.1 dm_db_index_physical_stats
    • 2.2 DBCC SHOWCONTIG
  • 3. 修复和优化

前言

索引碎片太高本身会阻碍查询的效率,这个问题要重视

1. 基本知识

索引中的数据页不再连续,导致存储和检索数据时的效率降低

碎片通常发生在以下两种情况:

  • 内部碎片:索引页中有许多空闲空间
    通常是因为索引中删除了很多数据行,导致原来的数据页留下空白
  • 外部碎片:索引页之间的顺序不再连续
    通常是因为数据的插入、更新和删除操作导致索引页被重新分配

索引碎片的类型

  • 逻辑碎片:索引逻辑结构中存在问题,例如非连续的页链
    这种碎片会影响到查询的效率
  • 物理碎片:实际存储介质上的数据页的物理分布不连续
    这种碎片会影响磁盘的读取性能

影响查询效率的原因

  1. 性能下降
    -读取性能:碎片会导致数据库引擎在扫描和访问索引时需要更多的磁盘 I/O 操作,从而增加了查询时间。
    缓存效率:索引碎片会减少数据页的缓存命中率,使得更多的数据页需要从磁盘读取,影响整体性能

  2. 增加的维护开销
    -索引维护:碎片化的索引会增加数据库的维护成本,包括重建和重组索引所需的时间和资源
    -存储空间:碎片化的索引可能会占用更多的磁盘空间,影响存储成本

2. 检索碎片

直奔主题,通过SQL Server索引碎片检索相关数据

2.1 dm_db_index_physical_stats

SQL Server 提供了 sys.dm_db_index_physical_stats 视图来帮助检测索引碎片

SELECT 
    OBJECT_NAME(ips.object_id) AS TableName,
    i.name AS IndexName,
    ips.index_id,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count
FROM 
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS ips
JOIN 
    sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE 
    ips.avg_fragmentation_in_percent > 10  -- 阈值可以根据实际情况调整
ORDER BY 
    ips.avg_fragmentation_in_percent DESC;

截图如下:

在这里插入图片描述

2.2 DBCC SHOWCONTIG

DBCC SHOWCONTIG 是 SQL Server 中用于分析表和索引碎片情况的命令

虽然在 SQL Server 2016 及以后的版本中,DBCC SHOWCONTIG 已被弃用并被 sys.dm_db_index_physical_stats 替代,但在早期版本中,它依然是一个有用的工具

目前还可以使用的话,对于某个页面的索引碎片比较严重的,可通过如下方式进行查看:

DBCC ShowContig(TableName)

截图如下:

在这里插入图片描述

相关的参数说明如下:

  • 扫描页数:表中总共扫描的页数
    表示 DBCC SHOWCONTIG 命令检查的页的数量

  • 扫描区数:表中扫描的区(或称为分区)的数量
    区是磁盘上的数据存储单位

  • 区切换次数:在扫描过程中切换到不同区的次数
    频繁的区切换可能影响性能,因为可能导致磁盘 I/O 操作的增加

  • 每个区的平均页数:每个区中包含的平均页数。这个指标有助于了解区的分布情况。

  • 扫描密度 [最佳计数:实际计数]:扫描密度是实际扫描的页数与理想情况下应该扫描的页数之间的比例
    较低的密度表明存在较高的碎片

  • 逻辑扫描碎片:表示逻辑上索引的碎片比例
    逻辑碎片表示数据页的逻辑顺序不再连续,通常用百分比表示
    高逻辑碎片通常意味着数据页的顺序被破坏

  • 区扫描碎片:表示区中页的碎片比例
    区扫描碎片较高意味着在扫描过程中发现了许多不连续的页,通常也用百分比表示

  • 每页的平均可用字节数:每页上未使用的字节数

  • 它表示每页的空闲空间,有助于理解页的利用率

  • 平均页密度(满):每页的实际填充密度。页密度越高,表明页的空间利用率越高

3. 修复和优化

一般只能重建索引

一、对于严重碎片化的索引,通常使用重建操作:

ALTER INDEX IX_IndexName ON [SchemaName].[TableName] REBUILD;
  • 作用:完全重建索引,重新组织数据页,使其连续
  • 适用情况:当碎片度高于 30% 时

二、对于轻微碎片化的索引,使用重组操作:

ALTER INDEX IX_IndexName ON [SchemaName].[TableName] REORGANIZE;
  • 作用:重新组织索引数据页,减少碎片,保持索引结构的稳定性
  • 适用情况:当碎片度在 10% 到 30% 之间时

三、定期维护:

  • 计划维护任务:定期运行重建和重组操作,以维护索引性能
  • 监控性能:使用性能监控工具和视图(如 sys.dm_db_index_physical_stats)来监控索引状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机启动电脑蓝屏问题解决方案

1.查看CPU虚拟化是否开启,没有开启的可以按照教程开启 打开任务管理器,查看是否开启CUP虚拟化 如果没有开启,可以查看下面的链接,进入BIOS开启 win10如何开启虚拟化支持_win10开启cpu虚拟化的方法-系统城 2,控制面板…

C#中的同步编程和异步编程

1. 简单描述一下同步编程和异步编程 同步编程:按照代码的顺序一行一行执行,如果某个操作需要等待(比如读取文件、网络请求、数据库操作等),那么当前的线程就会停下来,一直到这个操作完成了之后&#xff0c…

无坚不摧的Python重试机制:探索Tenacity库

无坚不摧的Python重试机制:探索Tenacity 库 背景:为何选择Tenacity? 在软件开发中,我们经常面临需要重试操作的场景,比如网络请求、数据库操作等。这些操作可能会因为各种原因暂时失败,但稍后可能会成功…

更换CentOS Stream 8镜像源

CentOS Stream 8替换阿里云镜像源 确认CentOS版本 hostnamectl备份当前配置 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup创建临时文件下载目录 mkdir -p /tmp/aliyun-repos cd /tmp/aliyun-repos下载 .repo 文件列表并解析链接 wget -r -np -nd -A ".repo&…

ssm框架整合,异常处理器和拦截器(纯注解开发)

目录 ssm框架整合 第一步:指定打包方式和导入所需要的依赖 打包方法:war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步:导入tomcat插件 第三步:编写配置类 SpringCon…

C++知识点总结:2.类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码(Name Mangling)6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序(通过初始化列表)9. 初始化 const 成员变量10. 析构函数11…

安装 moleculeSTM 踩坑日记

“学习 LLM ,在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么,在 AI for science 领域,哪些 LLM 模型值得一试呢? 笔者认为: LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

成为git砖家(6): git restore 命令

文章目录 1. git restore 命令是新命令2. git官方对于restore命令的说明3. 总结 1. git restore 命令是新命令 在2019年8月发布的 Git 2.23 版本中,git checkout 命令的功能被拆解到两个新的命令中: git switch: 负责分支相关的操作git restore: 负责文…

微信小程序教程001:小程序简介

文章目录 学习目标小程序简介1、小程序和普通网页开发的区别2、注册小程序账号3、获取小程序的AppID4、安装开发者工具4.1 了解开发者工具4.2 下载开发工具 5、设置开发者工具外观 学习目标 如何创建小程序项目小程序项目的基本组成结构小程序页面由几部分组成小程序常见的组件…

Vscode——如何快速搜索项目工程中的某个文件的位置

第一步:按 shift ctrl p 第二步:然后把 > 删除 第三步:输入文件名称即可

Linux环境docker部署Firefox结合内网穿透远程使用浏览器测试

文章目录 前言1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox 前言 本次实践部署环境为本地Linux环境,使用Docker部署Firefox浏览器后,并结合cpolar内网穿…

永磁同步电机双矢量模型预测(MPC)电流控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 在电流环中采用双矢量模型预测电流控制方法,该方法在每一个采样周期中进行两次电压矢量选择,可以在进行第二次电压矢 量选择时采用非零电压矢量,电压矢量的选择范…

RAG优化技巧 | 7大挑战与解決方式 | 提高你的LLM: 下篇

RAG优化技巧 | 7大挑战与解决方式 | 提高你的LLM:下篇 在当今快速发展的人工智能领域,大型语言模型(LLM)已经成为无处不在的技术,它们不仅改变了我们与机器交流的方式,还在各行各业中发挥着革命性的影响。…

算法笔记--哈希表

创建和使用Python字典(哈希表) 在Python中,哈希表通常是通过字典(dict)来实现的。 字典是一种可变容器模型,可以存储任意类型的对象,如字符串、数字、元组等其他容器模型。 字典的每个键值对…

GAT知识总结

《GRAPH ATTENTION NETWORKS》 解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题,GAT借鉴了Transformer的idea,引入masked self-attention机制, 在计算图中的每个节点的表示的时候,会根据邻居节点特征的不同来…

【文生视频系列】MoneyPrinterTurbo项目初探

1. 背景介绍 一直有在关注文生视频方面的进展信息。比较知名的可能还是sora这类文生视频模型。但今天要讲的是另外的文生视频项目,也是偶然间在git上看到的,项目名称叫MoneyPrinterTurbo,是基于MoneyPrinter项目增加了中文支持&#xff0c…

R语言统计分析——自编函数

参考资料&#xff1a;R语言统计分析【第2版】 一个函数的结构大致如此&#xff1a; myfunction<-function(arg1,arg2,...){ statements return(object) } 函数中的对象只在函数内部使用。返回对象的数据类型是任意的。 假设我们要编写一个函数&#xff0c;用来计算数据对象…

【C++BFS算法 二分查找】2812. 找出最安全路径

本文涉及知识点 CBFS算法 C二分查找 LeetCode2812. 找出最安全路径 给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid &#xff0c;其中 (r, c) 表示&#xff1a; 如果 grid[r][c] 1 &#xff0c;则表示一个存在小偷的单元格 如果 grid[r][c] 0 &#xff0c;则表示一…

【C语言篇】C语言常见概念

文章目录 C语言常见概念C语言是什么C语⾔的历史和辉煌编译器选择编译和连接编译器对比 第一段C语言代码main函数库函数关键字介绍字符和ASCII编码转义字符语句空语句表达式语句函数调⽤语句复合语句控制语句 注释两种形式/* */的形式//形式注释会被替换注释会被替换 C语言常见概…