클러스터형 인덱스의 크기 예측

업데이트: 2007년 9월 15일

다음 단계를 사용하여 클러스터형 인덱스에 데이터를 저장하는 데 필요한 공간을 예측할 수 있습니다.

  1. 클러스터형 인덱스의 리프 수준에 데이터를 저장하는 데 사용되는 공간을 계산합니다.
  2. 클러스터형 인덱스에 대한 인덱스 정보를 저장하는 데 사용되는 공간을 계산합니다.
  3. 계산된 값을 더합니다.

1단계. 리프 수준에 데이터를 저장하는 데 사용되는 공간 계산

  1. 테이블의 행 수를 지정합니다.
    Num_Rows = 테이블의 행 수

  2. 고정 길이 및 가변 길이 열 수를 지정하고 이러한 열을 저장하는 데 필요한 공간을 계산합니다.
    이러한 각 열 그룹이 데이터 행 내에서 차지하는 공간을 계산합니다. 열의 크기는 지정된 데이터 형식과 길이에 따라 달라집니다. 자세한 내용은 데이터 형식(데이터베이스 엔진)을 참조하십시오.
    Num_Cols = 고정 길이 및 가변 길이 열의 총 수
    Fixed_Data_Size = 모든 고정 길이 열의 전체 바이트 크기
    Num_Variable_Cols = 가변 길이 열 수
    Max_Var_Size = 모든 가변 길이 열의 최대 바이트 크기

  3. 클러스터형 인덱스가 고유하지 않은 경우 uniqueifier 열을 계산합니다.
    uniqueifier는 Null을 허용하는 가변 길이 열입니다. 고유하지 않은 키 값이 있는 행에서 이 열은 Null이 아니며 크기는 4바이트입니다. 이 값은 인덱스 키의 일부이며 모든 행에 고유 키 값이 있는지 확인하는 데 필요합니다.
    Num_Cols = Num_Cols + 1
    Num_Variable_Cols = Num_Variable_Cols + 1
    Max_Var_Size = Max_Var_Size + 4
    이러한 수정에서는 모든 값이 고유하지 않다고 가정합니다.

  4. 행의 Null 비트맵 부분은 열의 Null 허용 여부 관리를 위해 예약됩니다. 크기를 계산하면 다음과 같습니다.
    Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
    위 식의 정수 부분만 사용하고 나머지는 무시해야 합니다.

  5. 가변 길이 데이터 크기를 계산합니다.
    테이블에 가변 길이 열이 있는 경우에는 행 안의 열을 저장하기 위해 공간을 얼마나 사용하는지 결정합니다.
    Variable_Data_Size* = 2 + (Num_Variable_Cols x 2) + *Max_Var_Size 이 수식은 모든 가변 길이 열이 100% 꽉 찬 것을 전제로 합니다. 사용할 가변 길이 열 저장소의 공간 비율이 더 적을 것으로 예상되는 경우 해당 비율로 Max_Var_Size 값을 조정하여 전체 테이블 크기를 보다 정확하게 예측할 수 있습니다.

    [!참고] SQL Server 2005에서는 정의된 총 테이블 너비가 8,060바이트를 초과하는 varchar, nvarchar, varbinary 또는 sql_variant 열을 결합할 수 있습니다. 이러한 각 열의 길이는 varchar, varbinary 또는 sql_variant 열의 경우 8,000바이트 이내여야 하고 nvarchar 열의 경우 4,000바이트 이내여야 합니다. 그러나 결합된 너비는 테이블의 8,060바이트 제한을 초과할 수 있습니다. 자세한 내용은 8KB를 초과하는 행 오버플로 데이터를 참조하십시오.

    가변 길이 열이 없는 경우 Variable_Data_Size를 0으로 설정합니다.

  6. 전체 행 크기를 계산합니다.
    Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
    값 4는 데이터 행의 행 머리글 오버헤드입니다.

  7. 페이지당 행 수를 계산합니다. 페이지당 사용 가능한 바이트 수는 8,096바이트입니다.
    Rows_Per_Page = 8096 / (Row_Size + 2)
    행이 여러 페이지에 걸쳐 배치되지는 않으므로 페이지당 행의 수는 가장 근사한 전체 행으로 내림되어 계산됩니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.

  8. 지정한 채우기 비율을 기준으로 페이지당 예약된 사용 가능한 행 수를 계산합니다.
    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Row_Size + 2)
    계산에 사용되는 채우기 비율은 백분율이 아닌 정수 값입니다. 행이 여러 페이지에 걸쳐 배치되지는 않으므로 페이지당 행 수는 가장 근사한 전체 행으로 버림하여 계산해야 합니다. 채우기 비율이 클수록 각 페이지에 더 저장되는 데이터는 늘어나고 페이지 수는 줄어듭니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.

  9. 모든 행을 저장하는 데 필요한 페이지 수를 계산합니다.
    Num_Pages = Num_Rows / (Rows_Per_Page - Free_Rows_Per_Page)
    예상 페이지 수는 가장 근사한 전체 페이지로 올림하여 계산해야 합니다.

  10. 리프 수준에 데이터를 저장하는 데 필요한 공간을 계산합니다. 페이지당 총 바이트 수는 8,192바이트입니다.
    Leaf_space_used* = 8192 x *Num_Pages

