테이블 및 인덱스 구성
테이블과 인덱스는 8KB 페이지의 컬렉션으로 저장됩니다. 이 항목에서는 테이블 페이지 및 인덱스 페이지가 구성되는 방법을 설명합니다.
테이블 구성
다음 그림에서는 테이블의 구성을 보여 줍니다. 테이블은 하나 이상의 파티션에 포함되어 있으며 각 파티션에는 데이터 행이 힙 또는 클러스터형 인덱스 구조로 포함되어 있습니다. 힙 또는 클러스터형 인덱스 페이지는 데이터 행의 열 유형에 따라 하나 이상의 할당 단위로 관리됩니다.
파티션
테이블 및 인덱스 페이지는 하나 이상의 파티션에 포함되어 있습니다. 파티션은 사용자 정의된 데이터 구성 단위입니다. 기본적으로 테이블이나 인덱스는 모든 테이블 또는 인덱스 페이지가 포함된 하나의 파티션을 갖습니다. 파티션은 단일 파일 그룹에 포함되어 있습니다. 단일 파티션으로 구성된 테이블이나 인덱스는 이전 버전의 SQL Server에서 테이블 및 인덱스가 구성되는 구조와 동일합니다.
테이블 또는 인덱스에 파티션이 여러 개 사용되면 지정된 열을 기준으로 행 그룹이 개별 파티션에 매핑되도록 데이터가 행 분할됩니다. 이러한 파티션은 데이터베이스에 있는 하나 이상의 파일 그룹에 포함될 수 있습니다. 데이터에서 쿼리나 업데이트가 수행되면 테이블이나 인덱스는 단일 논리적 엔터티로 처리됩니다. 자세한 내용은 분할된 테이블 및 인덱스를 참조하십시오.
테이블 또는 인덱스에 사용되는 파티션을 보려면 sys.partitions(Transact-SQL) 카탈로그 뷰를 사용합니다.
클러스터형 테이블, 힙 및 인덱스
SQL Server 테이블은 다음 두 가지 방법 중 하나를 사용하여 파티션 내에 있는 데이터 페이지를 구성합니다.
클러스터형 테이블은 클러스터형 인덱스를 갖고 있는 테이블입니다.
데이터 행은 클러스터형 인덱스 키에 기반한 순서대로 저장됩니다. 클러스터형 인덱스는 클러스터형 인덱스 키 값에 기반하여 행의 빠른 검색을 지원하는 B-트리 인덱스 구조로 구현됩니다. 리프 수준의 데이터 페이지를 포함하여 각 인덱스 수준에 있는 페이지는 이중 연결 목록으로 연결됩니다. 그러나 한 수준에서 다른 수준으로 이동하는 경우에는 키 값을 사용합니다. 자세한 내용은 클러스터형 인덱스 구조를 참조하십시오.
힙은 클러스터형 인덱스가 없는 테이블입니다.
데이터 행은 특정한 순서로 저장되지 않으며 데이터 페이지 시퀀스에 대한 특별한 순서는 없습니다. 데이터 페이지는 연결 목록으로 연결되지 않습니다. 자세한 내용은 힙 구조를 참조하십시오.
인덱싱된 뷰는 클러스터형 테이블과 동일한 저장소 구조를 갖습니다.
힙 또는 클러스터형 테이블의 파티션이 여러 개인 경우 각 파티션에는 해당 파티션의 행 그룹이 포함된 힙 또는 B-트리 구조가 있습니다. 예를 들어 클러스터형 테이블의 파티션이 4개인 경우 파티션별로 한 개씩 총 4개의 B-트리가 있습니다.
비클러스터형 인덱스
비클러스터형 인덱스는 클러스터형 인덱스의 구조와 유사한 B-트리 인덱스 구조를 갖습니다. 차이점은 비클러스터형 인덱스가 데이터 행의 순서에 영향을 주지 않는다는 것입니다. 리프 수준에는 인덱스 행이 포함되어 있습니다. 각 인덱스 행에는 비클러스터형 키 값, 행 로케이터 및 포괄 열이나 키가 아닌 열이 포함됩니다. 로케이터는 키 값이 있는 데이터 행을 가리킵니다. 자세한 내용은 비클러스터형 인덱스 구조를 참조하십시오.
XML 인덱스
테이블의 각 xml 열에는 기본 XML 인덱스 하나와 보조 XML 인덱스 여러 개를 만들 수 있습니다. XML 인덱스는 xml 데이터 형식 열의 XML BLOB(Binary Large Object)를 영구적인 단편 형태로 표현한 것입니다. XML 인덱스는 내부 테이블로 저장됩니다. XML 인덱스 정보를 보려면 sys.xml_indexes 또는 sys.internal_tables 카탈로그 뷰를 사용합니다.
XML 인덱스에 대한 자세한 내용은 XML 데이터 형식 열의 인덱스를 참조하십시오.
할당 단위
할당 단위는 힙 또는 B-트리 내에서 해당 페이지 유형에 따라 데이터를 관리하는 데 사용되는 페이지 컬렉션입니다. 다음 표에서는 테이블 및 인덱스 데이터를 관리하는 데 사용되는 할당 단위 유형을 나열합니다.
할당 단위 유형 |
다음을 관리하는 데 사용 |
---|---|
IN_ROW_DATA |
LOB(Large Object) 데이터를 제외한 모든 데이터가 포함되어 있는 데이터 또는 인덱스 행 페이지는 데이터 또는 인덱스 유형입니다. |
LOB_DATA |
하나 이상의 다음 데이터 형식으로 저장된 큰 개체 데이터: text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) 또는 CLR UDT(CLR 사용자 정의 유형) 페이지는 텍스트 또는 이미지 유형입니다. |
ROW_OVERFLOW_DATA |
8,060바이트 행 크기 제한을 초과하는 varchar, nvarchar, varbinary 또는 sql_variant 열에 저장된 가변 길이 데이터 페이지는 텍스트 또는 이미지 유형입니다. |
페이지 유형에 대한 자세한 내용은 페이지 및 익스텐트 이해를 참조하십시오.
힙 또는 B-트리는 특정 파티션에서 각 유형별로 하나의 할당 단위만 가질 수 있습니다. 테이블 또는 인덱스 할당 단위 정보를 보려면 sys.allocation_units 카탈로그 뷰를 사용합니다.
IN_ROW_DATA 할당 단위
테이블(힙 또는 클러스터형 테이블), 인덱스 또는 인덱싱된 뷰에 사용되는 모든 파티션에는 데이터 페이지 컬렉션으로 구성된 하나의 IN_ROW_DATA 할당 단위가 있습니다. 이 할당 단위에는 테이블 또는 뷰에 대해 정의된 각각의 비클러스터형 인덱스 및 XML 인덱스를 구현하기 위한 추가 페이지 컬렉션도 포함되어 있습니다. 테이블, 인덱스 또는 인덱싱된 뷰의 각 파티션에 있는 페이지 컬렉션은 sys.system_internals_allocation_units 시스템 뷰의 페이지 포인터로 고정됩니다.
중요 |
---|
sys.system_internals_allocation_units 시스템 뷰는 MicrosoftSQL Server 내부 전용으로 예약되었습니다. 향후 호환성은 보장되지 않습니다. |
각 테이블, 인덱스 및 인덱싱된 뷰 파티션은 sys.system_internals_allocation_units에서 컨테이너 ID(container_id)로 고유하게 식별되는 행을 갖습니다. 컨테이너 ID는 sys.partitions 카탈로그 뷰에서 파티션에 저장된 테이블, 인덱스 또는 인덱싱된 뷰 데이터와 파티션 내에서 데이터를 관리하는 데 사용되는 할당 단위 간의 관계를 유지 관리하는 partition_id에 일 대 일로 매핑됩니다.
테이블, 인덱스 또는 인덱싱된 뷰 파티션에 대한 페이지 할당은 IAM 페이지의 체인으로 관리됩니다. sys.system_internals_allocation_units의 first_iam_page 열은 IN_ROW_DATA 할당 단위로 테이블, 인덱스 또는 인덱싱된 뷰에 할당된 공간을 관리하는 IAM 페이지의 체인에 있는 첫 번째 IAM 페이지를 가리킵니다.
sys.partitions는 테이블 또는 인덱스의 각 파티션에 대해 행을 반환합니다.
힙은 sys.partitions에서 index_id = 0인 행을 갖습니다.
sys.system_internals_allocation_units의 first_iam_page 열은 지정된 파티션에 있는 힙 데이터 페이지 컬렉션에 대한 IAM 체인을 가리킵니다. 데이터 페이지 컬렉션에 있는 페이지가 연결되어 있지 않으므로 서버는 IAM 페이지를 사용하여 페이지를 찾습니다.
테이블 또는 뷰의 클러스터형 인덱스는 sys.partitions에서 index_id = 1인 행을 갖습니다.
sys.system_internals_allocation_units의 root_page 열은 지정된 파티션에 있는 클러스터형 인덱스 B-트리의 맨 위를 가리킵니다. 서버는 인덱스 B-트리를 사용하여 파티션에서 데이터 페이지를 찾습니다.
테이블 또는 뷰에 대해 생성된 각 비클러스터형 인덱스는 sys.partitions에서 index_id > 1인 행을 갖습니다.
sys.system_internals_allocation_units의 root_page 열은 지정된 파티션에 있는 비클러스터형 인덱스 B-트리의 맨 위를 가리킵니다.
LOB 열이 하나 이상 있는 각 테이블도 sys.partitions에서 index_id > 250인 행을 갖습니다.
first_iam_page 열은 LOB_DATA 할당 단위로 페이지를 관리하는 IAM 페이지의 체인을 가리킵니다.
ROW_OVERFLOW_DATA 할당 단위
테이블(힙 또는 클러스터형 테이블), 인덱스 또는 인덱싱된 뷰에 사용되는 모든 파티션에는 하나의 ROW_OVERFLOW_DATA 할당 단위가 있습니다. IN_ROW_DATA 할당 단위의 가변 길이 열(varchar, nvarchar, varbinary 또는 sql_variant)이 포함된 데이터 행이 8KB 행 크기 제한을 초과할 때까지 이 할당 단위에는 페이지가 포함되지 않습니다. 크기 제한에 도달하는 경우 SQL Server에서는 해당 행에서 폭이 가장 넓은 열을 ROW_OVERFLOW_DATA 할당 단위의 페이지로 이동합니다. 이 행 외부 데이터에 대한 24바이트 포인터는 원래 페이지에 유지됩니다.
ROW_OVERFLOW_DATA 할당 단위의 텍스트/이미지 페이지는 LOB_DATA 할당 단위의 페이지와 동일한 방법으로 관리됩니다. 즉, 텍스트/이미지 페이지는 IAM 페이지의 체인에 의해 관리됩니다.
LOB_DATA 할당 단위
테이블 또는 인덱스에 LOB 데이터 형식이 하나 이상 있으면 해당 데이터의 저장소를 관리하기 위해 파티션마다 LOB_DATA 할당 단위가 하나씩 할당됩니다. LOB 데이터 형식으로는 text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) 및 CLR 사용자 정의 유형 등이 있습니다.
파티션 및 할당 단위 예
다음 예에서는 LOB 데이터는 있고 비클러스터형 인덱스는 없는 힙인 DatabaseLog 테이블과 LOB 데이터는 없고 비클러스터형 인덱스가 하나 있는 클러스터형 테이블인 Currency 테이블에 대해 파티션과 할당 단위를 반환합니다. 두 테이블 모두 단일 파티션으로 구성되어 있습니다.
USE AdventureWorks;
GO
SELECT o.name AS table_name,p.index_id, i.name AS index_name , au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.objects AS o ON p.object_id = o.object_id
JOIN sys.indexes AS i ON p.index_id = i.index_id AND i.object_id = p.object_id
WHERE o.name = N'DatabaseLog' OR o.name = N'Currency'
ORDER BY o.name, p.index_id;
결과 집합은 다음과 같습니다. DatabaseLog 테이블에는 데이터 및 텍스트/이미지 페이지 유형이 모두 포함되어 있기 때문에 세 가지 할당 단위 유형이 모두 사용됩니다. Currency 테이블에는 LOB 데이터가 없지만 데이터 페이지 관리에 필요한 할당 단위가 있습니다. Currency 테이블이 나중에 LOB 데이터 형식 열을 포함하도록 수정되면 해당 데이터를 관리하기 위해 LOB_DATA 할당 단위가 생성됩니다.
table_name index_id index_name allocation_type data_pages partition_number
----------- -------- ----------------------- --------------- ----------- ------------
Currency 1 PK_Currency_CurrencyCode IN_ROW_DATA 1 1
Currency 3 AK_Currency_Name IN_ROW_DATA 1 1
DatabaseLog 0 NULL IN_ROW_DATA 160 1
DatabaseLog 0 NULL ROW_OVERFLOW_DATA 0 1
DatabaseLog 0 NULL LOB_DATA 49 1
(5 row(s) affected)