Sqlserver:在sql2005查看索引的碎片统计情况,并给出处理意见的自动化批处理脚本
--查询基本的信息
if object_id('tempdb..#a') is not null
drop table #a
select db_name(a.database_id) as database_name,object_name(a.object_id) as table_name,b.name as index_name,a.partition_number
,a.index_type_desc,a.index_depth,a.index_level
,alloc_unit_type_desc
,avg_fragmentation_in_percent,avg_fragment_size_in_pages,avg_page_space_used_in_percent
,page_count,record_count
,min_record_size_in_bytes,max_record_size_in_bytes,avg_record_size_in_bytes
,forwarded_record_count
into #a
from
sys.dm_db_index_physical_stats(db_id('usercenter'),null,null,null,'detailed')
a inner join sys.indexes b on a.object_id = b.object_id and a.index_id
= b.index_id
order by a.database_id,object_name(a.object_id),b.name,a.partition_number
--统计索引碎片情况
if object_id('tempdb..#b') is not null
drop table #b
select
database_name,table_name,index_name,index_type_desc,index_depth,index_level,count(partition_number)
as count_partition_number,max(avg_fragmentation_in_percent) as
max_avg_fragmentation_in_percent
into #b
from #a
where page_count > 0
group by database_name,table_name,index_name,index_type_desc,index_depth,index_level
order by database_name,table_name,index_name,index_type_desc,index_depth,index_level
--统计索引碎片情况-最大max_avg_fragmentation_in_percent
if object_id('tempdb..#c') is not null
drop table #c
select distinct table_name,index_name,max(max_avg_fragmentation_in_percent) as max_avg_fragmentation_in_percent
into #c
from #b
group by table_name,index_name
order by table_name,index_name
--给出索引优化建议
/*
功能 ALTER INDEX REORGANIZE ALTER INDEX REBUILD CREATE INDEX WITH DROP_EXISTING
可以更改索引定义。 否 否 是
可以设置或修改索引选项。 否 是 是
可以在单个事务中重新生成多个索引。 是 是 否
可以联机重新生成大部分索引类型,而不会阻止运行查询或更新。 总是 是 是
已分区索引可以重新分区。 否 否 是
可以将索引移动到另一个文件组中。 否 否 是
需要额外的临时磁盘空间。 是 是 是
重新生成聚集索引的操作将重新生成相关的非聚集索引。 否(除非指定关键字 ALL) 否(除非指定关键字 ALL) 否(除非更改索引定义)
可以重新生成强制 PRIMARY KEY 和 UNIQUE 约束的索引,而不用删除并重新创建这些约束。 是 是 是
可以重新生成单个索引分区。 是 是 否
具有DBCC等效语句 是 是(但总是脱机操作) 否
*/
select
case
when max_avg_fragmentation_in_percent <30 then 'ALTER INDEX ' + index_name + ' ON ' + table_name + ' REORGANIZE;'
else 'ALTER INDEX ' + index_name + ' ON ' + table_name + ' REBUILD WITH (ONLINE = ON);'
end
from #c
where index_name is not null and max_avg_fragmentation_in_percent > 10
order by table_name,index_name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)