首页 > 数据库 >SQL Server高级进阶之索引碎片维护

SQL Server高级进阶之索引碎片维护

时间:2024-08-31 14:53:19浏览次数:14  
标签:INDEX 进阶 OBJECT Server 索引 SQL 碎片 ID NAME

SQL Server高级进阶之索引碎片维护 

一、产生原因及影响

索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据,它的重要性体现在能够使数据库引擎快速返回查询结果。当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单位是页,页是不可再分的),就会导致索引碎片的产生。随着索引碎片的不断增多,查询响应时间就会变慢,性能也因此而下降。要解决这个问题,可以通过重新生成或重新组织索引来解决。

二、碎片分类

2.1、外部碎片

当索引页不在逻辑顺序上时就会产生外部碎片。索引创建时,索引键按照逻辑顺序放在一组索引页上。当新数据插入索引时,新的键可能放在存在的键之间。为了让新的键按照正确的顺序插入,可能会创建新的索引页来存储需要移动的那些存在的键。这些新的索引页通常物理上不会和那些被移动的键原来所在的页相邻。创建新页的过程会引起索引页偏离逻辑顺序。

2.2、内部碎片

当索引页没有用到最大量时就产生了内部碎片。虽然在一个有频繁数据插入的应用程序里这也许有帮助,然而设置一个fill factor(填充因子)会在索引页上留下空间,服务器内部碎片会导致索引尺寸增加,从而在返回需要的数据时要执行额外的读操作。这些额外的读操作会降低查询的性能。

三、维护方法

1、删除索引并重建。

2、使用DROP_EXISTING语句重建索引。

3、使用ALTER INDEX REBUILD重新生成索引。(推荐)

4、使用ALTER INDEX REORGANIZE重新组织索引。(推荐)

四、注意事项

碎片率

采用方法

>30%

ALTER INDEX REBUILD WITH(ONLINE = ON)

>5% 且 <=30%

ALTER INDEX REORGANIZE

重新生成索引可以联机执行,也可以脱机执行。

重新组织索引始终联机执行。这些值提供了一个大致指导原则,用于确定应在ALTER INDEX REORGANIZE和ALTER INDEX REBUILD之间进行切换的点。不过,实际值可能会随情况而变化,必须要通过试验来确定最适合您环境的阈值。

非常低的碎片级别(小于5%)不应通过这些命令来解决,因为删除如此少量的碎片所获得的收益始终远低于重新生成或重新组织索引的开销。

切记:所有索引碎片维护一定要在凌晨(非业务高峰期间)进行!!!

五、优化指导原则

5.1、如何知道是否发生了索引碎片?

在SQL Server数据库中,可以通过DBCC SHOWCONTIG WITH ALL_INDEXESDBCC SHOWCONTIG(表ID或者表名) WITH ALL_INDEXES来检查索引碎片情况。

--方法一
--目标数据库
USE DB_NAME
--创建变量指定要查看的表
DECLARE @TABLE_ID INT
SET @TABLE_ID=OBJECT_ID('TABLE_NAME')
--执行
DBCC SHOWCONTIG(@TABLE_ID) WITH ALL_INDEXES

--方法二
USE DB_NAME
DBCC SHOWCONTIG('TABLE_NAME') WITH ALL_INDEXES

5.2、索引碎片判断标准

通过对逻辑扫描碎片(过高)、平均页密度(满)(过低)的结果分析,判定是否需要进行索引处理,如下所示:

逻辑扫描碎片 ..................:97.83% 该百分比应该在0%到10%之间,高了则说明有外部碎片。

平均页密度(满) ..................:62.42% 该百分比应该尽可能靠近100%,低了则说明有外部碎片。

SQL Server高级进阶之索引碎片维护_数据库

六、优化实践

6.1、手动方式

第一步:查询数据库所有表的索引信息。

