sys.dm_db_index_physical_stats (Transact-SQL)sys.dm_db_index_physical_stats (Transact-SQL)

適用対象:○SQL Server (2008 以降)○Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

データと、指定したテーブルまたはビューのインデックスのサイズおよび断片化情報を返します SQL ServerSQL Serverします。Returns size and fragmentation information for the data and indexes of the specified table or view in SQL ServerSQL Server. インデックスの場合、各パーティションの B ツリーのレベルごとに 1 行のデータが返されます。For an index, one row is returned for each level of the B-tree in each partition. ヒープの場合、各パーティションの IN_ROW_DATA アロケーション ユニットごとに 1 行のデータが返されます。For a heap, one row is returned for the IN_ROW_DATA allocation unit of each partition. ラージ オブジェクト (LOB) データの場合、各パーティションの LOB_DATA アロケーション ユニットごとに 1 行のデータが返されます。For large object (LOB) data, one row is returned for the LOB_DATA allocation unit of each partition. テーブルに行オーバーフロー データが存在する場合、各パーティションの ROW_OVERFLOW_DATA アロケーション ユニットごとに 1 行のデータが返されます。If row-overflow data exists in the table, one row is returned for the ROW_OVERFLOW_DATA allocation unit in each partition. xVelocity メモリー最適化列ストア インデックスに関する情報は返されません。Does not return information about xVelocity memory optimized columnstore indexes.

重要

照会する場合はsys.dm_db_index_physical_stats Always On をホストするサーバー インスタンスで読み取り可能セカンダリ レプリカ、再実行のブロック問題が発生する可能性があります。If you query sys.dm_db_index_physical_stats on a server instance that is hosting an Always On readable secondary replica, you might encounter a REDO blocking issue. これは、この動的管理ビューが、指定したユーザー テーブルまたはビューで IS ロックを獲得することが原因です。IS ロックは、そのユーザー テーブルまたはビューの X ロックに関して REDO スレッドの要求をブロックする可能性があります。This is because this dynamic management view acquires an IS lock on the specified user table or view that can block requests by a REDO thread for an X lock on that user table or view.

sys.dm_db_index_physical_statsメモリ最適化インデックスに関する情報は返されません。sys.dm_db_index_physical_stats does not return information about memory-optimized indexes. メモリ最適化インデックスの使用方法については、次を参照してください。 sys.dm_db_xtp_index_stats & #40 です。TRANSACT-SQL と #41 です。For information about memory-optimized index use, see sys.dm_db_xtp_index_stats (Transact-SQL).

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

構文Syntax


sys.dm_db_index_physical_stats (   
    { database_id | NULL | 0 | DEFAULT }  
  , { object_id | NULL | 0 | DEFAULT }  
  , { index_id | NULL | 0 | -1 | DEFAULT }  
  , { partition_number | NULL | 0 | DEFAULT }  
  , { mode | NULL | DEFAULT }  
)  

引数Arguments

database_id | NULL | 0 | DEFAULTdatabase_id | NULL | 0 | DEFAULT
データベースの ID です。Is the ID of the database. database_idsmallintします。database_id is smallint. 有効な入力値は、データベースの ID 番号、NULL、0、または DEFAULT です。Valid inputs are the ID number of a database, NULL, 0, or DEFAULT. 既定値は 0 です。The default is 0. このコンテキストでは、NULL、0、および DEFAULT は同じ値になります。NULL, 0, and DEFAULT are equivalent values in this context.

SQL ServerSQL Server のインスタンスのすべてのデータベースに関する情報を返すには NULL を指定します。Specify NULL to return information for all databases in the instance of SQL ServerSQL Server. NULL を指定する場合database_idの場合は NULL を指定することも必要があります。 object_idindex_id、およびpartition_numberします。If you specify NULL for database_id, you must also specify NULL for object_id, index_id, and partition_number.

組み込み関数DB_IDを指定できます。The built-in function DB_ID can be specified. データベース名を指定しないで DB_ID を使用する場合、現在のデータベースの互換性レベルが 90 以上である必要があります。When using DB_ID without specifying a database name, the compatibility level of the current database must be 90 or greater.

object_id | NULL | 0 | DEFAULTobject_id | NULL | 0 | DEFAULT
テーブルのオブジェクト id またはインデックス ビューをオンします。Is the object ID of the table or view the index is on. object_IDintです。object_id is int.

有効な入力値は、テーブルおよびビューの ID 番号、NULL、0、または DEFAULT です。Valid inputs are the ID number of a table and view, NULL, 0, or DEFAULT. 既定値は 0 です。The default is 0. このコンテキストでは、NULL、0、および DEFAULT は同じ値になります。NULL, 0, and DEFAULT are equivalent values in this context. SQL Server 2016 (13.x)SQL Server 2016 (13.x)、有効な入力値は、service broker のキュー名、またはキューの内部テーブル名にも含まれます。As of SQL Server 2016 (13.x)SQL Server 2016 (13.x), valid inputs also include the service broker queue name or the queue internal table name. 既定のパラメーターが適用されます (つまりすべてのオブジェクト、すべてのインデックスなど)、結果セット内のすべてのキューの断片化情報が含まれています。When default parameters are applied (i.e. all objects, all indexes, etc), fragmentation information for all queues are included in the result set.

NULL を指定すると、指定されたデータベース内にあるすべてのテーブルとビューに関する情報が返されます。Specify NULL to return information for all tables and views in the specified database. NULL を指定する場合object_idの場合は NULL を指定することも必要があります。 index_idpartition_numberします。If you specify NULL for object_id, you must also specify NULL for index_id and partition_number.

index_id | 0 | NULL | -1 | DEFAULTindex_id | 0 | NULL | -1 | DEFAULT
インデックスの ID です。Is the ID of the index. index_idintします。場合、有効な値は 0、インデックスの ID 番号object_idヒープ、NULL、-1、または DEFAULT です。index_id is int. Valid inputs are the ID number of an index, 0 if object_id is a heap, NULL, -1, or DEFAULT. 既定では-1 です。The default is -1. NULL、-1、および既定値は同じ値にこのコンテキストでです。NULL, -1, and DEFAULT are equivalent values in this context.

NULL を指定すると、ベース テーブルまたはビューのすべてのインデックスに関する情報が返されます。Specify NULL to return information for all indexes for a base table or view. NULL を指定する場合index_idの場合は NULL を指定することも必要があります。 partition_numberします。If you specify NULL for index_id, you must also specify NULL for partition_number.

partition_number | NULL | 0 | DEFAULTpartition_number | NULL | 0 | DEFAULT
オブジェクトのパーティション番号です。Is the partition number in the object. partition_numberintします。有効な値は、 partion_numberのインデックスまたはヒープ、NULL、0、または DEFAULT です。partition_number is int. Valid inputs are the partion_number of an index or heap, NULL, 0, or DEFAULT. 既定値は 0 です。The default is 0. このコンテキストでは、NULL、0、および DEFAULT は同じ値になります。NULL, 0, and DEFAULT are equivalent values in this context.

