DBCC INDEXDEFRAG (Transact-SQL)DBCC INDEXDEFRAG (Transact-SQL)

適用対象: ○SQL Server XAzure SQL Database XAzure Synapse Analytics (SQL DW) XParallel Data Warehouse APPLIES TO: YesSQL Server NoAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

指定されたテーブルまたはビューのインデックスをデフラグします。Defragments indexes of the specified table or view.

重要

この機能は、Microsoft SQL Server の将来のバージョンで削除されます。This feature will be removed in a future version of Microsoft SQL Server. 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible. 代わりに ALTER INDEX を使用してください。Use ALTER INDEX instead.

適用対象: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 から現在のバージョンまで)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through current version)

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

DBCC INDEXDEFRAG  
(  
    { database_name | database_id | 0 }   
    , { table_name | table_id | view_name | view_id }   
    [ , { index_name | index_id } [ , { partition_number | 0 } ] ]  
)  
    [ WITH NO_INFOMSGS ]   

引数Arguments

database_name | database_id | 0database_name | database_id | 0
断片化を解消するインデックスが含まれているデータベースを指定します。Is the database containing the index to defragment. 0 を指定すると、現在のデータベースが選択されます。If 0 is specified, the current database is used. データベース名は、識別子のルールに従っている必要があります。Database names must comply with the rules for identifiers.

table_name | table_id | view_name | view_idtable_name | table_id | view_name | view_id
断片化を解消するインデックスが含まれているテーブルまたはビューを指定します。Is the table or view containing the index to defragment. テーブル名とビュー名は、識別子の規則に従っている必要があります。Table and view names must comply with the rules for identifiers.

index_name | index_idindex_name | index_id
断片化を解消するインデックスの ID または名前を指定します。Is the name or ID of the index to defragment. インデックス ID を指定しないと、ステートメントは指定されたテーブルまたはビューのすべてのインデックスをデフラグします。If not specified, the statement defragments all indexes of the specified table or view. インデックス名は、識別子の規則に従っている必要があります。Index names must comply with the rules for identifiers.

partition_number | 0partition_number | 0
デフラグするインデックスのパーティション番号です。Is the partition number of the index to defragment. パーティション番号を指定しない場合、またはパーティション番号に 0 を指定した場合、ステートメントは指定されたインデックス内のすべてのパーティションをデフラグします。If not specified or if 0 is specified, the statement defragments all partitions in the specified index.

WITH NO_INFOMSGSWITH NO_INFOMSGS
重大度レベル 0 から 10 のすべての情報メッセージを表示しないようにします。Suppresses all informational messages that have severity levels from 0 through 10.

解説Remarks

DBCC INDEXDEFRAG は、リーフ ページの物理順序がリーフ ノードでの左から右への論理順序と一致するように、インデックスのリーフ レベルをデフラグするので、インデックスのスキャンのパフォーマンスが向上します。DBCC INDEXDEFRAG defragments the leaf level of an index so that the physical order of the pages matches the left-to-right logical order of the leaf nodes, therefore improving index-scanning performance.

注意

DBCC INDEXDEFRAG が実行されると、インデックスの断片化解消が直列に実行されます。When DBCC INDEXDEFRAG is run, index defragmentation occurs serially. つまり、単一のスレッドを使用して、単一のインデックスについて操作が実行されます。This means that the operation on a single index is performed using a single thread. 並列処理は実行されません。No parallelism occurs. また、同じ DBCC INDEXDEFRAG ステートメントからの複数のインデックスについての操作は、1 つのインデックスについて同時に実行されます。Also, operations on multiple indexes from the same DBCC INDEXDEFRAG statement are performed on one index at a time.

また、DBCC INDEXDEFRAG は、インデックス作成時に指定された FILL FACTOR を考慮しながら、インデックスのページの圧縮も行います。DBCC INDEXDEFRAG also compacts the pages of an index, taking into consideration the fill factor specified when the index was created. この圧縮によって作成された空のページは削除されます。Any empty pages created because of this compaction are removed. 詳細については、「 インデックスの FILL FACTOR の指定」を参照してください。For more information, see Specify Fill Factor for an Index.