SELECT OBJECT_NAME(B.OBJECT_ID) 表名,B.NAME 索引名称,A.INDEX_TYPE_DESC 索引类型,
    ROUND(A.AVG_FRAGMENTATION_IN_PERCENT,2) 碎片率
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) A 
    INNER JOIN sys.indexes B ON A.OBJECT_ID=B.OBJECT_ID AND A.INDEX_ID=B.INDEX_ID
WHERE 1=1
    AND A.AVG_FRAGMENTATION_IN_PERCENT>30
    --AND A.AVG_FRAGMENTATION_IN_PERCENT>5 AND A.AVG_FRAGMENTATION_IN_PERCENT<=30
ORDER BY OBJECT_NAME(B.OBJECT_ID),A.AVG_FRAGMENTATION_IN_PERCENT DESC

注:通过碎片率,依四、注意事项处理方式,也可以逐个对表的索引进行对应的重新生成或重新组织处理。

SQL Server高级进阶之索引碎片维护_SQL_02

第二步:生成数据库所有表的索引处理的SQL语句。

SQL Server高级进阶之索引碎片维护_数据库_03

SELECT OBJECT_SCHEMA_NAME(B.OBJECT_ID) 架构,OBJECT_NAME(B.OBJECT_ID) 表名,B.NAME 索引名,ROUND(A.AVG_FRAGMENTATION_IN_PERCENT,2) 碎片率,
    CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN N'重新生成索引' ELSE N'重新组织索引' END 处理方式,
    'ALTER INDEX '+QUOTENAME(B.NAME)+' ON '+QUOTENAME(OBJECT_SCHEMA_NAME(B.OBJECT_ID))+'.'+QUOTENAME(OBJECT_NAME(B.OBJECT_ID))+' '
        +CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN 'REBUILD' ELSE 'REORGANIZE' END 生成SQL语句
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,NULL) A INNER JOIN sys.indexes B ON A.OBJECT_ID=B.OBJECT_ID AND A.INDEX_ID=B.INDEX_ID
WHERE A.AVG_FRAGMENTATION_IN_PERCENT>5 AND B.INDEX_ID>0
    --AND OBJECT_NAME(B.OBJECT_ID) IN ('INVMB')    --指定表
ORDER BY CASE WHEN A.AVG_FRAGMENTATION_IN_PERCENT>30 THEN N'重新生成索引' ELSE N'重新组织索引' END,OBJECT_NAME(B.OBJECT_ID),B.INDEX_ID

注:将【生成SQL语句】拷贝出来执行即可。

6.2、自动方式

第一步:在服务中启动SQL Server 代理。

SQL Server高级进阶之索引碎片维护_数据库_04

第二步:点击"管理"->右键"维护计划"->"新建维护计划"。

SQL Server高级进阶之索引碎片维护_数据_05

第三步:起个名字,点击"确定"。

SQL Server高级进阶之索引碎片维护_数据_06

第四步:点击左侧"工具箱",将"重新生成索引"及"重新组织索引"拖至右边区域。

SQL Server高级进阶之索引碎片维护_SQL_07

第五步:分别对着"重新生成索引"及"重新组织索引"点击右键->"编辑"->在"数据库"项勾选要处理的数据库->点击"确定"。

SQL Server高级进阶之索引碎片维护_数据库_08

第六步:点击"新建作业计划"按钮->设置频率及执行时间->点击"确定"。

SQL Server高级进阶之索引碎片维护_SQL_09

第七步:点击"保存选定项"即可。

SQL Server高级进阶之索引碎片维护_SQL_10

七、更新统计信息

作用:UPDATE STATISTICS更新统计信息来提高查询效率。建议放在索引碎片计划任务执行完成之后进行。

查看:查看某个表的统计信息,可以在SSMS下面查看。

SQL Server高级进阶之索引碎片维护_数据库_11

执行:

--方法一:UPDATE STATISTICS 表名
UPDATE STATISTICS INVMB

--方法二:执行存储过程SP_UPDATESTATS(更新所有表)
EXEC sp_updatestats

 