NULL を指定すると、所有するオブジェクトのすべてのパーティションに関する情報が返されます。Specify NULL to return information for all partitions of the owning object.

partition_numberは 1 から始まります。partition_number is 1-based. 非パーティション インデックスまたはヒープにpartition_numberを 1 に設定します。A nonpartitioned index or heap has partition_number set to 1.

mode | NULL | DEFAULTmode | NULL | DEFAULT
モードの名前を指定します。Is the name of the mode. モード統計情報を取得するために使用されるスキャン レベルを指定します。mode specifies the scan level that is used to obtain statistics. モードsysnameします。mode is sysname. 有効な入力値は DEFAULT、NULL、LIMITED、SAMPLED、DETAILED です。Valid inputs are DEFAULT, NULL, LIMITED, SAMPLED, or DETAILED. 既定値 (NULL) は LIMITED です。The default (NULL) is LIMITED.

返されるテーブルTable Returned

列名Column name データ型Data type 説明Description
database_iddatabase_id smallintsmallint テーブルまたはビューのデータベース ID。Database ID of the table or view.
object_idobject_id intint インデックスがあるテーブルまたはビューのオブジェクト ID。Object ID of the table or view that the index is on.
index_idindex_id intint インデックスのインデックス ID。Index ID of an index.

0 = ヒープ。0 = Heap.
partition_numberpartition_number intint 所有するオブジェクト (テーブル、ビュー、インデックス) 内の 1 から始まるパーティション番号。1-based partition number within the owning object; a table, view, or index.

1 = パーティション分割されていないインデックスまたはヒープ。1 = Nonpartitioned index or heap.
index_type_descindex_type_desc nvarchar(60)nvarchar(60) インデックスの種類の説明です。Description of the index type:

HEAPHEAP

CLUSTERED INDEXCLUSTERED INDEX

NONCLUSTERED INDEXNONCLUSTERED INDEX

PRIMARY XML INDEXPRIMARY XML INDEX

SPATIAL INDEXSPATIAL INDEX

XML INDEXXML INDEX

列ストア マッピング インデックス (内部)COLUMNSTORE MAPPING INDEX (internal)

列ストアの DELETEBUFFER インデックス (内部)COLUMNSTORE DELETEBUFFER INDEX (internal)

列ストアの DELETEBITMAP インデックス (内部)COLUMNSTORE DELETEBITMAP INDEX (internal)
hobt_idhobt_id bigintbigint ヒープまたはインデックスまたはパーティションの B ツリー ID。Heap or B-Tree ID of the index or partition.

ユーザー定義のインデックスの hobt_id でを返すだけでなく内部列ストア インデックスの hobt_id でも返します。Besides returning the hobt_id of user-defined indexes, this also returns the hobt_id of the internal columnstore indexes.
alloc_unit_type_descalloc_unit_type_desc nvarchar(60)nvarchar(60) アロケーション ユニットの種類の説明。Description of the allocation unit type:

IN_ROW_DATAIN_ROW_DATA

LOB_DATALOB_DATA

ROW_OVERFLOW_DATAROW_OVERFLOW_DATA

LOB_DATA アロケーション ユニットには、型の列に格納されているデータが含まれていますテキストntextイメージvarchar (max)、 。nvarchar (max)varbinary (max)、およびxmlします。The LOB_DATA allocation unit contains the data that is stored in columns of type text, ntext, image, varchar(max), nvarchar(max), varbinary(max), and xml. 詳細については、「データ型 (Transact-SQL)」を参照してください。For more information, see Data Types (Transact-SQL).

ROW_OVERFLOW_DATA アロケーション ユニットには、型の列に格納されているデータが含まれていますvarchar (n)nvarchar (n)varbinary (n)、およびsql _。バリアント行外に出されました。The ROW_OVERFLOW_DATA allocation unit contains the data that is stored in columns of type varchar(n), nvarchar(n), varbinary(n), and sql_variant that have been pushed off-row.
index_depthindex_depth tinyinttinyint インデックス レベルの数です。Number of index levels.

1 = ヒープ、LOB_DATA アロケーション ユニット、または ROW_OVERFLOW_DATA アロケーション ユニット。1 = Heap, or LOB_DATA or ROW_OVERFLOW_DATA allocation unit.
index_levelindex_level tinyinttinyint インデックスの現在のレベル。Current level of the index.

インデックスのリーフ レベル、ヒープ、LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは 0 になります。0 for index leaf levels, heaps, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

非リーフ インデックス レベルでは 0 より大きい数になります。Greater than 0 for nonleaf index levels. index_levelインデックスのルート レベルで最大になります。index_level will be the highest at the root level of an index.

インデックスの非リーフ レベルはのみ処理されるときにモード= 詳細。The nonleaf levels of indexes are only processed when mode = DETAILED.
avg_fragmentation_in_percentavg_fragmentation_in_percent floatfloat インデックスの論理的な断片化、または IN_ROW_DATA アロケーション ユニットでのヒープのエクステントの断片化。Logical fragmentation for indexes, or extent fragmentation for heaps in the IN_ROW_DATA allocation unit.

値はパーセンテージ (%) で表され、複数のファイルが考慮されます。The value is measured as a percentage and takes into account multiple files. 論理的な断片化とエクステントの断片化の定義については、「解説」を参照してください。For definitions of logical and extent fragmentation, see Remarks.

LOB_DATA および ROW_OVERFLOW_DATA アロケーション ユニットでは 0 になります。0 for LOB_DATA and ROW_OVERFLOW_DATA allocation units.

NULL の場合にヒープモード= SAMPLED。NULL for heaps when mode = SAMPLED.
fragment_countfragment_count bigintbigint IN_ROW_DATA アロケーション ユニットのリーフ レベルでのフラグメントの数。Number of fragments in the leaf level of an IN_ROW_DATA allocation unit. フラグメントの詳細については、「解説」を参照してください。For more information about fragments, see Remarks.

インデックスの非リーフ レベル、および LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは NULL になります。NULL for nonleaf levels of an index, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

NULL の場合にヒープモード= SAMPLED。NULL for heaps when mode = SAMPLED.
avg_fragment_size_in_pagesavg_fragment_size_in_pages floatfloat IN_ROW_DATA アロケーション ユニットのリーフ レベルにおける、フラグメントあたりのページの平均数。Average number of pages in one fragment in the leaf level of an IN_ROW_DATA allocation unit.

インデックスの非リーフ レベル、および LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは NULL になります。NULL for nonleaf levels of an index, and LOB_DATA or ROW_OVERFLOW_DATA allocation units.

