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

原文地址:https://www.cnblogs.com/jinzhenshui/p/1503228.html