共用方式為


預估非叢集索引的大小

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

請遵循下列步驟來估計儲存非叢集索引所需的空間量:

  1. 計算步驟 2 和 3 中所使用的變數。

  2. 計算在非叢集索引的分葉層級中儲存索引資訊的空間。

  3. 計算在非叢集索引的非分葉層級中儲存索引資訊的空間。

  4. 加總計算的值。

步驟 1. 計算要在步驟 2 和 3 中使用的變數

您可以使用下列步驟來計算變數,以便用於估計儲存索引較高層級所需的空間量。

  1. 指定資料表中將會有的資料列數目:

    • Num_Rows = 資料表中的資料列數目
  2. 指定索引鍵中固定長度和可變長度資料行的數目,並計算儲存它們所需的空間:

    索引的索引鍵資料行可以包含固定長度和可變長度的資料行。 若要估計內部層級的索引資料列大小,請計算這些資料行群組在索引資料列中佔用的空間。 資料行的大小取決於資料類型和長度規格。

    • Num_Key_Cols = 鍵欄的總數(包括固定長度和可變長度)
    • Fixed_Key_Size = 固定長度鍵列的總位元組大小
    • Num_Variable_Key_Cols = 可變長度索引鍵資料行數目
    • Max_Var_Key_Size = 所有可變長度索引鍵欄的最大位元組大小
  3. 如果索引不是唯一的,則需要考慮資料列定位器:

    如果非叢集索引不是唯一的,資料列定位器就會結合非叢集索引鍵,以便針對每個資料列產生唯一的索引鍵值。

    如果非叢集索引是在堆積上,資料列定位器就是堆積 RID。 這是 8 位元組的大小。

    • Num_Key_Cols = + 1
    • Num_Variable_Key_Cols = + 1
    • Max_Var_Key_Size = + 8

    如果非叢集索引是在叢集索引上,資料列定位器就是叢集索引鍵。 必須與非叢集索引鍵結合的資料行是叢集索引鍵中尚未存在於非叢集索引索引鍵資料行集中的資料行。

    • Num_Key_Cols = + 不是位於非叢集索引鍵資料行集中的叢集索引鍵資料行數目 (如果叢集索引非唯一,則 + 1)

    • Fixed_Key_Size = + 在非叢集索引鍵資料行集中不存在的固定長度叢集索引鍵資料行的總位元組大小

    • Num_Variable_Key_Cols = + 不在非叢集索引鍵資料行中的可變長度叢集索引鍵資料行的數目(如果叢集索引非唯一,則加 1)

    • Max_Var_Key_Size = + 不屬於非叢集索引鍵資料行集中之可變長度叢集鍵資料行的最大位元組大小(如果叢集索引非唯一,則 + 4)

  4. 資料列的一部分稱為 Null 點陣圖,可能會保留來管理資料行 Null 性。 計算它的大小:

    如果索引鍵中有可為 Null 的欄位,包含步驟 1.3 中所描述的任何必要叢集索引鍵欄位,索引資料列的一部分將保留作為 Null 點陣圖。

    • Index_Null_Bitmap = 2 + ((索引列中的欄位數 + 7) / 8)

    您應該僅使用先前運算式的整數部分。 請捨去任何餘數。

    如果沒有可為 Null 的索引鍵資料行,請將 Index_Null_Bitmap 設為 0。

  5. 計算可變長度的資料大小:

    如果在索引鍵中有可變長度的資料行,包含任何所需的叢集索引鍵資料行,請決定在索引資料列中儲存資料行所需的空間。

    • 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。

  6. 計算索引資料列的大小:

    • Index_Row_Size = Variable_Key_Size + Index_Null_Bitmap + 1 (索引資料列的資料列標頭上方) + 6 (子頁面識別碼指標)
  7. 計算每頁的索引列數(每頁 8,096 個可用位元組):

    • Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    因為索引資料列不會跨越頁面,所以每頁的索引資料列數目應該四捨五入到最接近的整列。 公式中的 2 是為頁面插槽陣列中該資料列的項目設置的。