NULL の場合にヒープモード= SAMPLED。NULL for heaps when mode = SAMPLED.
page_countpage_count bigintbigint インデックス ページまたはデータ ページの合計数。Total number of index or data pages.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルにおけるインデックス ページの合計数になります。For an index, the total number of index pages in the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれるデータ ページの合計数になります。For a heap, the total number of data pages in the IN_ROW_DATA allocation unit.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニットに含まれる合計ページ数になります。For LOB_DATA or ROW_OVERFLOW_DATA allocation units, total number of pages in the allocation unit.
avg_page_space_used_in_percentavg_page_space_used_in_percent floatfloat すべてのページで、使用可能なデータ ストレージ領域のうち使用されているパーセンテージ (%) の平均。Average percentage of available data storage space used in all pages.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルでの平均になります。For an index, average applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれるすべてのデータ ページの平均になります。For a heap, the average of all data pages in the IN_ROW_DATA allocation unit.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニットに含まれるすべてのページの平均になります。For LOB_DATA or ROW_OVERFLOW DATA allocation units, the average of all pages in the allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
record_countrecord_count bigintbigint レコードの総数。Total number of records.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルにおけるレコードの合計数になります。For an index, total number of records applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれるレコードの合計数になります。For a heap, the total number of records in the IN_ROW_DATA allocation unit.

注: ヒープの場合、この関数から返されるレコードの数と一致しない SELECT COUNT を実行して返される行の数 (*)、ヒープに対して。Note: For a heap, the number of records returned from this function might not match the number of rows that are returned by running a SELECT COUNT(*) against the heap. これは、1 行に複数のレコードが含まれる場合があるためです。This is because a row may contain multiple records. たとえば、更新の状況によっては、更新操作の結果として転送元レコードと転送先レコードが 1 つのヒープ行に含まれることがあります。For example, under some update situations, a single heap row may have a forwarding record and a forwarded record as a result of the update operation. また、大きな LOB 行のほとんどは、LOB_DATA ストレージ内で複数のレコードに分割されます。Also, most large LOB rows are split into multiple records in LOB_DATA storage.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニット全体でのレコードの合計数になります。For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the total number of records in the complete allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
ghost_record_countghost_record_count bigintbigint アロケーション ユニットで、非実体クリーンアップ タスクによる削除の準備ができているゴースト レコードの数。Number of ghost records ready for removal by the ghost cleanup task in the allocation unit.

IN_ROW_DATA アロケーション ユニットに含まれるインデックスの非リーフ レベルでは 0 になります。0 for nonleaf levels of an index in the IN_ROW_DATA allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
version_ghost_record_countversion_ghost_record_count bigintbigint アロケーション ユニット内で、未処理のスナップショット分離トランザクションによって保持されているゴースト レコードの数。Number of ghost records retained by an outstanding snapshot isolation transaction in an allocation unit.

IN_ROW_DATA アロケーション ユニットに含まれるインデックスの非リーフ レベルでは 0 になります。0 for nonleaf levels of an index in the IN_ROW_DATA allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
min_record_size_in_bytesmin_record_size_in_bytes intint 最小レコード サイズ (バイト単位)。Minimum record size in bytes.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルでの最小レコード サイズになります。For an index, minimum record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれる最小レコード サイズになります。For a heap, the minimum record size in the IN_ROW_DATA allocation unit.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニット全体での最小レコード サイズになります。For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the minimum record size in the complete allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
max_record_size_in_bytesmax_record_size_in_bytes intint 最大レコード サイズ (バイト単位)。Maximum record size in bytes.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルでの最大レコード サイズになります。For an index, the maximum record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれる最大レコード サイズになります。For a heap, the maximum record size in the IN_ROW_DATA allocation unit.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニット全体での最大レコード サイズになります。For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the maximum record size in the complete allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
avg_record_size_in_bytesavg_record_size_in_bytes floatfloat 平均レコード サイズ (バイト単位)。Average record size in bytes.

インデックスでは、IN_ROW_DATA アロケーション ユニットに含まれる B ツリーの現在のレベルでの平均レコード サイズになります。For an index, the average record size applies to the current level of the b-tree in the IN_ROW_DATA allocation unit.

ヒープでは、IN_ROW_DATA アロケーション ユニットに含まれる平均レコード サイズになります。For a heap, the average record size in the IN_ROW_DATA allocation unit.

LOB_DATA または ROW_OVERFLOW_DATA アロケーション ユニットでは、アロケーション ユニット全体での平均レコード サイズになります。For LOB_DATA or ROW_OVERFLOW_DATA allocation units, the average record size in the complete allocation unit.

ときに、NULLモードLIMITED を = です。NULL when mode = LIMITED.
forwarded_record_countforwarded_record_count bigintbigint 別のデータの場所への転送ポインターを持つ、ヒープ内の転送されたレコード数Number of records in a heap that have forward pointers to another data location. (この状態は、更新中に、新しい行を格納できる十分なスペースが元の場所にない場合に発生します)。(This state occurs during an update, when there is not enough room to store the new row in the original location.)

ヒープの IN_ROW_DATA アロケーション ユニット以外のアロケーション ユニットでは NULL になります。NULL for any allocation unit other than the IN_ROW_DATA allocation units for a heap.

NULL の場合にヒープモード= LIMITED。NULL for heaps when mode = LIMITED.
compressed_page_countcompressed_page_count bigintbigint 圧縮されたページ数。The number of compressed pages.

ヒープの場合、新しく割り当てられたページはページ圧縮されません。For heaps, newly allocated pages are not PAGE compressed. ヒープは、2 つの特殊な条件、つまりデータを一括インポートする場合、またはヒープを再構築する場合に、ページ圧縮されます。A heap is PAGE compressed under two special conditions: when data is bulk imported or when a heap is rebuilt. ページ割り当ての原因となる通常の DML 操作ではページ圧縮されません。Typical DML operations that cause page allocations will not be PAGE compressed. compressed_page_count の値が目標のしきい値を超えた場合は、ヒープを再構築してください。Rebuild a heap when the compressed_page_count value grows larger than the threshold you want.

クラスター化インデックスを含むテーブルの場合、compressed_page_count の値はページ圧縮の効果を示します。For tables that have a clustered index, the compressed_page_count value indicates the effectiveness of PAGE compression.
hobt_idhobt_id BIGINTbigint 適用対象: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) から 現在のバージョンまで)、 Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL データベースAzure SQL Database.

列ストア インデックスの場合のみ、これには、パーティションの内部列ストアのデータを追跡する行セットの ID です。For columnstore indexes only, this is the ID for a rowset that tracks internal columnstore data for a partition. 行セットには、データがヒープとしてストアドまたはバイナリ ツリー。The rowsets are stored as data heaps or binary trees. 親の列ストア インデックスと同じインデックス ID があります。They have the same index ID as the parent columnstore index. 詳細については、次を参照してください。 sys.internal_partitions (TRANSACT-SQL)します。For more information, see sys.internal_partitions (Transact-SQL).

