создан sql-запрос для ПЕРЕСТРОЙКИ / РЕОРГАНИЗАЦИИ индексов [closed]

Я создал SQL-запрос для ПЕРЕСТРОЙКИ / РЕОРГАНИЗАЦИИ индексов, но несколько из avg_fragmentation_in_percent остается на уровне 50% даже после их восстановления.

Буду очень признателен за любые предложения.

create table #tempQueries
(
    Query nvarchar(max),
)

CREATE TABLE #TempTable
(
    ROWID int identity(1,1) primary key,
    Name nvarchar(max),
)

insert into #TempTable
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

--select * from #TempTable
DECLARE @MAXID INT, @Counter INT

SET @COUNTER = 1
SELECT @MAXID = COUNT(*) FROM #TempTable

WHILE (@COUNTER <= @MAXID)
BEGIN
    --DO THE PROCESSING HERE  
    insert into #tempQueries
    SELECT 
    'ALTER INDEX ' + QUOTENAME(ind.name)  + ' ON ' +QUOTENAME(object_name(ind.object_id)) + 
        CASE    WHEN indexstats.avg_fragmentation_in_percent>30 THEN ' REBUILD ' 
            WHEN indexstats.avg_fragmentation_in_percent>=5 THEN ' REORGANIZE'
            ELSE NULL END as [SQLQuery]  -- if <5 not required, so no query needed
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats 
    INNER JOIN sys.indexes ind ON ind.object_id = indexstats.object_id 
        AND ind.index_id = indexstats.index_id 
    WHERE 
    --indexstats.avg_fragmentation_in_percent , e.g. >10, you can specify any number in percent 
    ind.Name is not null 
    and OBJECT_NAME(ind.OBJECT_ID) = (SELECT Name FROM #TempTable where ROWID = @Counter)
    ORDER BY indexstats.avg_fragmentation_in_percent DESC

    SET @COUNTER = @COUNTER + 1
END

delete from #tempQueries where Query is null
select * from #tempQueries

While (Select Count(*) From #tempQueries) > 0
Begin

    DECLARE @sql NVARCHAR(MAX);
    
    SET @sql = (select top 1 Query from #tempQueries)

    print @sql
    exec (@sql)

    Delete top (1) from #tempQueries

End

drop table #tempQueries
drop table #TempTable

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *