0

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)

最適化されたインデックスに戻り、最初のコードを再利用して結果を表示します。それの何が問題なのですか?どうすればインデックスを修正できますか?

4

2 に答える 2

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
于 2015-12-26T13:16:43.647 に答える
0

以下は、生成されたコマンドを直接実行し、さらに処理されたインデックスとその断片化ステータスに関する適切な情報メッセージを出力する、StackUser のスクリプトの修正版です。

DECLARE @sql VARCHAR(MAX) =
(
    SELECT CASE
        WHEN indexstats.avg_fragmentation_in_percent > 5
         AND indexstats.avg_fragmentation_in_percent <= 30
        THEN
            'PRINT ''Reorganizing index [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] with ' +
            CAST(indexstats.avg_fragmentation_in_percent AS VARCHAR(10)) + ' % fragmentation ...''; ' +
            'ALTER INDEX [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] REORGANIZE ; '
        ELSE
            'PRINT ''Rebuilding index [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] with ' +
            CAST(indexstats.avg_fragmentation_in_percent AS VARCHAR(10)) + ' % fragmentation ...''; ' +
            'ALTER INDEX [' + ind.name + '] ON [' + OBJECT_NAME(ind.object_id) + '] REBUILD; '
        END
    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
    FOR XML PATH('')
);
EXEC (@sql)

また、MSDN にも同様のスクリプトがあります: https://docs.microsoft.com/de-de/sql/t-sql/database-console-commands/dbcc-indexdefrag-transact-sql?view=sql-server- ver15

于 2020-07-17T00:19:33.047 に答える