步驟 2. 計算用於在分葉層級儲存索引資訊的空間

您可以使用下列步驟來估計儲存索引分葉層級所需的空間量。 您需要保留步驟 1 中的值才能完成此步驟。

  1. 指定在分葉層級的固定長度和可變長度的資料行數目,並計算儲存它們所需的空間:

    您可以透過在索引鍵資料行之外包含非索引鍵欄位,來擴充非叢集索引。 這些附加欄位只會儲存在非叢集索引的葉層級。 如需詳細資訊,請參閱建立內含資料行的索引

    Note

    您可以結合使定義的資料表總寬度超過 8,060 個位元組的 varcharnvarcharvarbinarysql_variant 資料行。 這些資料行中,每個資料行的長度必須仍然在 varcharvarbinarysql_variant 資料行的 8,000 位元組限制內,以及 nvarchar 資料行的 4,000 位元組限制內。 不過,它們的合併寬度可能會超過表格中的 8,060 位元組限制。 這也適用於包含資料行的非叢集索引分葉資料列。

    如果非叢集索引沒有任何包含的資料行,請使用步驟 1 中的值,包括步驟 1.3 中決定的任何修改:

    • Num_Leaf_Cols = Num_Key_Cols
    • 固定葉大小 = 固定密鑰大小
    • Num_Variable_Leaf_Cols = Num_Variable_Key_Cols
    • Max_Var_Leaf_Size = Max_Var_Key_Size

    如果非叢集索引有內含的資料行,請將適當的值加入步驟 1 的值中,包括在步驟 1.3 中所做的任何修改。 資料行的大小取決於資料類型和長度規格。 如需更多資訊,請見 資料類型

    • Num_Leaf_Cols = Num_Key_Cols + 包含的欄數
    • Fixed_Leaf_Size = Fixed_Key_Size + 固定長度內含資料行的總位元組大小
    • Num_Variable_Leaf_Cols = + 可變長度內含資料行的數目
    • Max_Var_Leaf_Size = + 可變長度內含資料行的最大位元組大小
  2. 請考慮資料列定位器:

    如果非叢集索引不是唯一的,則已在步驟 1.3 中考慮資料列定位器的額外負荷,而且不需要進一步修改。 進入下一步。

    如果非叢集索引是唯一的,那麼在葉層級中的所有資料列都必須包括資料列定位器。

    如果非叢集索引是在堆積上,資料列定位器就是堆積 RID (大小是 8 位元組)。

    • Num_Leaf_Cols = + 1
    • Num_Variable_Leaf_Cols = + 1
    • Max_Var_Leaf_Size = + 8

    如果非叢集索引是在叢集索引上,資料列定位器就是叢集索引鍵。 必須與非叢集索引鍵結合的資料行是叢集索引鍵中尚未存在於非叢集索引索引鍵資料行集中的資料行。

    • Num_Leaf_Cols + 不在非叢集索引鍵資料行集合中的叢集索引鍵資料行的數量(如果叢集索引不是唯一的,則加 1)

    • Fixed_Leaf_Size = + 不是位於非叢集索引鍵資料行集中的固定長度叢集索引鍵資料行數目

    • Num_Variable_Leaf_Cols = + 不在非叢集索引鍵資料行集合中的變動長度叢集索引鍵資料行的數目(若叢集索引為非唯一,則 + 1)

    • Max_Var_Leaf_Size = + 可變長度叢集索引鍵資料行的位元組大小(不屬於非叢集索引鍵資料行集合)+(如果叢集索引非唯一,則加上 4)

  3. 計算 Null 位元圖的大小:

    • Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)

    您應該僅使用先前運算式的整數部分。 請捨去任何餘數。

  4. 計算可變長度的資料大小:

    如果有可變長度的資料行 (索引鍵資料行或已包含),包含先前步驟 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。

  5. 計算索引資料列的大小:

    • Leaf_Row_Size = Variable_Leaf_Size + + 1 (索引資料列的資料列標頭上方)
  6. 計算每頁的索引列數(每頁 8,096 個可用位元組):

    • Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)

    因為索引資料列不會跨越頁面,所以每頁的索引資料列數目應該四捨五入到最接近的整列。 公式中的 2 是為頁面插槽陣列中該資料列的項目設置的。

  7. 根據指定的 填滿因數 ,計算每個分頁所保留的可用資料列數目:

    • Free_Rows_Per_Page = 8096 × ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)

    計算中所使用的填滿因數是整數值而不是百分比。 因為資料列不會跨越頁面,所以每頁的資料列數應該向下捨入到最接近的整列。 隨著填充係數的增長,每個頁面上存儲的數據更多,頁面數量也更少。 公式中的 2 是為頁面插槽陣列中該資料列的項目設置的。

  8. 計算儲存所有資料列所需的分頁數目:

    • Num_Leaf_Pages = / (Leaf_Rows_Per_PageFree_Rows_Per_Page)

    估計的分頁數目應該要將小數進位到最接近的整分頁數。

  9. 計算索引的大小(每頁總計 8,192 個位元組):

    • Leaf_Space_Used = 8192 x Num_Leaf_Pages