NULL の場合NULL if
column_store_delete_buffer_statecolumn_store_delete_buffer_state TINYINTtinyint 適用対象: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) から 現在のバージョンまで)、 Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL データベースAzure SQL Database.

0 = NOT_APPLICABLE0 = NOT_APPLICABLE

1 = OPEN 1 = OPEN

2 = のドレイン2 = DRAINING

3 = フラッシュ3 = FLUSHING

4 = のインベントリから削除4 = RETIRING

5 = 準備完了5 = READY
column_store_delete_buff_state_desccolumn_store_delete_buff_state_desc 適用対象: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) から 現在のバージョンまで)、 Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version), Azure SQL データベースAzure SQL Database.

NOT_APPLICABLE – 親インデックスは列ストア インデックスではありません。NOT_APPLICABLE –the parent index is not a columnstore index.

OPEN-deleters し、スキャナーでは、これを使用します。OPEN – deleters and scanners use this.

ドレイン中 – deleters ドレインが、スキャナーが引き続き使用します。DRAINING – deleters are draining out but scanners still use it.

フラッシュ – は、バッファーが閉じられ、バッファー内の行は、削除のビットマップに書き込まれています。FLUSHING – buffer is closed and rows in the buffer are being written to the delete bitmap.

削除のビットマップに書き込まれた RETIRING – 閉じた削除バッファーの行が、バッファーが切り捨てられていないスキャナーによってまだ使用されています。RETIRING – rows in the closed delete buffer have been written to the delete bitmap, but the buffer has not been truncated because scanners are still using it. 新しいスキャナーは、開いているバッファーが十分であるために、中止のバッファーを使用する必要はありません。New scanners don’t need to use the retiring buffer because the open buffer is enough.

準備ができました – この削除バッファーが使用できる状態。READY – This delete buffer is ready for use.

コメントRemarks

sys.dm_db_index_physical_stats 動的管理関数は、DBCC SHOWCONTIG ステートメントの代わりに使用できます。The sys.dm_db_index_physical_stats dynamic management function replaces the DBCC SHOWCONTIG statement.

スキャン モードScanning Modes

関数が実行されるモードによって、関数で使用する統計データを取得するためのスキャンのレベルが決まります。The mode in which the function is executed determines the level of scanning performed to obtain the statistical data that is used by the function. モードLIMITED、SAMPLED、または詳細として指定されます。mode is specified as LIMITED, SAMPLED, or DETAILED. この関数は、ページ チェーンをスキャンすることにより、テーブルまたはインデックスの指定パーティションを構成するアロケーション ユニットを検索します。The function traverses the page chains for the allocation units that make up the specified partitions of the table or index. sys.dm_db_index_physical_stats には、インテント共有 (IS) テーブル ロックのみで実行するモードに関係なく必要があります。sys.dm_db_index_physical_stats requires only an Intent-Shared (IS) table lock, regardless of the mode that it runs in.

LIMITED モードは最も高速なモードで、スキャンするページ数は最小です。The LIMITED mode is the fastest mode and scans the smallest number of pages. インデックスでは、B ツリーの親レベルのページ (リーフ レベルより上のページ) だけがスキャンされます。For an index, only the parent-level pages of the B-tree (that is, the pages above the leaf level) are scanned. ヒープでは、関連付けられた PFS ページおよび IAM ページが調べられます。LIMITED モードではヒープのデータ ページがスキャンされます。For a heap, the associated PFS and IAM pages are examined and the data pages of a heap are scanned in LIMITED mode.

LIMITED モードでは、 データベース エンジンDatabase Engineは B ツリーの非リーフ ページとヒープの IAM および PFS ページのみをスキャンするので、compressed_page_count は NULL です。With LIMITED mode, compressed_page_count is NULL because the データベース エンジンDatabase Engine only scans non-leaf pages of the B-tree and the IAM and PFS pages of the heap. SAMPLED モードを使用して、compressed_page_count の推定値を取得し、compressed_page_count の実際の値を取得する詳細モードを使用します。Use SAMPLED mode to get an estimated value for compressed_page_count, and use DETAILED mode to get the actual value for compressed_page_count. SAMPLED モードでは、インデックスまたはヒープの全ページの 1% のサンプルに基づく統計情報が返されます。The SAMPLED mode returns statistics based on a 1 percent sample of all the pages in the index or heap. SAMPLED モードの結果は近似と見なす必要があります。Results in SAMPLED mode should be regarded as approximate. インデックスまたはヒープのページが 10,000 ページに満たない場合は、SAMPLED モードの代わりに DETAILED モードが使用されます。If the index or heap has fewer than 10,000 pages, DETAILED mode is used instead of SAMPLED.

DETAILED モードではすべてのページがスキャンされ、すべての統計が返されます。The DETAILED mode scans all pages and returns all statistics.

各モードで実行される処理は LIMITED、SAMPLED、DETAILED の順に増加し、それに応じて処理時間は遅くなります。The modes are progressively slower from LIMITED to DETAILED, because more work is performed in each mode. テーブルまたはインデックスの断片化レベルのサイズをすばやく計測するには、LIMITED モードを使用します。To quickly gauge the size or fragmentation level of a table or index, use the LIMITED mode. LIMITED モードは最も高速で、インデックスの IN_ROW_DATA アロケーション ユニットにおける各非リーフ レベルの行は返されません。It is the fastest and will not return a row for each nonleaf level in the IN_ROW_DATA allocation unit of the index.

システム関数によるパラメーター値の指定Using System Functions to Specify Parameter Values

使用することができます、 Transact-SQLTransact-SQL関数DB_IDOBJECT_IDの値を指定する、 database_idobject_idパラメーター。You can use the Transact-SQLTransact-SQL functions DB_ID and OBJECT_ID to specify a value for the database_id and object_id parameters. ただし、これらの関数に無効な値を渡すと、意図しない結果が生じる可能性があります。However, passing values that are not valid to these functions may cause unintended results. たとえば、データベースまたはオブジェクト名が存在しないか、スペルが間違っていることが原因で見つからない場合は、どちらの関数も NULL を返します。For example, if the database or object name cannot be found because they do not exist or are spelled incorrectly, both functions will return NULL. sys.dm_db_index_physical_stats 関数では、NULL 値はすべてのデータベースまたはすべてのオブジェクトを指定するワイルドカード値として解釈されます。The sys.dm_db_index_physical_stats function interprets NULL as a wildcard value specifying all databases or all objects.

