Я создал 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
![создан sql-запрос для ПЕРЕСТРОЙКИ / РЕОРГАНИЗАЦИИ индексов [closed] TheFAQ.ru](https://thefaq.ru/wp-content/uploads/2023/01/logo-250.png)