익스텐트 할당 및 빈 공간 관리
익스텐트 할당을 관리하고 빈 공간을 추적하는 SQL Server 데이터 구조는 비교적 단순합니다. 이 데이터 구조를 사용하면 다음과 같은 이점이 있습니다.
빈 공간 정보는 빽빽하게 묶여 있으므로 이 정보를 포함하는 페이지의 수는 비교적 적습니다.
따라서 할당 정보 검색에 필요한 디스크 읽기 횟수가 줄어들어 속도가 빨라집니다. 더 이상의 읽기가 필요하지 않으므로 할당 페이지가 메모리에 남아 있게 될 확률도 높아집니다.
대부분의 할당 정보는 서로 연결되어 있지 않으므로 유지 관리가 간편합니다.
각 페이지 할당 또는 할당 취소 작업을 신속하게 수행할 수 있으므로 페이지를 할당 또는 할당 취소해야 하는 동시 태스크 간의 경합이 줄어듭니다.
익스텐트 할당 관리
SQL Server는 다음의 두 가지 형식의 할당 맵을 사용하여 익스텐트의 할당을 기록합니다.
전역 할당 맵(GAM)
GAM 페이지는 어떤 익스텐트가 할당되었는지 기록합니다. 각 GAM은 64,000개의 익스텐트 또는 거의 4GB의 데이터를 처리합니다. GAM은 처리 간격으로 각 익스텐트에 대해 한 비트를 갖습니다. 이 비트가 1인 경우 익스텐트는 비어 있고 이 비트가 0인 경우 익스텐트는 할당된 상태입니다.
공유 전역 할당 맵(SGAM)
SGAM 페이지는 어떤 익스텐트가 현재 혼합 익스텐트로 사용되고 있는지와 적어도 하나 이상의 사용되지 않은 페이지를 가지는지 기록합니다. 각 SGAM은 64,000개의 익스텐트 또는 거의 4GB의 데이터를 처리합니다. SGAM은 처리 간격으로 각 익스텐트에 대해 한 비트를 갖습니다. 이 비트가 1인 경우 익스텐트가 혼합 익스텐트로 사용되고 있고 빈 페이지를 가지고 있는 상태입니다. 이 비트가 0인 경우 익스텐트가 혼합 익스텐트로 사용되지 않거나, 혼합 익스텐트이고 모든 페이지가 사용되는 상태입니다.
각 익스텐트는 현재 사용 상태에 기반하여 GAM 및 SGAM에 설정된 다음의 비트 패턴을 갖습니다.
현재 익스텐트의 사용 |
GAM 비트 설정 |
SGAM 비트 설정 |
---|---|---|
비어 있음, 사용 중이지 않음 |
1 |
0 |
단일 익스텐트 또는 완전 혼합 익스텐트 |
0 |
0 |
빈 페이지가 있는 혼합 익스텐트 |
0 |
1 |
이러한 복잡함 때문에 단순한 익스텐트 관리 알고리즘의 필요성이 부각되었습니다. 데이터베이스 엔진은 단일 익스텐트를 할당하기 위해 1비트에 해당하는 GAM을 검색하고 이를 0으로 설정합니다. 또한 빈 페이지가 있는 혼합 익스텐트를 찾기 위해 1비트에 해당하는 SGAM을 검색합니다. 데이터베이스 엔진은 혼합 익스텐트를 할당하기 위해 1비트에 해당하는 GAM을 검색하고 이를 0으로 설정한 다음 SGAM의 해당 비트를 1로 설정합니다. 또한 익스텐트 할당을 취소하기 위해 GAM 비트를 1로 설정하고 SGAM 비트를 0으로 설정합니다. 데이터베이스 엔진은 데이터베이스 내에서 균일하게 데이터를 분산시키므로 실제로 데이터베이스 엔진 내부에서 사용하는 알고리즘은 이 항목에서 설명하는 알고리즘보다 더 복잡합니다. 그러나 실제 알고리즘의 경우 익스텐트 할당 정보 체인을 관리하지 않아도 되므로 이보다 더 단순합니다.
빈 공간 추적
PFS(Page Free Space) 페이지는 개별 페이지의 할당 여부 및 각 페이지에 있는 빈 공간의 양과 같은 페이지의 할당 상태를 기록합니다. PFS는 각 페이지에 1바이트를 사용하여 페이지의 할당 여부를 기록하고 할당된 경우 페이지의 상태를 비어 있음, 1~50% 채워짐, 51~80% 채워짐, 81~95% 채워짐 또는 96~100% 채워짐으로 기록합니다.
개체에 익스텐트가 할당된 후에는 데이터베이스 엔진에서 PFS 페이지를 사용하여 익스텐트의 할당된 페이지 또는 빈 페이지를 기록합니다. 이 정보는 데이터베이스 엔진에서 새 페이지를 할당해야 할 때 사용됩니다. 힙 및 텍스트/이미지 페이지에 대해서만 페이지 내의 빈 공간의 양이 관리됩니다. PFS 페이지는 데이터베이스 엔진에서 새로 삽입된 행을 보관할 수 있는 빈 공간이 있는 페이지를 찾아야 할 때 사용됩니다. 인덱스의 경우 새 행을 삽입할 지점이 인덱스 키 값에 의해 설정되므로 페이지의 빈 공간을 추적할 필요가 없습니다.
PFS 페이지는 데이터 파일에서 파일 헤더 페이지 뒤의 첫째 페이지(페이지 번호 1)입니다. 이 페이지 다음에는 GAM 페이지(페이지 번호 2)와 SGAM 페이지(페이지 번호 3)가 있습니다. 처음 PFS 페이지 다음에 각 8,000페이지의 PFS가 있습니다. 2페이지의 첫 번째 GAM 페이지 다음에 64,000개의 익스텐트가 있는 다른 GAM 페이지가 있고 3페이지의 첫 번째 SGAM 페이지 다음에 64,000개의 익스텐트가 있는 다른 SGAM 페이지가 있습니다. 다음 그림은 익스텐트 할당 및 관리를 위해 데이터베이스 엔진에서 사용하는 페이지 순서를 보여 줍니다.