Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  데이터 파일은 어떻게 생겼을까? 
작성일시 : 2008. 1. 18. 18:07 | 분류 : SQL Server/Kernel

<출처 : Inside Microsoft SQL Server 2000
Windows Internals 와 비교해서 꽤 해석이 원활하게 되어 있습니다. 강추 드립니다...^______^!
SQL 2005버젼에서 변경된 내용을 동시에 이야기해 드릴 생각입니다.
DB 공부하기 1번째 : 선언적 데이터 무결성(Declarative Data Integrity) (http://maystyle.tistory.com/218)
DB 공부하기 2번째 : 트랜잭션 프로세싱 (http://maystyle.tistory.com/219)
DB 공부하기 3번째 : 데이터 파일과 트랜젝션 로그 파일
1. 왜 DB의 단편화가 일어나는 걸까? (http://maystyle.tistory.com/220)
2. 데이터 파일은 어떻게 쓰여질까? (Checkpoint) (http://maystyle.tistory.com/221)
3. 로그는 어떻게 쓰여질까? (http://maystyle.tistory.com/223)
4. 트랜잭션 로그의 기록과 복구 (http://maystyle.tistory.com/225)
5. 데이터 파일이 커질 때는 무슨일이 일어날까? (http://maystyle.tistory.com/231)
6. 데이터 파일은 어떻게 생겼을까?

데이터 파일의 구조는 각 8K 단위의 페이지로 이루어져 있다. 그리고 5번째 페이지 (4번 페이지) 부터 사용자 데이터가 입력되어, 4G 될때까지 데이터가 저장되고 다시 GAM 페이지와 SGAM 페이지가 저장되고 다시 사용자 데이터가 저장되는 순으로 저장되게 된다.

                                                                                                                    데이터 파일 구조

데이터베이스 파일의 기본 단위는 페이지(8KB)다. 이 공간은 익스텐트(extent)라고 불리는 단위로 관리된다. 한 익스텐트는 연속된 8개의 페이지(64KB)들로 구성되어 있다. SQL Server는 좀더 효율적인 공간 할당을 위해 작은 양의 데이터를 갖고 있는 테이블에 익스텐트 전체를 할당하지 않는다. SQL Server는 두 가지 유형의 익스텐트를 갖고 있다.
- 균일 익스텐트 : 한 개체만이 이것들을 소유한다. 익스텐트에 있는 8개의 페이지들은 소유하고 있는 개체에 의해서만 사용될 수 있다.
- 혼합 익스텐트 : 여러 개체들에 의해 공유 될 수 있다. (8 개체까지 공유할 수 있다.)

SQL Server는 혼합 익스텐트에서 새 테이블이나 익덱스를 위한 페이지들을 할당한다. 테이블이나 인덱스가 8페이지로 성장할때, 앞으로 이루어지는 모든 할당은 균일 익스텐트를 사용한다.

테이블이나 인덱스가 더 많은 공간을 필요로 할 때 SQL Server 는 할당될 수 있는 공간을 찾을 필요가 있다. 테이블이나 인덱스가 여전히 8페이지 보다 작으면 SQL Server가 여유 공간이 있는 혼합 익스텐트를 찾아야 한다. 테이블이나 인덱스가 8페이지이거나 이보다 크면 SQL Server가 균일 익스텐트를 찾아야 한다.

SQL Server는 어떤 익스텐트들이 할당되었고 이것들이 어떤 유형으로 사용되고 있는지를 기록하기 위해 특별한 두 가지 유형의 페이지들을 사용한다.
- 전역 할당 맵(GAM) 페이지 : 이 페이지는 어떤 익스텐트가 어떤 유형으로 사용되기 위해 할당되었는지를 기록한다. GAM은 각 익스텐트에 대해 비트 값을 갖고 있다. 이 비트가 0이면 대응하는 익스텐트가 사용중이고, 1이면 익스텐트가 사용중이지 않다. 페이지에서 헤더나 다른 오버헤드 뒤에 거의 8000바이트(64000비트)가 있기 때문에 각 GAM은 약 64,000 익스텐트(4GB)를 처리 할 수 있다.
- 공유 전역 할당 맵(SGAM) 페이지 : 이 페이지는 어떤 익스텐트들이 현재 혼합 익스텐트로 사용되고 있고 적어도 한 개의 사용되지 않는 페이지를 갖고 있는지 기록한다. GAM처럼 각 SGAM들도 약 64,000개의 익스텐트를 다룬다. SGAM은 각 익스텐트에 대한 비트를 갖고 있다. 이 비트가 1이면 익스텐트가 혼합 익스텐트로 사용되고 있고 여유 페이지를 갖고 있다. 0이면 익스텐트가 혼합 익스텐트로 사용되지 않거나, 모든 페이지들이 사용중인 혼합 익스텐트다.

SQL Server가 전혀 사용되지 않은 새 익스텐트를 찾을 필요가 있으면 GAM 페이지에서 비트 값 1을 가진 익스텐트를 사용할 수 있다. 여유 공간이 있는 혼합 익스텐트를 찾을 필요가 있으면 GAM 값이 0이고 SGAM 값이 1인 익스텐트를 찾는다.

GAM이 항상 데이터베이스 파일에서 세변째 페이지이기 때문에 (0, 1, 2 <--) SQL Server가 파일에서 GAM을 빠르게 찾을 수 있다. SGAM은 4번째 페이지이다. (0, 1, 2, 3 <--) 2번 페이지에 있는 첫번째  GAM 이후에 511,230 페이지마다 GAM이 나오고, 3번 페이지에 있는 첫번째 SGAM 이후에 511,230 페이지 마다 SGAM이 나온다. 파일에 있는 0번 페이지는 "파일 헤더" 페이지이고, 파일마다 파일 헤더 페이지가 한 개만 존재한다. 1번 페이지는 "페이지 여유 공간(PFS)" 페이지다.

인덱스 할당 맵(IAM) 페이지는 힙이나 인덱스에 의해 사용되는 데이터베이스 파일의 익스텐트를 매핑한다. (힙은 클러스터된 인덱스가 없는 테이블이다.) 힙이나 인덱스는 개체에 할당된 모든 익스텐트들을 기록하는 한개 이상의 IAM 페이지를 갖고 있다. 힙이나 인덱스는 익스텐트를 갖고 있는 각 파일 마다 적어도 한개의 IAM을 갖고 있다. 익스텐트 범위가 IAM이 기록할 수 있는 범위를 넘어서면 힙이나 인덱스는 파일에서 여러 개의 IAM을 가질 수 있다.

IAM는 작은 헤더와 8개의 페이지 포인터 슬롯과 익스텐트 범위를 파일로 매핑하는 비트들을 갖고 있다. 해더는 IAM에 의해 매핑되는 범위에 있는 첫번째 익스텐트의 주소를 갖고 있다. 8개의 페이지 포인터 슬롯은 관련 개체들에 속해 있고 혼합 익스텐트에 들어 있는 페이지들에 대한 포인터를 갖고 있다. 개체에 대한 첫번째  IAM만이 이 포인터들을 갖고 있따. 일단 개체가 9개 이상의 페이지를 차지하면 모든 익스텐트들이 균일 익스텐트이다. 즉, 개체가 혼합 익스텐트에 있는 페이지들을 가르키는 9개 이상의 포인터들을 결코 필요로 하지 않을 것이다. 테이블에서 행들이 삭제되면 테이블이 실제로 8개 미만의 포인터들을 사용할 수 있다. 익스텐트가 IAM을 소유하고 있는 개체에 할당되든지 그렇지 않든 간에, 비트맵의 각 비트들은 범위에 있는 익스텐트를 나타낸다. 비트가 OFF이면 관련 익스텐트가 IAM을 소유하고 있는 개체에 할당되지 않는다. 예를 들어 IAM의 첫번째 바이트에 있는 비트 패턴이 1100 0000이면 IAM의 범위에 있는 첫번째 익스텐트와 두번째 익스텐트가 IAM을 소유하고 있는 개체에 할당되고, 3~8번은 IAM을 소유하고 있는 개체에 할당되지 않는다.

IAM 페이지는 필요할 때 각 개체에 할당되고, 데이터베이스 파일에 무작위로 위치한다. 각 IAM들이 처리할 수 있는 범위는 약  512,000페이지 이다. Sysindexs.FirstIAM은 개체에 대한 첫번째 IAM 페이지를 가리킨다. 이 개체에 대한 모든 IAM 페이지들은 체인으로 연결되어 있다.(IAM은 논리적 연결만 가지고 있다.)

일단 익스텐트가 개체에 할당되면 SQL Server가 새 데이터를 삽입하기 위해 이 익스텐트에 있는 페이지들을 사용할 수있다. 데이터가 B 트리에 삽입되게 되어 있다면 새 데이터의 위치는 B 트리 내의 정렬 순서에 의해 결정된다. 데이터가 입에 삽이되게 되어 있다면 데이터는 아무 여유 공간에나 삽입될 수 있다. 파일 내에 있는 PFS 페이지는 각 페이지들의 할당 여부와 각 페이지에 있는 여유 공간 크기를 기록한다. 각 PFS 페이지들은 8088개의 연속된 페이지들 (약 64MB)을 처리한다. 각 페이지에 대해 PFS는 페이지가 비었는지, 1~50% 찼는지, 51~80%가 찼지는, 81~95%가 찼는지, 96~100%가 찼는지를 기록하는 1 바이트를 갖고 있다. SQL Server는 새로 삽입된 행을 보관할 수 있는 여유 공간이 있는 페이지를 찾을 필요가 있을 때 이 정보를 사용한다. 파일의 두번째 페이지와 이후에 8088번째 마다 나오는 페이지들이 PFS 이다.

데이터 파일 내에는 두 가지 다른 종류의 특별한 페이지들도 있다. 일곱번째 페이지(6번 페이지)는 DCM(Differential Changed Map) 페이지라고 불리고, 데이터베이스 전체 백업 이후 파일의 어떤 익스텐트들이 변경되어 있는지 추적한다.. 파일의 열번째 페이지(7번 페이지)는 BCM(Bulk Changed Map) 페이지라고 불리고, 파일에 있는 익스텐트가 최소한으로 또는 대량 로그 동작으로 사용할 때 사용된다. 역시 511,230페이지 마다 나타난다.

|