데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

SQL Server 테이블 및 인덱스 구조 아키텍처(3/4)

– 클러스터형 인덱스 구조

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

SQL Server에서 인덱스는 B-tree로 구성 된다. 인덱스 B-tree의 각 페이지를 인덱스 노드라고 한다. B-tree 맨 상위의 노드를 루트노드(root)라고 하며 최하위 노드를 리프노드(leaf)라고 한다. 루프노드와 리프노드 사이를 통틀어 중간노드(Non leaf)라고 한다.

 

 

클러스터형 인덱스의 리프노드에는 기본테이블의 데이터 페이지가 있다. 루트노드와 중간수준 노드에서는 인덱스 행을 포함하는 인덱스페이지가 있다. 각 인덱스 행에는 키 값과 함께 B-tree의 중간 수준 페이지에 대한 포인터나 인덱스 리프 수준의 데이터 행에 대한 포힌터가 있다. 인덱스의 페이지는 이중 연결 리스트로 연결 되어 있다.

 

 

 

클러스터형 인덱스에는 인덱스에서 사용하는 각 파티션에 대해 index_id = 1인 sys.partitions 행이 있다. 기본적으로 클러스터형 인덱스는 단일 파티션을 사용한다. 클러스터형 인덱스가 다중 파티션을 사용하는 경우 각 파티션은 해당 특정 파티션에 대한 데이터를 포함하는 B-tree구조를 갖는다. 예를들어 4개의 파티션을 사용하면 각 파티션당 하나씩 총 4개의 B-tree구조가 있다.

select * from sys.partitions where index_id = 1

 

 

 

클러스터형 인덱스의 데이터 형식에 따라 각 클러스터형 인덱스 구조에는 특정 파티션에 대한 데이터를 저장하고 관리하는 할당 단위가 하나 이상 있다. 최소한 각 클러스터형 인덱스에는 파티션당 하나의 IN_ROW_DATA 할당 단위가 있다. 또한 클러스터형 인덱스에는 LOB(Large Object)열이 포함된 경우 하나의 파티션당 하나의 LOB_DATA 할당 단위가 있다. 8060바이트 행 크기 제한을 초과하는 가변 길이 열이 포함된 경우 파티션당 하나의 ROW_OVERFLOW_DATA 할당 단위도 있다.

 

데이터 체인의 페이지와 페이지 행은 클러스터 인덱스 키 값에 따라 정렬된다. 데이터가 삽입 될때 정렬되어 들어 간다. B-tree에 대한 페이지 컬렉션은 sys.system_internals_allocation_unit 시스템 뷰의 페이지 포인터로 고정 된다.

select * from sys.system_internals_allocation_units

 

 

 

클러스터형 인덱스의 경우 sys.system_internals_allocation_unit의 root_page열은 특정 파티션에 대한 클러스터형 인덱스의 맨 위를 가리킨다. SQL Server는 인덱스를 탐색하여 범위 시작의 키 값을 찾은 후 이전 또는 다음 포인터를 사용하여 페이지를 검색 한다. 데이터 페이지 체인에서 첫 페이지를 찾을 경우 SQL Server는 루트노드부터 왼쪽의 포인터를 찾는다.

 

 

[참고자료]

http://msdn.microsoft.com/ko-kr/library/ms177443(v=sql.105).aspx

http://www.sqlservercentral.com/articles/Indexing/68563/

http://librairie.immateriel.fr/fr/read_book/9780735623132/ch03s04#clustered_tablesolidusindex

http://www.sqlservercentral.com/articles/Indexing/68439/

 

 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
1771 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (4/4) – 분산형 분할 뷰(View) 확인 jevida(강성욱) 2016.09.27 1337
1770 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (3/4) – 뷰(View)의 인덱스 확인 jevida(강성욱) 2016.09.27 973
1769 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (2/4) – 뷰(View) 확인 jevida(강성욱) 2016.09.27 1447
1768 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (1/4) – SQL 문 최적화 및 Worktables jevida(강성욱) 2016.09.27 933
1767 SQL Server DMV를 이용한 통계 정보 확인 jevida(강성욱) 2016.09.27 1487
1766 DMV를 이용한 플랜 캐시 사용 정보 확인 jevida(강성욱) 2016.09.27 1172
1765 SQL Server 테이블 및 인덱스 구조 아키텍처(4/4) – 비클러스터형 인덱스 구조 jevida(강성욱) 2016.09.27 1066
» SQL Server 테이블 및 인덱스 구조 아키텍처(3/4) – 클러스터형 인덱스 구조 jevida(강성욱) 2016.09.27 1370
1763 SQL Server 테이블 및 인덱스 구조 아키텍처(2/4) – 힙 구조 jevida(강성욱) 2016.09.27 1069
1762 SQL Server 테이블 및 인덱스 구조 아키텍처(1/4) – 테이블 및 인덱스 구성 jevida(강성욱) 2016.09.27 1127
1761 SQL Server 트랜잭션 로그 아키텍처(4/4) – 미리 쓰기 트랜잭션 로그 jevida(강성욱) 2016.09.27 1537
1760 SQL Server 트랜잭션 로그 아키텍처(3/4) – 검사점 및 로그의 활성 부분 jevida(강성욱) 2016.09.27 1048
1759 SQL Server 트랜잭션 로그 아키텍처(2/4) – 트랜잭션 로그 물리 아키텍처 jevida(강성욱) 2016.09.27 1096
1758 SQL Server 트랜잭션 로그 아키텍처(1/4) – 트랜잭션 로그 논리 아키텍처 jevida(강성욱) 2016.09.27 1254
1757 파일 및 파일 그룹 아키텍처 jevida(강성욱) 2016.09.27 801
1756 SQL Server 페이지 및 익스텐트 아키텍처(4/4) – 수정된 익스텐트 추적 jevida(강성욱) 2016.09.27 1130
1755 SQL Server 페이지 및 익스텐트 아키텍처(3/4) – 개체에서 사용하는 공간 관리 jevida(강성욱) 2016.09.27 975
1754 SQL Server 페이지 및 익스텐트 아키텍처(2/4) – 익스텐트 할당 및 빈공간 관리 jevida(강성욱) 2016.09.27 1457
1753 SQL Server 페이지 및 익스텐트 아키텍처(1/4) – 페이지 및 익스텐트 이해 jevida(강성욱) 2016.09.27 3317
1752 SQL Server Error Log 보관 주기 설정 jevida(강성욱) 2016.09.15 2184





XE Login