インデックスが複数のファイルにわたる場合は、DBCC INDEXDEFRAG は一度に 1 つのファイルに対して断片化の解消を行います。If an index spans more than one file, DBCC INDEXDEFRAG defragments one file at a time. ページがファイル間を移動することはありません。Pages do not migrate between files.

DBCC INDEXDEFRAG は、5 分ごとに、完了した割合の予測値をレポートします。DBCC INDEXDEFRAG reports the estimated percentage completed every five minutes. DBCC INDEXDEFRAG は、プロセスのどの時点でも停止することができ、停止時に完了していた作業は保持されます。DBCC INDEXDEFRAG can be stopped at any point in the process, and any completed work is retained.

DBCC DBREINDEX (または一般のインデックス構築操作) とは異なり、DBCC INDEXDEFRAG はオンライン操作です。Unlike DBCC DBREINDEX, or the index building operation generally, DBCC INDEXDEFRAG is an online operation. この操作では、長期間にわたってロックを保持することはありません。It does not hold locks long term. したがって、DBCC INDEXDEFRAG はクエリまたは更新の実行をブロックしません。Therefore, DBCC INDEXDEFRAG does not block running queries or updates. デフラグの所要時間は断片化のレベルに関係するため、比較的断片化されていないインデックスのデフラグは、新しいインデックスの構築にかかる時間よりも短時間で済む場合があります。Because the time to defragment is related to the level of fragmentation, a relatively unfragmented index can be defragmented faster than a new index can be built. 断片化がかなり進んでいるインデックスの場合、デフラグすると、再構築するよりも所用時間が著しく長くなる場合があります。A very fragmented index might take considerably longer to defragment than to rebuild.

デフラグは、データベース復旧モデルの設定にかかわらず、常にすべてログに記録されます。The defragmentation is always fully logged, regardless of the database recovery model setting. 詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。For more information, see ALTER DATABASE (Transact-SQL). 断片化がかなり進んだインデックスをデフラグした場合、インデックスの作成をすべてログに記録したときよりも多くのログが生成される可能性があります。The defragmentation of a very fragmented index can generate more log than a fully logged index creation. ただし、ログのバックアップが頻繁に作成されているか、または復旧モデルに SIMPLE が設定されている場合、断片化の解消は一連の短いトランザクションとして実行されるため大量のログは必要なくなります。However, the defragmentation is performed as a series of short transactions, so a large log is unnecessary if log backups are taken frequently or if the recovery model setting is SIMPLE.

制限Restrictions

DBCC INDEXDEFRAG は、インデックス リーフ ページの再編成を行います。DBCC INDEXDEFRAG shuffles index leaf pages in place. したがって、特定のインデックスがディスク上の他のインデックスと交互に配置されている場合は、そのインデックスに対して DBCC INDEXDEFRAG を実行すると、隣接するインデックス内では一部のリーフ ページが作成されません。Therefore, if an index is interleaved with other indexes on disk, running DBCC INDEXDEFRAG against that index does not make all leaf pages in the index contiguous. ページが連続して配置されるようにするには、インデックスを再構築します。To improve the clustering of pages, rebuild the index. DBCC INDEXDEFRAG を使用して次のインデックスの断片化を解消することはできません。DBCC INDEXDEFRAG cannot be used to defragment the following indexes:

  • 無効化されたインデックス。A disabled index.
  • ページ ロックが OFF に設定されたインデックス。An index with page locking set to OFF.
  • 空間インデックスです。A spatial index.

DBCC INDEXDEFRAG は、システム テーブルに対して使用できません。DBCC INDEXDEFRAG is not supported for use on system tables.

結果セットResult Sets

