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 아니요병렬 데이터 웨어하우스 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-트리의 각 수준에 대해 행이 반환됩니다.For an index, one row is returned for each level of the B-tree in each partition. 힙의 경우 각 파티션의 IN_ROW_DATA 할당 단위에 대해 행이 반환됩니다.For a heap, one row is returned for the IN_ROW_DATA allocation unit of each partition. LOB(Large Object) 데이터의 경우 각 파티션의 LOB_DATA 할당 단위에 대해 행이 반환됩니다.For large object (LOB) data, one row is returned for the LOB_DATA allocation unit of each partition. 테이블에 행-오버플로 데이터가 있는 경우 각 파티션의 ROW_OVERFLOW_DATA 할당 단위에 대해 행이 반환됩니다.If row-overflow data exists in the table, one row is returned for the ROW_OVERFLOW_DATA allocation unit in each partition. xVelocity 메모리 액세스에 최적화된 columnstore 인덱스에 대한 정보를 반환하지 않습니다.Does not return information about xVelocity memory optimized columnstore indexes.

중요

쿼리 하는 경우 sys.dm_db_index_physical_stats Always On을 호스팅하는 서버 인스턴스에서 읽기 가능한 보조 복제본, REDO 차단 문제가 발생할 수 있습니다.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 잠금을 획득하여 REDO 스레드에서의 해당 사용자 테이블 또는 뷰에 대한 X 잠금 요청이 차단되기 때문입니다.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 (TRANSACT-SQL)합니다.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_id, index_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 및 DEFAULT는 동등한 값이 있습니다.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 | 기본값partition_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.

모드 | NULL | 기본값mode | 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 DescriptionDescription
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 매핑 인덱스 (내부)COLUMNSTORE MAPPING INDEX (internal)

COLUMNSTORE DELETEBUFFER 인덱스 (내부)COLUMNSTORE DELETEBUFFER INDEX (internal)

COLUMNSTORE DELETEBITMAP 인덱스 (내부)COLUMNSTORE DELETEBITMAP INDEX (internal)
hobt_idhobt_id bigintbigint 힙 또는 B-트리 ID 파티션 또는 인덱스입니다.Heap or B-Tree ID of the index or partition.

사용자 정의 인덱스 hobt_id, 반환할 뿐 아니라 내부 columnstore 인덱스의 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_ variant 행 외부로 밀어낸입니다.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.

리프가 아닌 인덱스 수준은 해도 처리 모드 = DETAILED입니다.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. 이것은 한 행에 여러 레코드가 있기 때문입니다.This is because a row may contain multiple records. 예를 들어 특정 업데이트 상황에서 업데이트 작업으로 인해 단일 힙 행에 한 개의 전달되고 있는 레코드와 한 개의 전달된 레코드가 있을 수 있습니다.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.

힙의 경우 새로 할당된 페이지는 PAGE 압축되지 않습니다.For heaps, newly allocated pages are not PAGE compressed. 힙은 데이터를 대량으로 가져오거나 힙을 다시 작성하는 경우의 두 가지 특별한 조건에서 PAGE 압축됩니다.A heap is PAGE compressed under two special conditions: when data is bulk imported or when a heap is rebuilt. 일반적으로 페이지 할당을 발생시키는 DML 작업은 PAGE 압축되지 않습니다.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 값은 PAGE 압축의 효율성을 나타냅니다.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 Database.Applies to: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) through current version), Azure SQL 데이터베이스Azure SQL Database.

Columnstore 인덱스에 대 한 파티션에 대 한 내부 columnstore 데이터를 추적 하는 행 집합에 대 한 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. 부모 columnstore 인덱스와 동일한 인덱스 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 Database.Applies 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 = 열기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 Database.Applies to: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) through current version), Azure SQL 데이터베이스Azure SQL Database.

NOT_APPLICABLE – 부모 인덱스는 columnstore 인덱스가 아닙니다.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 – 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 또는 DETAILED로 지정 됩니다.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. Compressed_page_count에 대 한 예상된 값을 가져오려면 SAMPLED 모드를 사용 하 고 compressed_page_count에 대 한 실제 값을 가져오려면 DETAILED 모드를 사용 합니다.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에서 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. 이 모드가 가장 빠르게 실행되며 인덱스의 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를 사용 하는 경우 세 부분으로 된 이름을 같은 지정 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. 뒤에 나오는 예 1과 2에서는 데이터베이스와 개체 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

인덱스의 조각화가 쿼리 성능에 영향을 미치는 경우 다음 세 방법 중 하나를 사용하여 조각화를 줄일 수 있습니다.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 웹 사이트합니다.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.

주의

테이블에서 클러스터형 인덱스를 만들고 삭제하면 해당 테이블에서 모든 비클러스터형 인덱스가 두 번 다시 작성됩니다.Creating and dropping a clustered index on a table, rebuilds all non-clustered indexes on that table twice.

LOB 데이터 압축Compacting Large Object Data

기본적으로 ALTER INDEX REORGANIZE 문은 LOB(Large Object) 데이터가 들어 있는 페이지를 압축합니다.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. 채우기 비율에 대 한 자세한 내용은 참조 인덱스의 채우기 비율 지정합니다.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. 인덱스에는 적어도 하나의 조각이 있습니다.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

클러스터형 columnstore 인덱스에 데이터를 반환하지 않습니다.Does not return data for clustered columnstore indexes.

PermissionsPermissions

다음 사용 권한이 필요합니다.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

1.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  

2.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  

3.C. 모든 데이터베이스에 대한 정보 반환Returning information for all databases

다음 예에서는 모든 매개 변수에 와일드카드인 NULL을 지정하여 SQL ServerSQL Server 인스턴스 내의 모든 테이블과 인덱스에 대한 모든 통계를 반환합니다.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  

4.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를 첫 번째 매개 변수로 지정합니다.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  

5.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;  

6.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');  

7.G. 인덱스 조각화에 대 한 service broker 큐 쿼리Querying service broker queues for index fragmentation

||
|-|
|적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x) 부터 SQL ServerSQL Server까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL ServerSQL Server.|

다음 예에서는 서버 브로커 큐의 조각화 정도 쿼리 하는 방법을 보여 줍니다.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)