后记:建议不要过于频繁地执行重新生成、重新组织索引以及更新统计信息。另外需要补充的是,非常低数据量与非常低碎片级别一样,通过这些命令来解决,效果甚微。


标签:INDEX,进阶,OBJECT,Server,索引,SQL,碎片,ID,NAME
From: https://blog.51cto.com/ruguworking/11883014

相关文章

  • 使用python基于fastapi发布接口(二)-连接mysql数据库查询数据
    上一章在这里操作MySQL数据库使用mysql-connector-python库安装mysql-connector-pythonpipinstallmysql-connector-python代码编写在原来代码基础上添加数据库连接配置fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI(......
  • Centos 7 制作MySQL 5.7 RPM包
    系统:Centos7.2 1、安装依赖包yuminstallmakegccrpm-buildrpmdevtools-yyuminstallmakecmakegccgcc-c++bisonlibaioncurses-develperlperl-DBIperl-DBD-MySQLperl-Time-HiResreadline-develnumactlzlib-develcurldevel 2、rpm工具相关路径mkdir......
  • MySQL字符集详解
    一、内容概述在MySQL的使用过程中,了解字符集、字符序的概念,以及不同设置对数据存储、比较的影响非常重要。不少同学在日常工作中遇到的“乱码”问题,很有可能就是因为对字符集与字符序的理解不到位、设置错误造成的。本文由浅入深,分别介绍了如下内容:字符集、字符序的基本概念......
  • django 内置server 外网不能访问, 报连接超时
    django内置server外网不能访问,报连接超时pythonmanage.pyrunserver不能外网访问 ===============================1确保开启了服务pythonmanage.py runserver0.0.0.0:80 ===============================2 确保开启了防火墙(1)查看防火墙端口#查看开放的......
  • MySQL怎么全局把一张表的数据回滚
    在数据库管理中,回滚操作是至关重要的功能之一。当我们执行了错误的操作,或者需要将数据恢复到某个之前的状态时,回滚操作可以帮助我们避免数据丢失和错误传播。本文将详细探讨在MySQL中如何全局回滚一张表的数据,包括使用事务、备份与恢复、触发器等多种方法,并提供相应的代码示例和详......
  • C语言(vs2022、Vc++6.0、DevC++)连接MySql
    本文c++(OraOla编写)与Java(Wideskyzz编写)由于csdn的排版太垃圾了,所以可以直接看资料上传资料也麻烦,所以可直接访问我的giteeC语言连接MySql:C语言(vs2022、Vc++6.0、DevC++)连接MySqlhttps://gitee.com/gyhjim/c-language-connection---my-sql一定要自己实践当你发现与我的......
  • Datawhale X 李宏毅苹果书 AI夏令营 第五期 深度学习(进阶班)Task02 笔记分享
    文章目录Task2-1:《深度学习详解》-3.3&4&5自适应学习率(9页+38分钟)Part01:视频笔记训练技巧:自适应学习率(Adaptivelearningrate):学习率应该为每一个参数特质化:RootMeanSquare(均方根):......
  • 基于live555开发的多线程RTSPServer轻量级流媒体服务器EasyRTSPServer开源代码及其调
    EasyRTSPServer参考live555testProg中的testOnDemandRTSPServer示例程序,将一个live555testOnDemandRTSPServer封装在一个类中,例如,我们称为ClassEasyRTSPServer,在EasyRTSPServer_Create接口调用时,我们新建一个EasyRTSPServer对象,再通过调用EasyRTSPServer_Startup接口,将EasyRTSP......
  • 基于ssm+vue基于+MYSQL技术的蔬菜病虫害防治网站设计与实现【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代农业的快速发展,蔬菜作为人们日常饮食的重要组成部分,其产量与质量直接关系到食品安全与人民健康。然而,蔬菜病虫害的频发成为制约蔬菜产业可持......
  • Windows Server 2016 OVF, updated Aug 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedAug2024(sysin)-VMware虚拟机模板2024年8月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/,查看最新版。原创作品,转载请保留出处。现在都是自动sysprep的......