/************************************************************************** ** ファイル : ** 説明 : DBCC SHOWCONTIG と DBCC INDEXDEFRAG を使用して、 ** データベース内のインデックスの断片化を解消する ** 「@maxfrag」変数値で設定した断片化率のインデックスのみを最適化する ** **(修正履歴)************************************************************* ** 日付: 作業者: 作業内容: ** ---------- ------------- --------------------------------------------- ** 2006/XX/XX Hashimoto 作成 ** **(最終更新)************************************************************* ** 2006/10/25 ** ***************************************************************************/ SET NOCOUNT ON -- 変数定義 DECLARE @tablename VARCHAR (128) DECLARE @execstr VARCHAR (255) DECLARE @objectid INT DECLARE @indexid INT DECLARE @frag DECIMAL DECLARE @maxfrag DECIMAL DECLARE @START DATETIME DECLARE @FINISH DATETIME -- 論理スキャンフラグメンテーション閾値 -- ここで設定した値以上の「論理スキャンフラグメンテーション」値のインデックスのみを最適化する SELECT @maxfrag = 20.0 SET @START = GETDATE() PRINT '【開始】'+CAST(@START AS VARCHAR) PRINT CAST(@maxfrag AS VARCHAR)+'% 以上の論理スキャンフラグメンテーションのインデックスを最適化します。' PRINT '' -- ワークテーブル生成 CREATE TABLE #fraglist ( ObjectName CHAR (255), ObjectId INT, IndexName CHAR (255), IndexId INT, Lvl INT, CountPages INT, CountRows INT, MinRecSize INT, MaxRecSize INT, AvgRecSize INT, ForRecCount INT, Extents INT, ExtentSwitches INT, AvgFreeBytes INT, AvgPageDensity INT, ScanDensity DECIMAL, BestCount INT, ActualCount INT, LogicalFrag DECIMAL, ExtentFrag DECIMAL ) -- カーソル定義 DECLARE tables CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' -- カーソルオープン OPEN tables -- FETCH NEXT FROM tables INTO @tablename WHILE @@FETCH_STATUS = 0 BEGIN -- SHOWCONTIGコマンドからインデックス情報をワークテーブルに取り出す INSERT INTO #fraglist EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS') FETCH NEXT FROM tables INTO @tablename END -- カーソルクローズ CLOSE tables DEALLOCATE tables -- デフラグすべきリストの生成 DECLARE indexes CURSOR FOR SELECT ObjectName, ObjectId, IndexId, LogicalFrag FROM #fraglist WHERE LogicalFrag >= @maxfrag AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0 -- カーソルオープン OPEN indexes -- FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) +','+ RTRIM(@indexid) + ') - fragmentation currently '+ RTRIM(CONVERT(varchar(15),@frag)) + '%' SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',' + RTRIM(@indexid) + ')' print @execstr print '' EXEC (@execstr) -- デフラグ実行 FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag END -- カーソルクローズ CLOSE indexes DEALLOCATE indexes -- ワークテーブル削除 DROP TABLE #fraglist SET @FINISH = GETDATE() PRINT '【終了】'+CAST(@FINISH AS VARCHAR) PRINT 'インデックスデフラグを終了しました。' PRINT '' GO