收缩数据库后自动碎片整理

use xxDB
go

select * into #tempT1 from (SELECT name
FROM sys.dm_db_index_physical_stats (DB_ID(N'xxDB'), OBJECT_ID(N'HumanResources.Employee'), NULL, NULL, NULL) AS a
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id 
    and avg_fragmentation_in_percent>30 and name is not null) as t1
    
select * into #tempT2 from (SELECT 
    name=IDX.Name,
    tableName=O.Name
FROM sys.indexes IDX
    INNER JOIN sys.index_columns IDXC
        ON IDX.[object_id]=IDXC.[object_id]
            AND IDX.index_id=IDXC.index_id
    LEFT JOIN sys.key_constraints KC
        ON IDX.[object_id]=KC.[parent_object_id]
            AND IDX.index_id=KC.unique_index_id
    INNER JOIN sys.objects O
        ON O.[object_id]=IDX.[object_id]
    INNER JOIN sys.columns C
        ON O.[object_id]=C.[object_id]
            AND O.type='U'
            AND O.is_ms_shipped=0
            AND IDXC.Column_id=C.Column_id
    INNER JOIN  -- 对于一个列包含多个索引的情况,只显示第1个索引信息
    (
        SELECT [object_id], Column_id, index_id=MIN(index_id)
        FROM sys.index_columns
        GROUP BY [object_id], Column_id
    ) IDXCUQ
        ON IDXC.[object_id]=IDXCUQ.[object_id]
            AND IDXC.Column_id=IDXCUQ.Column_id) as t2
   
select * into #tempT3 from (select t1.name,tableName from #tempT1 t1 left join #tempT2 t2 on 
t1.name=t2.name group by t1.name,tableName) as t3

if exists(select 1 from #tempT3)
begin
    DECLARE @var_index varchar(100),
            @var_tableName varchar(100)
        
        declare INDEX_CURSOR cursor local for
            select name,tableName from #tempT3

        open INDEX_CURSOR
        fetch next from INDEX_CURSOR into @var_index,@var_tableName
        while @@FETCH_STATUS=0    
        begin    
            exec('ALTER INDEX ['+@var_index+'] ON [dbo].['+@var_tableName+'] REBUILD PARTITION = ALL WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON,ALLOW_PAGE_LOCKS  = ON, ONLINE = OFF, SORT_IN_TEMPDB = OFF )')
            fetch next from INDEX_CURSOR into @var_index,@var_tableName
         end 
         close INDEX_CURSOR
         deallocate  INDEX_CURSOR
end
drop table #tempT1
drop table #tempT2
drop table #tempT3
原文地址:https://www.cnblogs.com/rexfieBlogs/p/5219340.html