さらに、OBJECT_ID 関数が処理されるは、sys.dm_db_index_physical_stats 関数と呼びます。 そのため、現在のデータベースのコンテキストで評価する前に、データベースではなくで指定されたdatabase_idします。Additionally, the OBJECT_ID function is processed before the sys.dm_db_index_physical_stats function is called and is therefore evaluated in the context of the current database, not the database specified in database_id. この動作により、OBJECT_ID 関数で NULL 値が返される場合があります。または、オブジェクト名が現在のデータベースのコンテキストと指定したデータベースの両方に存在する場合は、エラー メッセージが返されることがあります。This behavior may cause the OBJECT_ID function to return a NULL value; or, if the object name exists in both the current database context and the specified database, an error message may be returned. 次の例は、こうした意図しない結果を示すものです。The following examples demonstrate these unintended results.

USE master;  
GO  
-- In this example, OBJECT_ID is evaluated in the context of the master database.   
-- Because Person.Address does not exist in master, the function returns NULL.  
-- When NULL is specified as an object_id, all objects in the database are returned.  
-- The same results are returned when an object that is not valid is specified.  
SELECT * FROM sys.dm_db_index_physical_stats  
    (DB_ID(N'AdventureWorks'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');  
GO  
-- This example demonstrates the results of specifying a valid object name  
-- that exists in both the current database context and  
-- in the database specified in the database_id parameter of the   
-- sys.dm_db_index_physical_stats function.  
-- An error is returned because the ID value returned by OBJECT_ID does not  
-- match the ID value of the object in the specified database.  
CREATE DATABASE Test;  
GO  
USE Test;  
GO  
CREATE SCHEMA Person;  
GO  
CREATE Table Person.Address(c1 int);  
GO  
USE AdventureWorks2012;  
GO  
SELECT * FROM sys.dm_db_index_physical_stats  
    (DB_ID(N'Test'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');  
GO  
-- Clean up temporary database.  
DROP DATABASE Test;  
GO  

推奨事項Best Practice

DB_ID または OBJECT_ID を使用する場合は、必ず有効な ID が返されるようにしてください。Always make sure that a valid ID is returned when you use DB_ID or OBJECT_ID. たとえば、OBJECT_ID を使用するときに名前を指定 3 部などOBJECT_ID(N'AdventureWorks2012.Person.Address')、または sys.dm_db_index_physical_stats 関数で使用する前に、関数によって返される値をテストします。For example, when you use OBJECT_ID, specify a three-part name such as OBJECT_ID(N'AdventureWorks2012.Person.Address'), or test the value returned by the functions before you use them in the sys.dm_db_index_physical_stats function. 後の例 A と B は、データベース ID とオブジェクト ID を安全に指定する方法を示しています。Examples A and B that follow demonstrate a safe way to specify database and object IDs.

断片化の検出Detecting Fragmentation

断片化は、テーブルとテーブルに定義されたインデックスに対して、INSERT、UPDATE、DELETE ステートメントによるデータ変更が行われる過程で発生します。Fragmentation occurs through the process of data modifications (INSERT, UPDATE, and DELETE statements) that are made against the table and, therefore, to the indexes defined on the table. これらの変更は、テーブルとインデックスのすべての行に均等に分散されるわけではないため、時間が経つにしたがって各ページのゆとりに差が生じることになります。Because these modifications are not ordinarily distributed equally among the rows of the table and indexes, the fullness of each page can vary over time. このような断片化があるときに、クエリでテーブルのインデックスの一部または全部をスキャンしようとすると、余分なページの読み取りが必要になり、For queries that scan part or all of the indexes of a table, this kind of fragmentation can cause additional page reads. データの並列スキャンの妨げになります。This hinders parallel scanning of data.

インデックスまたはヒープの断片化レベルは、avg_fragmentation_in_percent 列で確認できます。The fragmentation level of an index or heap is shown in the avg_fragmentation_in_percent column. ヒープの場合、この列の値はヒープのエクステントの断片化を表します。For heaps, the value represents the extent fragmentation of the heap. インデックスの場合、この値はインデックスの論理的な断片化を表します。For indexes, the value represents the logical fragmentation of the index. DBCC SHOWCONTIG とは異なり、どちらの場合の断片化計算アルゴリズムでも複数のファイルにまたがるストレージが考慮されており、正確な計算値が得られます。Unlike DBCC SHOWCONTIG, the fragmentation calculation algorithms in both cases consider storage that spans multiple files and, therefore, are accurate.

論理的な断片化Logical Fragmentation

これは、インデックスのリーフ ページでの順序が不正なページの割合です。This is the percentage of out-of-order pages in the leaf pages of an index. 順序が不正なページとは、インデックスに割り当てられている次の物理的なページと、現在のリーフ ページの次ページ ポインターが示すページが異なるページのことです。An out-of-order page is a page for which the next physical page allocated to the index is not the page pointed to by the next-page pointer in the current leaf page.

エクステントの断片化Extent Fragmentation

これは、ヒープのリーフ ページでの順序が不正なエクステントの割合です。This is the percentage of out-of-order extents in the leaf pages of a heap. 順序が無効なエクステントとは、ヒープの現在のページを含むエクステントの物理的な位置が、前のページを含むエクステントの直後でない状態のエクステントを指します。An out-of-order extent is one for which the extent that contains the current page for a heap is not physically the next extent after the extent that contains the previous page.

最大のパフォーマンスを得るには、avg_fragmentation_in_percent の値をできるだけ 0 に近くする必要があります。The value for avg_fragmentation_in_percent should be as close to zero as possible for maximum performance. ただし、0 ~ 10% の値は許容範囲です。However, values from 0 percent through 10 percent may be acceptable. 再構築、再構成、再作成など、断片化を解消するためのさまざまな手段を使用することによって、この値を下げることができます。All methods of reducing fragmentation, such as rebuilding, reorganizing, or re-creating, can be used to reduce these values. インデックスの断片化の程度を分析する方法の詳細については、次を参照してください。 Reorganize and Rebuild Indexesします。For more information about how to analyze the degree of fragmentation in an index, see Reorganize and Rebuild Indexes.

インデックスの断片化の解消Reducing Fragmentation in an Index

クエリのパフォーマンスに影響が出るほどインデックスが断片化している場合、断片化を解消するには 3 つの方法があります。When an index is fragmented in a way that the fragmentation is affecting query performance, there are three choices for reducing fragmentation:

  • クラスター化インデックスを削除し、再作成する。Drop and re-create the clustered index.

    クラスター化インデックスを再作成すると、データが再分配され、データ ページにデータが満たされます。Re-creating a clustered index redistributes the data and results in full data pages. ページのゆとりのレベルは、CREATE INDEX の FILLFACTOR オプションを使用して構成できます。The level of fullness can be configured by using the FILLFACTOR option in CREATE INDEX. このメソッドで短所は、インデックスが、削除中にオフラインであり、サイクルを再作成することと、操作がアトミックです。The drawbacks in this method are that the index is offline during the drop and re-create cycle, and that the operation is atomic. インデックスの作成が中断されると、インデックスは再作成されません。If the index creation is interrupted, the index is not re-created. 詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。For more information, see CREATE INDEX (Transact-SQL).

  • DBCC INDEXDEFRAG の代わりの ALTER INDEX REORGANIZE を使用して、インデックスのリーフ レベル ページを論理順序の順に並べ替える。Use ALTER INDEX REORGANIZE, the replacement for DBCC INDEXDEFRAG, to reorder the leaf level pages of the index in a logical order. これはオンライン操作のため、ステートメントの実行中もインデックスを使用できます。Because this is an online operation, the index is available while the statement is running. 操作を中断しても、それまでに完了した作業は失われません。The operation can also be interrupted without losing work already completed. この方法の短所は、インデックスの再構築操作ほど、データの再構成が適切に行われず、統計も更新されないことです。The drawback in this method is that it does not do as good a job of reorganizing the data as an index rebuild operation, and it does not update statistics.

  • DBCC DBREINDEX の代わりの ALTER INDEX REBUILD を使用して、オンラインまたはオフラインでインデックスを再構築する。Use ALTER INDEX REBUILD, the replacement for DBCC DBREINDEX, to rebuild the index online or offline. 詳細については、「ALTER INDEX (Transact-SQL)」を参照してください。For more information, see ALTER INDEX (Transact-SQL).

    断片化だけでは、インデックスを再構成または再構築する十分な理由にはなりません。Fragmentation alone is not a sufficient reason to reorganize or rebuild an index. 断片化の影響は主に、インデックスのスキャン中にページの先行読み取りのスループットが減速することです。The main effect of fragmentation is that it slows down page read-ahead throughput during index scans. これは、応答時間の遅れの原因となります。This causes slower response times. 断片化したテーブルまたはインデックスでのクエリのワークロードにスキャンが関係していない場合、ワークロードは主に単一参照のため、断片化を解消しても効果はありません。If the query workload on a fragmented table or index does not involve scans, because the workload is primarily singleton lookups, removing fragmentation may have no effect. 詳細については、この参照してください。 Microsoft Web サイトします。For more information, see this Microsoft Web site.

注意

DBCC SHRINKFILE または DBCC SHRINKDATABASE を実行している場合は、インデックスが部分的または完全に移動された場合、圧縮操作中に断片化が生じる可能性があります。Running DBCC SHRINKFILE or DBCC SHRINKDATABASE may introduce fragmentation if an index is partly or completely moved during the shrink operation. そのため場合、圧縮操作を実行する必要があります、行う必要があります、断片化が削除される前にします。Therefore, if a shrink operation must be performed, you should do it before fragmentation is removed.

ヒープの断片化の解消Reducing Fragmentation in a Heap

ヒープのエクステントの断片化を解消するには、テーブルにクラスター化インデックスを作成し、インデックスを削除します。To reduce the extent fragmentation of a heap, create a clustered index on the table and then drop the index. これによって、クラスター化インデックスの作成中にデータが再分配されます。This redistributes the data while the clustered index is created. この操作では、データベースの空き領域の分布を考慮に入れて、可能な限り最適化も行われます。This also makes it as optimal as possible, considering the distribution of free space available in the database. この後、ヒープを再作成するためにクラスター化インデックスを削除しても、データは移動せず、最適な状態が保たれます。When the clustered index is then dropped to re-create the heap, the data is not moved and remains optimally in position. これらの操作を実行する方法については、次を参照してください。 CREATE INDEXDROP INDEXします。For information about how to perform these operations, see CREATE INDEX and DROP INDEX.

注意事項

テーブルでクラスター化インデックスを作成して削除すると、そのテーブルのすべての非クラスター化インデックスが 2 回再構築されます。Creating and dropping a clustered index on a table, rebuilds all non-clustered indexes on that table twice.

ラージ オブジェクト データの圧縮Compacting Large Object Data

既定では、ALTER INDEX REORGANIZE ステートメントを実行すると、ラージ オブジェクト (LOB) データを含むページが圧縮されます。By default, the ALTER INDEX REORGANIZE statement compacts pages that contain large object (LOB) data. LOB ページは空の場合でも割り当てを解除されないので、多くの LOB データまたは LOB 列が削除された場合は、このデータを圧縮することでディスク領域の使用が改善されます。Because LOB pages are not deallocated when empty, compacting this data can improve disk space use if lots of LOB data have been deleted, or a LOB column is dropped.

特定のクラスター化インデックスを再構成すると、そのクラスター化インデックスに含まれるすべての LOB 列が圧縮されます。Reorganizing a specified clustered index compacts all LOB columns that are contained in the clustered index. 非クラスター化インデックスを再構成すると、そのインデックス内で非キー列 (付加列) となっているすべての LOB 列が圧縮されます。Reorganizing a nonclustered index compacts all LOB columns that are nonkey (included) columns in the index. ステートメントで ALL を指定した場合は、指定したテーブルまたはビューに関連付けられているすべてのインデックスが再構成されます。When ALL is specified in the statement, all indexes that are associated with the specified table or view are reorganized. さらに、クラスター化インデックス、基になるテーブル、または付加列を含む非クラスター化インデックスに関連付けられているすべての LOB 列も圧縮されます。Additionally, all LOB columns that are associated with the clustered index, underlying table, or nonclustered index with included columns are compacted.

ディスク領域の使用状況の評価Evaluating Disk Space Use

avg_page_space_used_in_percent 列には、ページのゆとりが示されます。The avg_page_space_used_in_percent column indicates page fullness. ディスク領域の使用を最適にするには、ランダムな挿入があまり行われないインデックスの場合はこの値を 100% に近づけます。To achieve optimal disk space use, this value should be close to 100 percent for an index that will not have many random inserts. 一方、ランダムな挿入が多く行われ、いっぱいになったページが多いインデックスの場合はページ分割数が増えるため、However, an index that has many random inserts and has very full pages will have an increased number of page splits. 断片化が大きくなります。This causes more fragmentation. したがって、ページ分割数を減らすには、値を 100% よりも少なくする必要があります。Therefore, in order to reduce page splits, the value should be less than 100 percent. FILLFACTOR オプションを指定してインデックスを再構築すると、ページのゆとりをインデックスのクエリ パターンに合わせて変更できます。Rebuilding an index with the FILLFACTOR option specified allows the page fullness to be changed to fit the query pattern on the index. Fill factor の詳細については、次を参照してください。インデックスの Fill Factor の指定します。For more information about fill factor, see Specify Fill Factor for an Index. また、ALTER INDEX REORGANIZE は最後に指定された FILLFACTOR までページが埋まるよう、インデックスを圧縮します。Also, ALTER INDEX REORGANIZE will compact an index by trying to fill pages to the FILLFACTOR that was last specified. これにより、avg_space_used_in_percent の値は増加します。This increases the value in avg_space_used_in_percent. ALTER INDEX REORGANIZE はページのゆとりを調整できないことに注意してください。Note that ALTER INDEX REORGANIZE cannot reduce page fullness. 代わりに、インデックスの再構築を実行する必要があります。Instead, an index rebuild must be performed.

インデックスのフラグメントの評価Evaluating Index Fragments

フラグメントは構成、同じファイル内の物理的に連続するリーフ ページのアロケーション ユニットのされます。A fragment is made up of physically consecutive leaf pages in the same file for an allocation unit. 1 つのインデックスには少なくとも 1 つのフラグメントが含まれます。An index has at least one fragment. インデックスが持つことのできるフラグメントの最大数は、インデックスのリーフ レベルのページ数と同じです。The maximum fragments an index can have are equal to the number of pages in the leaf level of the index. フラグメントが大きいほど、同じ数のページの読み取りに必要なディスクの I/O が少なくなります。Larger fragments mean that less disk I/O is required to read the same number of pages. したがって、avg_fragment_size_in_pages 値が大きいほど、範囲スキャンのパフォーマンスは向上します。Therefore, the larger the avg_fragment_size_in_pages value, the better the range scan performance. avg_fragment_size_in_pages と avg_fragmentation_in_percent の値は、互いに反比例します。The avg_fragment_size_in_pages and avg_fragmentation_in_percent values are inversely proportional to each other. したがって、インデックスを再構築または再構成すると、断片化が解消し、フラグメントのサイズが大きくなります。Therefore, rebuilding or reorganizing an index should reduce the amount of fragmentation and increase the fragment size.

制限事項と制約事項Limitations and Restrictions

クラスター化列ストア インデックスのデータは返されません。Does not return data for clustered columnstore indexes.

アクセス許可Permissions

次の権限が必要です。Requires the following permissions:

  • データベース内で指定したオブジェクトに対する CONTROL 権限。CONTROL permission on the specified object within the database.

  • @ のオブジェクトのワイルドカードを使用して指定したデータベース内のすべてのオブジェクトに関する情報を返す VIEW DATABASE STATE 権限object_id= NULL。VIEW DATABASE STATE permission to return information about all objects within the specified database, by using the object wildcard @object_id=NULL.

  • データベースのワイルドカード @ を使用して、すべてのデータベースに関する情報を返す VIEW SERVER STATE 権限database_id = NULL。VIEW SERVER STATE permission to return information about all databases, by using the database wildcard @database_id = NULL.

    VIEW DATABASE STATE 権限を許可すると、特定のオブジェクトに対して CONTROL 権限が拒否されていたとしても、データベース内のすべてのオブジェクトを取得することができます。Granting VIEW DATABASE STATE allows all objects in the database to be returned, regardless of any CONTROL permissions denied on specific objects.

    VIEW DATABASE STATE 権限を拒否すると、特定のオブジェクトに対する CONTROL 権限が許可されていたとしても、そのデータベース内のどのオブジェクトも取得できません。Denying VIEW DATABASE STATE disallows all objects in the database to be returned, regardless of any CONTROL permissions granted on specific objects. ときに、データベースのワイルドカード @database_id= NULL を指定すると、データベースを省略するとします。Also, when the database wildcard @database_id=NULL is specified, the database is omitted.

    詳細については、次を参照してください。動的管理ビューおよび関数(TRANSACT-SQL)します。For more information, see Dynamic Management Views and Functions (Transact-SQL).

使用例Examples

A.A. 指定したテーブルの情報を返すReturning information about a specified table

次の例では、Person.Address テーブルのすべてのインデックスとパーティションについて、サイズと断片化の統計を返します。The following example returns size and fragmentation statistics for all indexes and partitions of the Person.Address table. スキャン モードに設定されて'LIMITED'最適なパフォーマンスと返される統計を制限します。The scan mode is set to 'LIMITED' for best performance and to limit the statistics that are returned. このクエリを実行するには、少なくとも Person.Address テーブルに対する CONTROL 権限が必要です。Executing this query requires, at a minimum, CONTROL permission on the Person.Address table.

DECLARE @db_id SMALLINT;  
DECLARE @object_id INT;  

SET @db_id = DB_ID(N'AdventureWorks2012');  
SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');  

IF @db_id IS NULL  
BEGIN;  
    PRINT N'Invalid database';  
END;  
ELSE IF @object_id IS NULL  
BEGIN;  
    PRINT N'Invalid object';  
END;  
ELSE  
BEGIN;  
    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');  
END;  
GO  

B.B. ヒープに関する情報を返すReturning information about a heap

次の例では、 AdventureWorks2012AdventureWorks2012 データベースのヒープ dbo.DatabaseLog に関するすべての統計を返します。The following example returns all statistics for the heap dbo.DatabaseLog in the AdventureWorks2012AdventureWorks2012 database. 行が返されるテーブルに LOB データが含まれているため、LOB_DATAアロケーション ユニットに返される行に加えて、IN_ROW_ALLOCATION_UNITヒープのデータ ページを格納しています。Because the table contains LOB data, a row is returned for the LOB_DATA allocation unit in addition to the row returned for the IN_ROW_ALLOCATION_UNIT that is storing the data pages of the heap. このクエリを実行するには、少なくとも dbo.DatabaseLog テーブルに対する CONTROL 権限が必要です。Executing this query requires, at a minimum, CONTROL permission on the dbo.DatabaseLog table.

DECLARE @db_id SMALLINT;  
DECLARE @object_id INT;  
SET @db_id = DB_ID(N'AdventureWorks2012');  
SET @object_id = OBJECT_ID(N'AdventureWorks2012.dbo.DatabaseLog');  
IF @object_id IS NULL   
BEGIN;  
    PRINT N'Invalid object';  
END;  
ELSE  
BEGIN;  
    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, 0, NULL , 'DETAILED');  
END;  
GO  

C.C. すべてのデータベースの情報を返すReturning information for all databases

次の例のインスタンス内のすべてのテーブルとインデックスのすべての統計情報を返します SQL ServerSQL Server、ワイルドカードを指定することによってNULLすべてのパラメーター。The following example returns all statistics for all tables and indexes within the instance of SQL ServerSQL Server by specifying the wildcard NULL for all parameters. このクエリを実行するには、VIEW SERVER STATE 権限が必要です。Executing this query requires the VIEW SERVER STATE permission.

SELECT * FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL);  
GO  

D.D. sys.dm_db_index_physical_stats をスクリプトで使用してインデックスを再構築または再構成するUsing sys.dm_db_index_physical_stats in a script to rebuild or reorganize indexes

次の例では、平均断片化が 10% を超えるデータベース内のすべてのパーティションを、自動的に再構成または再構築します。The following example automatically reorganizes or rebuilds all partitions in a database that have an average fragmentation over 10 percent. このクエリを実行するには、VIEW DATABASE STATE 権限が必要です。Executing this query requires the VIEW DATABASE STATE permission. この例では、データベース名を指定せずに DB_ID を 1 番目のパラメーターとして指定しています。This example specifies DB_ID as the first parameter without specifying a database name. 現在のデータベースの互換性レベルが 80 以下になっているとエラーが発生します。An error will be generated if the current database has a compatibility level of 80 or lower. このエラーを解決するには、DB_ID() を有効なデータベース名で置き換えます。To resolve the error, replace DB_ID() with a valid database name. データベース互換性レベルの詳細については、次を参照してください。 ALTER DATABASE 互換性レベル(TRANSACT-SQL)します。For more information about database compatibility levels, see ALTER DATABASE Compatibility Level (Transact-SQL).

-- Ensure a USE <databasename> statement has been executed first.  
SET NOCOUNT ON;  
DECLARE @objectid int;  
DECLARE @indexid int;  
DECLARE @partitioncount bigint;  
DECLARE @schemaname nvarchar(130);   
DECLARE @objectname nvarchar(130);   
DECLARE @indexname nvarchar(130);   
DECLARE @partitionnum bigint;  
DECLARE @partitions bigint;  
DECLARE @frag float;  
DECLARE @command nvarchar(4000);   
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function   
-- and convert object and index IDs to names.  
SELECT  
    object_id AS objectid,  
    index_id AS indexid,  
    partition_number AS partitionnum,  
    avg_fragmentation_in_percent AS frag  
INTO #work_to_do  
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')  
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;  

-- Declare the cursor for the list of partitions to be processed.  
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;  

-- Open the cursor.  
OPEN partitions;  

-- Loop through the partitions.  
WHILE (1=1)  
    BEGIN;  
        FETCH NEXT  
           FROM partitions  
           INTO @objectid, @indexid, @partitionnum, @frag;  
        IF @@FETCH_STATUS < 0 BREAK;  
        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)  
        FROM sys.objects AS o  
        JOIN sys.schemas as s ON s.schema_id = o.schema_id  
        WHERE o.object_id = @objectid;  
        SELECT @indexname = QUOTENAME(name)  
        FROM sys.indexes  
        WHERE  object_id = @objectid AND index_id = @indexid;  
        SELECT @partitioncount = count (*)  
        FROM sys.partitions  
        WHERE object_id = @objectid AND index_id = @indexid;  

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.  
        IF @frag < 30.0  
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';  
        IF @frag >= 30.0  
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';  
        IF @partitioncount > 1  
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));  
        EXEC (@command);  
        PRINT N'Executed: ' + @command;  
    END;  

