当前位置: 首页 > news >正文

数据库索引重组与重建 - ufo233

"

不久前,遇到了一个问题。一个普通的数据库查询出现了超时,表的数据量不多,不应该会出现超时的情况。

时间发生在凌晨,组长说应该DBA在执行索引重组与重建脚本。哦?这是什么我完全不知道,上百度!

什么是索引

索引大家应该都了解,索引的作用就像书的目录,可以让数据库在查询时更快定位数据,而不是整表扫描。

  1. 提升查询效率
  2. 加速排序和分组
  3. 保证唯一性

什么是重组与重建索引呢?为什么要这么做?

索引不是一劳永逸的,它们会因为数据更新而“碎片化”:

  1. 插入:可能在页中间插入新值,导致数据页分裂。
  2. 删除:留下空洞。
  3. 更新:可能把数据移到别的页。

这些操作时间长了会让索引的存储结构(B+树)效率下降。

所以DBA通常会定期重建索引或重组索引,来减少碎片、提高查询性能。

为什么多在凌晨执行

白天系统访问量大,重建索引会锁表/占用大量I/O和CPU,影响业务。

凌晨访问量小,适合做维护任务(索引重建、统计信息更新、备份)。

SQL脚本

知道了什么是重组与重建索引,就要理解如何实现该操作呢?

找Chatgpt写一个脚本,解析一下看看。

--关闭行计数返回
SET NOCOUNT ON;DECLARE @SchemaName NVARCHAR(256);  --变量模式
DECLARE @TableName NVARCHAR(256);   --变量表名
DECLARE @IndexName NVARCHAR(256);   --变量索引名
DECLARE @AvgFrag DECIMAL(18,2);     --变量平均碎片率
DECLARE @sql NVARCHAR(MAX);         --变量要执行的SQL字符串--判断是否已存在,先删后建
IF OBJECT_ID('tempdb..#FragList') IS NOT NULLDROP TABLE #FragList;--创建临时表
CREATE TABLE #FragList
(ObjectId INT,IndexId INT,SchemaName NVARCHAR(256),TableName NVARCHAR(256),IndexName NVARCHAR(256),AvgFragmentation DECIMAL(18,2),PageCount BIGINT
);--统计索引碎片率信息
--sys.dm_db_index_physical_stats 获取当前数据库的索引物理统计
INSERT INTO #FragList
SELECTips.object_id,ips.index_id,s.name AS SchemaName,t.name AS TableName,i.name AS IndexName,ips.avg_fragmentation_in_percent,ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
JOIN sys.tables t ON t.object_id = ips.object_id
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE ips.database_id = DB_ID()AND i.type_desc <> 'HEAP'AND ips.page_count > 100; -- 可选:只处理较大的索引--游标批处理(等同于foreach),遍历#FragList
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT SchemaName, TableName, IndexName, AvgFragmentation
FROM #FragList;OPEN cur;
FETCH NEXT FROM cur INTO @SchemaName, @TableName, @IndexName, @AvgFrag;WHILE @@FETCH_STATUS = 0
BEGINSET @sql = NULL;IF @AvgFrag BETWEEN 5 AND 30SET @sql = N'ALTER INDEX [' + @IndexName + '] ON [' + @SchemaName + '].[' + @TableName + '] REORGANIZE;';ELSE IF @AvgFrag > 30SET @sql = N'ALTER INDEX [' + @IndexName + '] ON [' + @SchemaName + '].[' + @TableName + '] REBUILD WITH (ONLINE = ON);';IF @sql IS NOT NULLBEGINPRINT @sql;EXEC sp_executesql @sql;ENDFETCH NEXT FROM cur INTO @SchemaName, @TableName, @IndexName, @AvgFrag;
ENDCLOSE cur;
DEALLOCATE cur;
```"
http://www.gsyq.cn/news/58712.html

相关文章:

  • P1024 一三元次方程
  • 2025北京有多少家留学机构啊
  • 2025 年 11 月毛刷辊厂家权威推荐榜:工业/定做/清洁/纺织/钢制毛刷辊,耐磨高效与深度清洁的匠心之选
  • 2025 年 11 月合肥搬家公司权威推荐榜:专业团队与贴心服务,覆盖包河区、蜀山区等全市范围,高效省心搬家首选
  • Dexie.js 使用教程
  • 2025深圳美国留学机构排名前十
  • Web 常见名词解释
  • 2025年山东连栋玻璃温室公司权威推荐榜单:玻璃智能温室/玻璃连栋温室/玻璃温室设计源头公司精选
  • AI SDK:重新定义 AI 应用开发
  • 20232410 2025-2026-1 《网络与系统攻防技术》实验七实验报告
  • 主流开源JS地图框架选择
  • PHP 8.5 在性能、调试和运维方面的新特性
  • 完整教程:2025年接单经验和软件外包平台一览
  • 2025年最新国际货运代理公司实力推荐榜:全链路服务力到行业口碑深度评估
  • 完整教程:AI超级智能体项目中的多模型集成实践:挑战、架构与代码详解
  • 【URP】Unity[相机]渲染类型
  • 20251028在荣品RD-RK3588-MID开发板的Android13系统下解决关机的时候最近打开的应用不关的难题
  • 实验4 NoSQL和关系数据库的操作比较
  • 构建卓越开发者体验的核心原则
  • 上周热点回顾(11.17
  • 详细介绍:MySQL-8.0.43 免安装版保姆教程
  • 【GitHub每日速递 20251124】超神!verl助力大语言模型强化学习,多项特性引领行业新潮流
  • 【STM32工程开源】STM32单片机智能台灯系统
  • 2025年评价高的隧道炉工业级大功率厂家最新推荐权威榜
  • 2025年质量好的定制化鸡蛋液产品安全性权威榜
  • 2025年比较好的钢板预处理线优质厂家推荐榜单
  • 机器人领域Day One奖学金计划新增14位获得者
  • nats import export简单说明
  • 2025年知名的卡布广告灯箱厂家最新推荐排行榜
  • 2025年靠谱的压缩木浆棉用户口碑最好的厂家榜