2단계. 인덱스 정보를 저장하는 데 사용되는 공간 계산

다음 단계를 사용하여 인덱스의 상위 수준을 저장하는 데 필요한 공간을 예측할 수 있습니다.

  1. 인덱스 키의 고정 길이 및 가변 길이 열 수를 지정하고 이러한 열을 저장하는 데 필요한 공간을 계산합니다.
    인덱스의 키 열은 고정 길이 및 가변 길이 열을 포함할 수 있습니다. 내부 수준 인덱스 행 크기를 예측하려면 인덱스 행 내에서 이러한 각 열 그룹이 차지하는 공간을 계산합니다. 열 크기는 지정된 데이터 형식과 길이에 따라 달라집니다. 자세한 내용은 데이터 형식(데이터베이스 엔진)을 참조하십시오.
    Num_Key_Cols = 키 열의 총 수(고정 길이 및 가변 길이)
    Fixed_Key_Size = 총 고정 길이 키 열의 전체 바이트 크기
    Num_Variable_Key_Cols = 가변 길이 키 열의 수
    Max_Var_Key_Size = 모든 가변 길이 키 열의 최대 바이트 크기
  2. 인덱스가 고유하지 않은 경우 필요한 uniqueifier를 계산합니다.
    uniqueifier는 Null을 허용하는 가변 길이 열입니다. 고유하지 않은 인덱스 키 값이 있는 행에서 이 열은 Null이 아니며 크기는 4바이트입니다. 이 값은 인덱스 키의 일부이며 모든 행에 고유 키 값이 있는지 확인하는 데 필요합니다.
    Num_Key_Cols = Num_Key_Cols + 1
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
    Max_Var_Key_Size = Max_Var_Key_Size + 4
    이러한 수정에서는 모든 값이 고유하지 않다고 가정합니다.
  3. Null 비트맵 크기를 계산합니다.
    인덱스 키에 Null을 허용하는 열이 있으면 인덱스 행의 일부가 Null 비트맵용으로 예약됩니다. 다음과 같이 이 부분의 크기를 계산합니다.
    Index_Null_Bitmap = 2 + ((Null을 허용하는 키 열의 수 + 7) / 8)
    위 식의 정수 부분만 사용하고 나머지는 무시해야 합니다.
    Null을 허용하는 키 열이 없으면 Index_Null_Bitmap을 0으로 설정합니다.
  4. 가변 길이 데이터 크기를 계산합니다.
    인덱스에 가변 길이 열이 있는 경우에는 해당 인덱스 행 안에 열을 저장하는 데 사용되는 공간을 결정합니다.
    Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size 이 수식에서는 모든 가변 길이 열이 100% 꽉 찬 것으로 가정합니다. 사용할 가변 길이 열 저장소 공간 비율이 더 적을 것으로 예상되는 경우 해당 비율로 Max_Var_Size 값을 조정하여 전체 테이블 크기를 보다 정확하게 예측할 수 있습니다.
    가변 길이 열이 없는 경우에는 Variable_Key_Size를 0으로 설정합니다.
  5. 인덱스 행 크기를 계산합니다.
    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (인덱스 행의 행 머리글 오버헤드) + 6 (자식 페이지 ID 포인터)
  6. 페이지당 인덱스 행 수를 계산합니다. 페이지당 사용 가능한 바이트 수는 8,096바이트입니다.
    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
    인덱스 행이 여러 페이지에 걸쳐 배치되지는 않으므로 페이지당 인덱스 행 수는 가장 근사한 정수 값으로 버림하여 계산해야 합니다. 수식에서 값 2는 페이지의 슬롯 배열에서 행의 입력을 위한 것입니다.
  7. 인덱스의 수준 수를 계산합니다.
    Levels = 1 + log Index_Rows_Per_Page (Num_Rows / Index_Rows_Per_Page)
    이 값을 가장 가까운 정수로 반올림합니다. 클러스터형 인덱스의 리프 수준은 이 값에 포함되지 않습니다.
  8. 인덱스의 페이지 수를 계산합니다.
    Num_Index_Pages =∑Level (Num_Rows / (Index_Rows_Per_PageLevel)) 1 <= Level <= Levels
    간단한 예로 리프 위의 수준에 필요한 총 인덱스 행 수가 1000개이고 페이지당 적절한 인덱스 행 수가 25개인 인덱스가 있습니다. 이러한 경우 1000개 행을 저장하는 데 40페이지가 필요합니다. 인덱스의 다음 수준에서는 40개 행을 저장해야 하므로 2페이지가 필요합니다. 인덱스의 최종 수준에서는 2개 행을 저장해야 하므로 한 페이지가 필요합니다. 앞의 수식에 이 숫자들을 사용하면 다음과 같은 결과가 나옵니다.
    높이 = 1 + log25 (1000 / 25) = 3
    Num_Index_Pages = (1000/(25)3) + (1000/(25)2) + (1000/(25)1) = 43(예에서 설명한 페이지 수)
  9. 인덱스 크기를 계산합니다. 페이지당 총 바이트 수는 8,192바이트입니다.
    Index_Space_Used* = 8192 x *Num_Index_Pages