-- Close and deallocate the cursor.  
CLOSE partitions;  
DEALLOCATE partitions;  

-- Drop the temporary table.  
DROP TABLE #work_to_do;  
GO  

E.E. sys.dm_db_index_physical_stats を使用して、ページ圧縮されたページの数を表示するUsing sys.dm_db_index_physical_stats to show the number of page-compressed pages

次の例では、行とページが圧縮されているページと、ページ数の合計とを対比して表示します。The following example shows how to display and compare the total number of pages against the pages that are row and page compressed. この情報を使用して、インデックスまたはテーブルに対して圧縮がどの程度貢献しているかを調べることができます。This information can be used to determine the benefit that compression is providing for an index or table.

SELECT o.name,  
    ips.partition_number,  
    ips.index_type_desc,  
    ips.record_count, ips.avg_record_size_in_bytes,  
    ips.min_record_size_in_bytes,  
    ips.max_record_size_in_bytes,  
    ips.page_count, ips.compressed_page_count  
FROM sys.dm_db_index_physical_stats ( DB_ID(), NULL, NULL, NULL, 'DETAILED') ips  
JOIN sys.objects o on o.object_id = ips.object_id  
ORDER BY record_count DESC;  

F.F. SAMPLED モードで sys.dm_db_index_physical_stats を使用するUsing sys.dm_db_index_physical_stats in SAMPLED mode

