2015-12-26 3 views
0

Я хочу дефрагментировать таблицы в SQL Server, я использовал этот код, чтобы узнать, фрагментированные индексы:Как исправить фрагментированные индексы в sql-сервере?

sELECT dbschemas.[name] as 'Schema', 
dbtables.[name] as 'Table', 
dbindexes.[name] as 'Index', 
indexstats.avg_fragmentation_in_percent as Fragmentation, 
indexstats.page_count 
    FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) 
    AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] 
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] 
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] 
AND indexstats.index_id = dbindexes.index_id 
WHERE indexstats.database_id = DB_ID() ORDER BY indexstats.avg_fragmentation_in_percent 
desc 

после того, как у меня есть результаты, которые я использовал

DBCC INDEXDEFRAG([MAIL SYSTEMS],EmpMail) 

к дефрагментированному индексу, а затем повторно использовать первый код, чтобы показать результаты, которые он показывает до дефрагментации, и ни одна страница не была удалена? Что случилось с этим и как я могу исправить индексы?

+0

[ 'REBUILD/REORGANIZE'] (https://technet.microsoft.com/en-us/library/ms188388%28v=sql.105%29.aspx)? – lad2025

+0

'DBCC INDEXFRAG' устарел. Лучше использовать 'ALTER INDEX' с' REBUILD' или 'REORGANIZE' –

ответ

0

Попробуйте этот код. Это дефрагментирует все ваши индексы на основе уровня фрагментации.

SELECT CASE 
     WHEN indexstats.avg_fragmentation_in_percent > 5 
       AND indexstats.avg_fragmentation_in_percent <= 30 THEN 'ALTER INDEX [' + ind.NAME + '] ON [' 
                    + Object_name(ind.OBJECT_ID) 
                    + '] REORGANIZE ; ' 
     ELSE 'ALTER INDEX [' + ind.NAME + '] ON [' 
       + Object_name(ind.OBJECT_ID) + '] REBUILD; ' 
     END, 
     'GO' 
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 > 10 
     AND ind.NAME IS NOT NULL 
ORDER BY indexstats.avg_fragmentation_in_percent DESC 
Смежные вопросы