3단계. 계산된 값 합산

위의 두 단계에서 얻은 값을 더합니다.

클러스터형 인덱스 크기(바이트) = Leaf_Space_Used + Index_Space_used

이 계산에서 다음 사항은 고려되지 않습니다.

  • 분할
    분할에 의한 공간 오버헤드는 최소 수준이지만 계산이 복잡해집니다. 분할의 포함 여부는 중요하지 않습니다.
  • 할당 페이지
    힙에 할당된 페이지를 추적하는 데 사용되는 IAM 페이지가 하나 이상 있지만 공간 오버헤드가 최소 수준이며 사용될 IAM 페이지 수를 정확하게 결정적으로 계산할 수 있는 알고리즘은 없습니다.
  • LOB(Large Object) 값
    LOB 데이터 형식 varchar(max), varbinary(max), nvarchar(max), text, ntext, xmlimage 값을 저장하는 데 사용될 공간을 정확하게 측정하는 알고리즘은 복잡합니다. 예상되는 LOB 값의 평균 크기를 더하고 Num_Rows를 곱한 후 해당 값을 총 클러스터형 인덱스 크기에 더하는 것만으로도 충분합니다.

참고 항목

개념

클러스터형 인덱스 디자인 지침
인덱스 만들기(데이터베이스 엔진)
비클러스터형 인덱스 디자인 지침
테이블 크기 추정
비클러스터형 인덱스의 크기 예측
힙 크기 예측

관련 자료

데이터베이스 크기 예측

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2007년 9월 15일

변경된 내용
  • 2.7단계에 반올림 정보를 추가했습니다.