Правильная последовательность действий выглядит так:
1.Определение степени фрагментированности индекса
2.Если индекс мало фрагментирован, тогда запускаем процедуру реорганизации индекса и пересчета статистики.
3.Если индекс фрагментирован, тогда запускам процедуру перестроения индекса. Перестроения индекса приведет к обновлению статистики, поэтому пересчитывать статистику после полного перестроения индекса не нужно.
DECLARE @SQL NVARCHAR(MAX)
DECLARE @MIN_IND_SIZE integer = 128
DECLARE @MIN_FRAGMENTATION_LEVEL integer = 10
DECLARE @CRITICAL_FRAGMENTATION_LEVEL integer = 30
DECLARE currentIndex CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
SELECT ‘ALTER INDEX [‘ + ind.name + N’] ON [‘ +
SCHEMA_NAME(obj.[schema_id]) + ‘].[‘ + obj.name + ‘] ‘ +
CASE WHEN stat.avg_fragmentation_in_percent > @CRITICAL_FRAGMENTATION_LEVEL
THEN ‘REBUILD WITH (SORT_IN_TEMPDB = ON, ONLINE = ON)’
ELSE ‘REORGANIZE’
END + ‘;’
FROM (
SELECT stat.[object_id], stat.index_id,
avg_fragmentation_in_percent = MAX(stat.avg_fragmentation_in_percent)
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, ‘DETAILED’) stat
WHERE stat.page_count > @MIN_IND_SIZE AND stat.index_id > 0
AND stat.avg_fragmentation_in_percent > @MIN_FRAGMENTATION_LEVEL
GROUP BY stat.[object_id], stat.index_id
) stat
JOIN sys.indexes ind WITH(NOLOCK) ON stat.[object_id] = ind.[object_id]
AND stat.index_id = ind.index_id
JOIN sys.objects obj WITH(NOLOCK) ON obj.[object_id] = stat.[object_id]
OPEN currentIndex
FETCH NEXT FROM currentIndex INTO @SQL
WHILE @@FETCH_STATUS = 0 BEGIN
print @sql
EXEC sys.sp_executesql @SQL
FETCH NEXT FROM cur INTO @SQL
END
CLOSE currentIndex
DEALLOCATE currentIndex
Мы так же готовы предоставить сервер в аренду для работы с базами MS SQL . Для работы с пользователями мы используем систему заявок.