步驟 3. 計算用來儲存非分葉層級索引資訊的空間

請遵循下列步驟來估計儲存索引之中繼和根層級所需的空間量。 您需要保留步驟 2 和 3 中的值才能完成此步驟。

  1. 計算索引中的非分葉層級數目:

    • 非葉層 = 1 + log(Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page

    將這個值向上取整到最近的整數。 此值不包含非叢集索引的分葉層級。

  2. 計算索引中的非分葉頁面數目:

    • Num_Index_Pages = ∑層 (Num_Leaf_Pages/Index_Rows_Per_Page^層) 其中 1 <= 層 <= 層數

    將每個加數四捨五入到最近的整數。 簡單舉例說明,假設有個索引,其中 Num_Leaf_Pages = 1000 且 Index_Rows_Per_Page = 25。 葉子層級以上的第一個索引層級儲存1000個索引列,即每個葉子頁面一個索引列,每頁可以容納25個索引列。 這表示需要 40 頁才能儲存這 1,000 個索引列。 索引的下一個層級必須儲存 40 個資料列, 這表示它需要 2 頁。 索引的最後一個層級必須儲存 2 個資料列。 這表示它需要 1 頁。 這會產生 43 個非分葉索引頁面。 在上述公式中使用這些數字時,結果如下:

    • Non-leaf_Levels = 1 + log(25) (1000 / 25) = 3

    • Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43,這是範例中所描述的頁數。

  3. 計算索引的大小(每頁總計 8,192 個位元組):

    • 索引空間使用 = 8192 x 索引頁面數

步驟 4. 計算值總計

將前兩個步驟所取得的值加總:

非叢集索引大小 (位元組) = Leaf_Space_Used + Index_Space_used

此計算不考慮下列條件:

  • 分割區:分割區的空間額外負荷很小,但計算起來很複雜。 納入並不重要。

  • 配置頁面:至少有一個 IAM 頁面用於追蹤分配給堆積的頁面,但空間開銷很小,而且沒有演算法可以確定性地準確計算要使用的 IAM 頁面數量。

  • 大型物件 (LOB) 值:判斷確切使用多少空間來儲存 LOB 資料類型 varchar(max)、varbinary(max)nvarchar(max)、textntextxml影像值的演算法很複雜。 只要將預期 LOB 值的平均大小相加,乘以 Num_Rows,然後將其新增至非叢集索引大小總計即可。

  • 壓縮:您無法預先計算壓縮索引的大小。

  • 稀疏資料行:如需有關稀疏資料行空間需求的資訊,請參閱使用 稀疏資料行