次の例では、SAMPLED モードで返される概算値が DETAILED モードの結果とどのように異なるのかを示します。The following example shows how SAMPLED mode returns an approximate that is different than the DETAILED mode results.

CREATE TABLE t3 (col1 int PRIMARY KEY, col2 varchar(500)) WITH(DATA_COMPRESSION = PAGE);  
GO  
BEGIN TRAN  
DECLARE @idx int = 0;  
WHILE @idx < 1000000  
BEGIN  
    INSERT INTO t3 (col1, col2)   
    VALUES (@idx,   
    REPLICATE ('a', 100) + CAST (@idx as varchar(10)) + REPLICATE ('a', 380))  
    SET @idx = @idx + 1  
END  
COMMIT;  
GO  
SELECT page_count, compressed_page_count, forwarded_record_count, *   
FROM sys.dm_db_index_physical_stats (db_id(),   
    object_id ('t3'), null, null, 'SAMPLED');  
SELECT page_count, compressed_page_count, forwarded_record_count, *   
FROM sys.dm_db_index_physical_stats (db_id(),   
    object_id ('t3'), null, null, 'DETAILED');  

G.G. インデックスの断片化の service broker キューのクエリを実行します。Querying service broker queues for index fragmentation

||
|-|
|適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL ServerSQL ServerApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server.|

次の例では、server broker のキューの断片化を照会する方法を示します。The following examples shows how to query server broker queues for fragmentation.

--Using queue internal table name   
select * from sys.dm_db_index_physical_stats (db_id(), object_id ('sys.queue_messages_549576996'), default, default, default)   

--Using queue name directly  
select * from sys.dm_db_index_physical_stats (db_id(), object_id ('ExpenseQueue'), default, default, default)  

参照See Also

動的管理ビューと動的管理関数 (Transact-SQL) Dynamic Management Views and Functions (Transact-SQL)
インデックス関連の動的管理ビューおよび関数 (Transact-SQL) Index Related Dynamic Management Views and Functions (Transact-SQL)
sys.dm_db_index_operational_stats (Transact-SQL) sys.dm_db_index_operational_stats (Transact-SQL)
sys.dm_db_index_usage_stats (TRANSACT-SQL) sys.dm_db_index_usage_stats (Transact-SQL)
sys.dm_db_partition_stats (TRANSACT-SQL) sys.dm_db_partition_stats (Transact-SQL)
sys.allocation_units (TRANSACT-SQL) sys.allocation_units (Transact-SQL)
システム ビュー (TRANSACT-SQL)System Views (Transact-SQL)