DBCC INDEXDEFRAG は、(WITH NO_INFOMSGS が指定されている場合を除き) インデックスがステートメント内で指定されている場合に、次の結果セットを返します (値は異なることがあります)。DBCC INDEXDEFRAG returns the following result set (values may vary) if an index is specified in the statement (unless WITH NO_INFOMSGS is specified):

Pages Scanned Pages Moved Pages Removed  
------------- ----------- -------------  
359           346         8  
  
(1 row(s) affected)  
  
DBCC execution completed. If DBCC printed error messages, contact your system administrator.  

アクセス許可Permissions

呼び出し元はテーブルまたはインデックス付きビューを所有しているか、固定サーバー ロール sysadmin、固定データベース ロール db_owner、または固定データベース ロール db_ddladmin のメンバーである必要があります。Caller must own the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

Examples

A.A. DBCC INDEXDEFRAG を使用してインデックスの断片化を解消するUsing DBCC INDEXDEFRAG to defragment an index

次の例では、PK_Product_ProductID データベースの Production.Product テーブルにある AdventureWorks インデックスのすべてのパーティションをデフラグします。The following example defragments all partitions of the PK_Product_ProductID index in the Production.Product table in the AdventureWorks database.

DBCC INDEXDEFRAG (AdventureWorks2012, 'Production.Product', PK_Product_ProductID);  
GO  

B.B. DBCC SHOWCONTIG と DBCC INDEXDEFRAG を使用してデータベース内のインデックスの断片化を解消するUsing DBCC SHOWCONTIG and DBCC INDEXDEFRAG to defragment the indexes in a database

次の例では、宣言されたしきい値を超えて断片化しているデータベースのインデックスすべての断片化を解消する、簡単な方法を示しています。The following example shows a simple way to defragment all indexes in a database that are fragmented above a declared threshold.

/*Perform a 'USE <database name>' to select the database in which to run the script.*/  
-- Declare variables  
SET NOCOUNT ON;  
DECLARE @tablename varchar(255);  
DECLARE @execstr   varchar(400);  
DECLARE @objectid  int;  
DECLARE @indexid   int;  
DECLARE @frag      decimal;  
DECLARE @maxfrag   decimal;  
  
-- Decide on the maximum fragmentation to allow for.  
SELECT @maxfrag = 30.0;  
  
-- Declare a cursor.  
DECLARE tables CURSOR FOR  
   SELECT TABLE_SCHEMA + '.' + TABLE_NAME  
   FROM INFORMATION_SCHEMA.TABLES  
   WHERE TABLE_TYPE = 'BASE TABLE';  
  
-- Create the table.  
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);  
  
-- Open the cursor.  
OPEN tables;  
  
-- Loop through all the tables in the database.  
FETCH NEXT  
   FROM tables  
   INTO @tablename;  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
-- Do the showcontig of all indexes of the table  
   INSERT INTO #fraglist   
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')   
      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');  
   FETCH NEXT  
      FROM tables  
      INTO @tablename;  
END;  
  
-- Close and deallocate the cursor.  
CLOSE tables;  
DEALLOCATE tables;  
  
-- Declare the cursor for the list of indexes to be defragged.  
DECLARE indexes CURSOR FOR  
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag  
   FROM #fraglist  
   WHERE LogicalFrag >= @maxfrag  
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;  
  
-- Open the cursor.  
OPEN indexes;  
  
-- Loop through the 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) + ')';  
   EXEC (@execstr);  
  
   FETCH NEXT  
      FROM indexes  
      INTO @tablename, @objectid, @indexid, @frag;  
END;  
  
-- Close and deallocate the cursor.  
CLOSE indexes;  
DEALLOCATE indexes;  
  
-- Delete the temporary table.  
DROP TABLE #fraglist;  
GO  

参照See Also

DBCC (Transact-SQL)DBCC (Transact-SQL)
sys.dm_db_index_physical_stats (Transact-SQL)sys.dm_db_index_physical_stats (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
ALTER INDEX (Transact-SQL)ALTER INDEX (Transact-SQL)