共用方式為


估計非叢集索引的大小

您可以使用下列步驟來估計儲存非叢集索引所需的空間量。

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

步驟 1. 計算在非分葉層級中儲存索引資訊的空間

ms190620.note(zh-tw,SQL.90).gif重要事項:
保留此步驟所使用的值,以供步驟 2 的其他用途之用。

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

  1. 指定資料表中將會有的資料列數目:
    Num_Rows = 資料表中資料列的數目
  2. 指定索引鍵中固定長度和可變長度資料行的數目,並計算儲存它們所需的空間:
    索引的索引鍵資料行可以包含固定長度和可變長度的資料行。若要估計內部層級的索引資料列大小,請計算這些資料行群組在索引資料列中佔用的空間。資料行的大小取決於資料類型和長度規格。如需詳細資訊,請參閱<資料類型 (Database Engine)>。
    Num_Key_Cols = 索引鍵資料行的總數目 (固定長度和可變長度)
    Fixed_Key_Size = 所有固定長度索引鍵資料行的總計位元組大小
    Num_Variable_Key_Cols = 可變長度的索引鍵資料行數目
    Max_Var_Key_Size = 所有可變長度索引鍵資料行的最大位元組大小
  3. 如果索引不是唯一的,就需說明資料列定位器:
    如果非叢集索引不是唯一的,資料列定位器就會結合非叢集索引鍵,以便針對每個資料列產生唯一的索引鍵值。
    如果非叢集索引是在堆積上,資料列定位器就是堆積 RID。這是 8 位元組的大小。
    Num_Key_Cols = Num_Key_Cols + 1
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
    Max_Var_Key_Size = Max_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)
  4. 資料列的一部份,又稱為 Null 點陣圖,可用以管理資料行的 Null 屬性。計算它的大小:
    如果索引鍵中有可為 Null 資料行,包含步驟 1、3 中所描述的任何所需叢集索引鍵資料行,一部份的索引資料列將保留作為 Null 點陣圖。
    Index_Null_Bitmap = 2 + ((可為 Null 索引鍵資料行的數目 + 7) / 8)
    您應該僅使用先前運算式的整數部份。請捨去任何餘數。
    若沒有可為 Null 的索引鍵資料行,請將 Index_Null_Bitmap 設成 0。
  5. 計算可變長度的資料大小:
    如果在索引鍵中有可變長度的資料行,包含任何所需的叢集索引鍵資料行,請決定在索引資料列中儲存資料行所需的空間。
    Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size 這個公式假設所有可變長度的資料行 100% 填滿。如果您預期可變長度資料行所使用的儲存空間百分比會比較小,您可以經由調整百分比所得的 Max_Var_Key_Size 值,產生更精確的整體資料表大小之估計。
    若沒有可變長度的資料行,請將 Variable_Key_Size 設成 0。
  6. 計算索引資料列的大小:
    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (索引資料列的資料列標頭負擔) + 6 (子頁面識別碼指標)
  7. 計算每個分頁的索引資料列數目 (每個分頁包含 8096 個可用位元組):
    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
    由於索引資料列並不會跨越分頁,因此每個分頁索引資料列的數目應該捨去小數,而取最接近的整數列數。公式中的 2 是給分頁位置陣列中的該資料列項目。
  8. 計算索引中的層級數目:
    Levels = 1 + log Index_Rows_Per_Page (Num_Rows / Index_Rows_Per_Page)
    注意,此值不包括非叢集索引的分葉層級。
  9. 計算索引中的分頁數目:
    Num_Index_Pages = ?Level (Index_Rows_Per_Page)Level – 1
    其中 1 <= Level <= Levels
    在此簡單的範例中,請考慮在索引中分葉上方層級所需的索引資料列總數為 1000,而且每頁可容納 10 個索引資料列。這表示儲存這 1000 個資料列需要 100 頁。索引的下一個層級必須儲存 100 個資料列。這表示它需要 10 頁。索引的最後一個層級必須儲存 10 個資料列。這表示它需要 1 頁。在前面的公式中使用這些數目提供下列項目:
    高度 = 1 + log10 (1000 / 10) = 3
    Num_Index_Pages = (10)3-1 + (10)2-1 + (10)1-1 = 111,這是範例中所描述的頁數。
  10. 計算索引的大小 (每個分頁共有 8192 個位元組):
    Index_Space_Used* = 8192 x *Num_Index_Pages

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

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

  1. 指定在分葉層級的固定長度和可變長度的資料行數目,並計算儲存它們所需的空間:
    ms190620.note(zh-tw,SQL.90).gif附註:
    SQL Server 2005 推出擴充非叢集索引的功能,除了索引鍵資料行之外,還包含無索引鍵資料行。這些額外的資料行只會儲存在非叢集索引的分葉層級。如需詳細資訊,請參閱<建立內含資料行的索引>。
    ms190620.note(zh-tw,SQL.90).gif附註:
    SQL Server 2005 推出結合 varcharnvarcharvarbinarysql_variant 資料行的功能,因而使定義的資料表總寬度超過 8,060 位元組。這些資料行的每個長度必須仍然在 varcharvarbinarysql_variant 資料行的 8,000 位元組限制內,以及 nvarchar 資料行的 4,000 位元組。然而,結合的寬度可能超過資料表中 8,060 位元組的限制。這也適用於已包含資料行的非叢集索引分葉資料列。如需詳細資訊,請參閱<超過 8 KB 的資料列溢位資料>。
    如果非叢集索引沒有任何內含的資料行,請使用步驟 1 的值,包含步驟 1、3 中所決定的任何修改:

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 的值中,包含在步驟 1、3 中所做的任何修改。資料行的大小取決於資料類型和長度規格。如需詳細資訊,請參閱<資料類型 (Database Engine)>。
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 + 可變長度內含資料行的最大位元組大小
2. 說明資料列定位器:
如果非叢集索引不是唯一的,由於資料列定位器的負擔在步驟 1、3 中已經考慮進去,因此不需要再做其他的修改。到下一個步驟。
如果非叢集索引是唯一的,在分葉層級的所有資料列中必須說明資料列定位器。
如果非叢集索引是在堆積上,資料列定位器就是堆積 RID (大小是 8 位元組)。
Num_Leaf_Cols = Num_Leaf_Cols + 1
Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1
Max_Var_Leaf_Size = Max_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)
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 這個公式假設所有可變長度的資料行 100% 填滿。如果您預期可變長度資料行所使用的儲存空間百分比會比較小,則可以調整 Max_Var_Leaf_Size 值的百分比,取得更精確的整體資料表大小估計。
如果沒有可變長度的資料行,請將 Variable_Leaf_Size 設定成 0。
5. 計算索引資料列的大小:
Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (索引資料列的資料列標頭負擔) + 6 (子項頁面識別碼指標)
6. 計算每個分頁的索引資料列數目 (每個分頁包含 8096 個可用位元組):
Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
由於索引資料列並不會跨越分頁,因此每個分頁索引資料列的數目應該捨去小數,而取最接近的整數列數。公式中的 2 是給分頁位置陣列中的該資料列項目。
7. 根據指定的填滿因數,計算每個分頁所保留的可用資料列數目:
Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)
計算中所使用的填滿因數是整數值而不是百分比。因為資料列不能跨頁,每個分頁的資料列數目必須無條件捨去小數,而取最接近的整數資料列。當填滿因數變大時,每個分頁上會儲存更多資料,分頁也會比較少。公式中的 2 是給分頁位置陣列中的該資料列項目。
8. 計算儲存所有資料列所需的分頁數目:
Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)
估計的分頁數目應該要將小數進位到最接近的整分頁數。
9. 計算索引的大小 (每個分頁共有 8192 個位元組):
Leaf_Space_Used* = 8192 x *Num_Leaf_Pages

步驟 3. 將算出的值加總

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

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

上述計算未考慮下列項目:

  • 資料分割
    從資料分割而來的空間負擔非常小,但是計算起來很複雜。不一定要包含它。
  • 配置頁面
    至少有一個 IAM 頁面用以追蹤配置到堆積的頁面,但是空間負擔非常小,而且沒有演算法來決定性地計算要使用多少 IAM 頁面。
  • 大型物件 (LOB) 值
    決定到底要使用多少空間來儲存 LOB 資料類型 varchar(max)varbinary(max)nvarchar(max)textntextxml 以及 image 值的演算法是很複雜的。只加入必須有的 LOB 值平均大小便已足夠,並乘以 Num_Rows,然後將該值加入總非叢集索引大小。

請參閱

概念

叢集索引設計指導方針
建立索引 (Database Engine)
非叢集索引設計指導方針
估計資料表的大小
估計叢集索引的大小
估計堆積的大小

其他資源

估計資料庫的大小

說明及資訊

取得 SQL Server 2005 協助