적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
비클러스터형 인덱스 저장에 필요한 공간의 양을 예측하려면 다음 단계를 수행합니다.
2단계와 3단계에 사용할 변수를 계산합니다.
비클러스터형 인덱스의 리프 수준에 인덱스 정보를 저장하는 데 사용되는 공간을 계산합니다.
비클러스터형 인덱스의 비 리프 수준에 인덱스 정보를 저장하는 데 사용되는 공간을 계산합니다.
계산된 값을 합산합니다.
1단계. 2단계와 3단계에서 사용할 변수 계산
다음 단계를 사용하여 인덱스의 상위 수준을 저장하는 데 필요한 공간의 양을 예측하는 데 사용되는 변수를 계산할 수 있습니다.
테이블에 표시할 행 수를 지정합니다.
- Num_Rows = 테이블의 행 수
인덱스 키의 고정 길이 및 가변 길이 열 수를 지정하고 이러한 열을 스토리지하는 데 필요한 공간을 계산합니다.
인덱스의 키 열에는 고정 길이 및 가변 길이 열이 포함될 수 있습니다. 내부 수준 인덱스 행 크기를 예측하려면 이러한 각 열 그룹이 인덱스 행 내에서 차지하는 공간을 계산합니다. 열의 크기는 데이터 형식 및 길이 사양에 따라 달라집니다.
- Num_Key_Cols = 키 열의 총 수(고정 길이 및 가변 길이)
- Fixed_Key_Size = 모든 고정 길이 키 열의 총 바이트 크기
- Num_Variable_Key_Cols = 가변 길이 키 열의 수
- Max_Var_Key_Size = 모든 가변 길이 키 열의 최대 바이트 크기
인덱스가 특수하지 않은 경우 필요한 데이터 행 로케이터에 대한 계정:
비클러스터형 인덱스가 고유하지 않은 경우 데이터 행 로케이터가 비클러스터형 인덱스 키와 결합되어 모든 행에 고유한 키 값을 생성합니다.
비클러스터형 인덱스가 힙 위에 있는 경우 데이터 행 로케이터는 힙 RID입니다. 크기는 8바이트입니다.
- Num_Key_Cols = Num_Key_ColsNum_Key_Cols + 1
- = Num_Variable_Key_ColsNum_Variable_Key_Cols + 1
- Max_Var_Key_Size = Max_Var_Key_SizeMax_Var_Key_Size + 8
비클러스터형 인덱스가 클러스터형 인덱스에 있는 경우 데이터 행 로케이터는 클러스터링 키입니다. 비클러스터형 인덱스 키와 결합해야 하는 열은 비클러스터형 인덱스 키 열 집합에 아직 없는 클러스터링 키의 열입니다.
Num_Key_Cols = Num_Key_Cols + 비클러스터형 인덱스 키 열 세트에 없는 클러스터링 키 열의 수 + 1(클러스터형 인덱스가 고유하지 않은 경우)
Fixed_Key_Size = Fixed_Key_Size + 비클러스터형 인덱스 키 열 세트에 없는 고정 길이 클러스터링 키 열의 총 바이트 크기
Num_Variable_Key_Cols = Num_Variable_Key_Cols + 비클러스터형 인덱스 키 열 세트에 없는 가변 길이 클러스터링 키 열의 수 + 1(클러스터형 인덱스가 고유하지 않은 경우)
Max_Var_Key_Size = Max_Var_Key_Size + 비클러스터형 인덱스 키 열 세트에 없는 가변 길이 클러스터링 키 열의 최대 바이트 크기 + 4(클러스터형 인덱스가 고유하지 않은 경우)
null 비트맵이라고 하는 행의 일부는 열 null 허용 가능성을 관리하도록 예약될 수 있습니다. 다음과 같이 이 부분의 크기를 계산합니다.
인덱스 키에 null 허용 열이 있는 경우(1.3단계에서 설명한 필요 클러스터링 키 열 포함), 인덱스 행의 일부는 null 비트맵을 위해 예약됩니다.
- Index_Null_Bitmap = 2 + ((인덱스 행의 열 수 + 7) / 8)
위 식의 정수 부분만 사용하고 나머지를 삭제합니다.
Null을 허용하는 키 열이 없으면 Index_Null_Bitmap을 0으로 설정합니다.
가변 길이 데이터 크기를 계산합니다.
필요한 클러스터링 인덱스 키 열을 포함하여 인덱스에 가변 길이 열이 있는 경우에는 해당 인덱스 행 안에 열을 저장하는 데 사용되는 공간을 결정합니다.
- Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size
Max_Var_Key_Size 추가된 바이트는 각 변수 열을 추적하기 위한 것입니다. 이 수식에서는 모든 가변 길이 열이 100% 가득 찼다고 가정합니다. 사용할 가변 길이 열 스토리지 공간 비율이 더 적을 것으로 예상되는 경우 해당 비율로 Max_Var_Key_Size 값을 조정하여 전체 테이블 크기를 보다 정확하게 예측할 수 있습니다.
가변 길이 열이 없는 경우에는 Variable_Key_Size를 0으로 설정합니다.
인덱스 행 크기를 계산합니다.
- Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1(인덱스 행의 행 머리글 오버헤드) + 6(자식 페이지 ID 포인터)
페이지당 인덱스 행 수를 계산합니다(페이지당 8,096바이트 사용 가능).
- Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
인덱스 행은 페이지에 걸쳐 있지 않으므로 페이지당 인덱스 행 수를 가장 가까운 전체 행으로 반올림해야 합니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.
2단계. 리프 수준에서 인덱스 정보를 저장하는 데 사용되는 공간 계산
다음 단계를 통해 인덱스의 리프 레벨을 저장하는데 필요한 공간을 추정할 수 있습니다. 이 단계를 완료하려면 1단계에서 유지되는 값이 필요합니다.
리프 수준에서 고정 길이와 가변 길이 열의 수를 지정하고, 이들의 저장에 필요한 공간을 계산합니다.
인덱스 키 열 외에도 키가 아닌 열을 포함하여 비클러스터형 인덱스를 확장할 수 있습니다. 이러한 추가 열은 비클러스터형 인덱스의 리프 레벨에만 저장됩니다. 자세한 내용은 포괄 열을 사용하여 인덱스 만들기를 참조하세요.
Note
정의된 총 테이블 너비가 8,060바이트를 초과하는 varchar, nvarchar, varbinary또는 sql_variant 열을 결합할 수 있습니다. 이 열 각각의 길이는 계속해서 varchar, varbinary 또는 sql_variant 열의 경우 8,000바이트, nvarchar 열의 경우 4,000바이트의 제한을 넘지 않아야 합니다. 그러나 결합된 너비는 테이블의 8,060 바이트 제한을 초과할 수 있습니다. 열이 포함된 비클러스터형 인덱스 리프 행에도 적용됩니다.
비클러스터형 인덱스에 포함된 열이 없는 경우 1.3단계에서 결정된 수정 사항을 포함하여 1단계의 값을 사용합니다.
- Num_Leaf_Cols = Num_Key_Cols
- 고정_리프_크기 = 고정_키_크기
- Num_Variable_Leaf_Cols = Num_Variable_Key_Cols
- = Max_Var_Leaf_SizeMax_Var_Key_Size
비클러스터형 인덱스에 열이 포함된 경우 1.3단계의 수정 내용을 포함하여 1단계의 값에 적절한 값을 추가합니다. 열의 크기는 데이터 형식 및 길이 사양에 따라 달라집니다. 자세한 내용은 데이터 형식을 참조하십시오.
- Num_Leaf_Cols = Num_Key_Cols + 포괄 열의 수
- Fixed_Leaf_Size = Fixed_Key_Size + 고정 길이 포함 열의 총 바이트 크기
- Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + 가변 길이의 포함된 열의 수
- Max_Var_Leaf_Size = Max_Var_Key_Size + 가변 길이 포괄 열의 최대 바이트 크기
데이터 행 로케이터를 고려하십시오.
비클러스터형 인덱스가 특수하지 않은 경우 1.3단계에서 데이터 행 로케이터에 대한 오버헤드가 이미 고려되었으며 추가 수정이 필요하지 않습니다. 다음 단계로 이동합니다.
비클러스터형 인덱스가 고유한 경우 데이터 행 로케이터는 리프 레벨의 모든 행에서 고려해야 합니다.
비클러스터형 인덱스가 힙 위에 있는 경우 데이터 행 로케이터는 힙 RID(크기 8바이트)입니다.
- Num_Leaf_Cols = Num_Leaf_ColsNum_Leaf_Cols + 1
- 변수_리프_열_갯수 = 변수_리프_열_갯수 + 1
- Max_Var_Leaf_Size = Max_Var_Leaf_SizeMax_Var_Leaf_Size + 8
비클러스터형 인덱스가 클러스터형 인덱스에 있는 경우 데이터 행 로케이터는 클러스터링 키입니다. 비클러스터형 인덱스 키와 결합해야 하는 열은 비클러스터형 인덱스 키 열 집합에 아직 없는 클러스터링 키의 열입니다.
Num_Leaf_Cols = Num_Leaf_Cols + 비클러스터형 인덱스 키 열 세트에 없는 클러스터링 키 열의 수 + 1(클러스터형 인덱스가 고유하지 않은 경우)
Fixed_Leaf_Size = Fixed_Leaf_Size + 비클러스터형 인덱스 키 열 세트에 없는 고정 길이 클러스터링 키 열의 수
Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 비클러스터형 인덱스 키 열 세트에 없는 가변 길이 클러스터링 키 열의 수 + 1(클러스터형 인덱스가 고유하지 않은 경우)
Max_Var_Leaf_Size = Max_Var_Leaf_Size + 비클러스터형 인덱스 키 열 세트에 없는 가변 길이 클러스터링 키 열의 바이트 크기 + 4(클러스터형 인덱스가 고유하지 않은 경우)
Null 비트맵 크기를 계산합니다.
- Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)
위 식의 정수 부분만 사용하고 나머지를 삭제합니다.
가변 길이 데이터 크기를 계산합니다.
2.2단계에서 설명한 대로 필요한 클러스터링 키 열을 포함하여 가변 길이 열(키 열 또는 포함)이 있는 경우 인덱스 행 내에 열을 저장하는 데 사용되는 공간을 결정합니다.
- Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size
Max_Var_Key_Size 추가된 바이트는 각 변수 열을 추적하기 위한 것입니다. 이 수식에서는 모든 가변 길이 열이 100% 가득 찼다고 가정합니다. 사용할 가변 길이 열 스토리지 공간 비율이 더 적을 것으로 예상되는 경우 해당 비율로 Max_Var_Leaf_Size 값을 조정하여 전체 테이블 크기를 보다 정확하게 예측할 수 있습니다.
가변 길이 열(키 열 또는 포괄 열)이 없는 경우에는 Variable_Leaf_Size를 0으로 설정합니다.
인덱스 행 크기를 계산합니다.
- Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1(인덱스 행의 행 머리글 오버헤드)
페이지당 인덱스 행 수를 계산합니다(페이지당 8,096바이트 사용 가능).
- Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
인덱스 행은 페이지에 걸쳐 있지 않으므로 페이지당 인덱스 행 수를 가장 가까운 전체 행으로 반올림해야 합니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.
지정한 채우기 비율에 따라 페이지당 예약된 여유 행 수를 계산합니다.
- Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)
계산에 사용되는 채우기 비율은 백분율이 아닌 정수 값입니다. 행은 페이지에 걸쳐 있지 않으므로 페이지당 행 수를 가장 가까운 전체 행으로 반올림해야 합니다. 채우기 비율 증가에 따라 각 페이지에 더 많은 데이터가 저장되고 페이지 수가 줄어듭니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.
모든 행을 저장하는 데 필요한 페이지 수를 계산합니다.
- Num_Leaf_Pages = Num_Rows/(Leaf_Rows_Per_Page - Free_Rows_Per_Page)
예상 페이지 수는 가장 가까운 전체 페이지로 반올림되어야 합니다.
인덱스 크기(페이지당 총 바이트 8,192바이트)를 계산합니다.
- 리프_공간_사용 = 8192 x 리프_페이지_수
3단계. 리프가 아닌 수준에서 인덱스 정보를 저장하는 데 사용되는 공간 계산
다음 단계에 따라 인덱스의 중간 및 루트 수준을 저장하는 데 필요한 공간의 양을 예측합니다. 이 단계를 완료하려면 2단계와 3단계에서 유지되는 값이 필요합니다.
인덱스에서 비리프 레벨의 수를 계산합니다.
- 리프가 아닌 수준 = 1 + log(Index_Rows_Per_Page)(Num_Leaf_Pages / Index_Rows_Per_Page)
이 값을 가장 가까운 정수로 반올림합니다. 이 값에는 비클러스터형 인덱스의 리프 수준이 포함되지 않습니다.
인덱스의 리프가 아닌 페이지의 수를 계산합니다.
- Num_Index_Pages = ∑레벨(Num_Leaf_Pages/Index_Rows_Per_Page^Level) 여기서 1 <= 수준 <= 수준
각 항을 가장 근접한 정수로 반올림합니다. 간단한 예로 Num_Leaf_Pages = 1000 및 Index_Rows_Per_Page = 25인 인덱스를 고려합니다. 리프 수준 위의 첫 번째 인덱스 수준에는 리프 페이지당 하나의 인덱스 행인 1,000개의 인덱스 행이 저장되고 페이지당 25개의 인덱스 행이 적합할 수 있습니다. 즉, 1,000개의 인덱스 행을 저장하려면 40페이지가 필요합니다. 인덱스의 다음 수준에서는 40개 행을 저장해야 하므로 즉, 2페이지가 필요합니다. 인덱스의 최종 수준에서는 2개 행을 저장해야 하므로 즉, 1페이지가 필요합니다. 이렇게 하면 비 리프 인덱스 페이지가 43개 생성됩니다. 앞의 수식에 이 숫자들을 사용하면 다음 결과가 나옵니다.
비 leaf_Levels = 1 + log(25)(1000 / 25) = 3
Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43(예에서 설명한 페이지 수)
인덱스 크기(페이지당 총 바이트 8,192바이트)를 계산합니다.
- 사용된_인덱스_공간 = 8192 x Num_Index_Pages
4단계. 계산된 값 합계
이전 두 단계에서 얻은 값의 합계:
비클러스터형 인덱스 크기(바이트) = Leaf_Space_Used + Index_Space_used
이 계산은 다음 조건을 고려하지 않습니다.
분할: 분할의 공간 오버헤드는 최소화되지만 계산하기는 복잡합니다. 포함해야 하는 것은 중요하지 않습니다.
할당 페이지: 힙에 할당된 페이지를 추적하는 데 사용되는 IAM 페이지가 하나 이상 있지만 공간 오버헤드는 최소화되며 사용할 IAM 페이지 수를 정확하게 계산하는 알고리즘은 없습니다.
LOB(큰 개체) 값: LOB 데이터 형식인 varchar(max), varbinary(max), nvarchar(max), text, ntext, xml 및 image 값을 저장하는 데 사용할 공간의 정확한 크기를 결정하는 알고리즘은 복잡합니다. 필요한 LOB 값의 평균 크기를 추가하고 Num_Rows 곱한 다음 총 비클러스터형 인덱스 크기에 추가하는 것만으로도 충분합니다.
압축: 압축된 인덱스의 크기를 미리 계산할 수 없습니다.
스파스 열: 스파스 열의 공간 요구 사항에 대한 자세한 내용은 스파스 열 사용을 참조하세요.