適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
您可以使用下列步驟,估計在叢集索引中儲存資料所需的空間量:
- 計算用來在叢集索引的分葉層級中儲存資料的空間。
- 計算用來儲存叢集索引之索引資訊的空間。
- 加總計算的值。
步驟 1. 計算用來將數據儲存在分葉層級的空間
指定資料表中存在的欄數:
- Num_Rows = 資料表中的資料列數量
指定固定長度與可變長度資料行的數目,並計算儲存這些資料行所需的空間:
計算這兩組資料行在資料列內各佔多少空間。 資料行的大小取決於資料類型和長度規格。
- Num_Cols = 資料行 (固定長度和可變長度) 的總數
- Fixed_Data_Size = 所有固定長度資料行的總位元組大小
- Num_Variable_Cols = 可變長度資料行的數目
- Max_Var_Size = 所有可變長度資料行的最大位元組大小
如果叢集索引是非唯一的,請考慮 uniqueifier 欄位:
uniqueifier 是可為 Null 的變長資料欄。 在具有非唯一索引鍵值的數據列中,其大小為非 Null 和 4 個字節。 此值是索引鍵的一部分,必須用來確定每個資料列都有唯一的索引鍵值。
- = Num_ColsNum_Cols + 1
- Num_Variable_Cols = + 1
- Max_Var_Size = + 4
這些修改假設所有值都是非統一的。
資料列中有一部分(稱為 Null 位圖)是保留的空間,用來管理資料行的可空性。 計算它的大小:
- Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
上述運算式中只有整數部分應該使用,請捨棄餘數。
計算可變長度資料的大小:
如果在索引中有可變長度的資料行,請決定將資料行儲存到索引列中所需的空間大小。
- Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
加入 Max_Var_Size 的位元組是用於追蹤每個可變資料行。 這個公式假設所有可變長度的資料行是 100% 填滿的。 如果您預期可變長度資料行所佔儲存空間的百分比會比較低,您可以經由調整百分比所得的 Max_Var_Size 值,取得更精確的整體資料表大小估計值。
您可以結合使定義的資料表總寬度超過 8,060 個位元組的 varchar、 nvarchar、 varbinary或 sql_variant 資料行。 這些資料行的每個長度必須符合 varchar、varbinary 或 sql_variant 資料行的 8,000 個位元組限制,以及 nvarchar 資料行的 4,000 個位元組限制。 不過,其合併寬度可能會超過數據表中的8,060位元組限制。
如果沒有可變長度資料行,請將 Variable_Data_Size 設為 0。
計算資料列總大小:
- Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
4 這個值是資料列的資料列標頭負擔。
計算每頁的數據列數目(每頁 8,096 個可用位元組):
- Rows_Per_Page = 8096 / (Row_Size + 2)
因為數據列不會跨越頁面,因此每個頁面的數據列數目應該四捨五入到最接近的整個數據列。 公式中的 2 這個值是為了頁面中位置陣列中的資料列項目。
根據指定的 填滿因數 ,計算每個分頁所保留的可用資料列數目:
- Free_Rows_Per_Page = 8096 x (100 - Fill_Factor) / 100) / (Row_Size + 2)
計算中所使用的填滿因數是整數值而不是百分比。 因為數據列不會跨越頁面,因此每個頁面的數據列數目應該四捨五入到最接近的整個數據列。 隨著填滿因數的成長,每個頁面會儲存更多數據,而且頁面較少。 公式中的 2 這個值是為了頁面中位置陣列中的資料列項目。
計算儲存所有資料列所需的分頁數目:
- Num_Leaf_Pages = Num_Rows / (Rows_Per_Page / - )
估計的頁數應該進位到最接近的整頁數。
計算將數據儲存在分葉層級所需的空間量(每頁總計8,192個字節):
- Leaf_space_used = 8192 x Num_Leaf_Pages
步驟 2. 計算用來儲存索引信息的空間
您可以使用下列步驟,估計儲存較高索引層級所需的空間量:
指定索引鍵中固定長度和可變長度資料行的數目,並計算儲存它們所需的空間:
索引的索引鍵資料行可以包含固定長度和可變長度的資料行。 若要估計內部層級的索引資料列大小,請計算這些資料行群組在索引資料列中佔用的空間。 資料行的大小取決於資料類型和長度規格。
- Num_Key_Cols = 關鍵欄位的總數(固定長度和可變長度)
- Fixed_Key_Size = 所有固定長度鍵列的總位元組大小
- Num_Variable_Key_Cols = 可變長度鍵欄位數目
- Max_Var_Key_Size = 所有可變長度鍵的最大的位元組大小
如果索引不是唯一的,請考慮所需的任何唯一化器:
uniqueifier 是可為 Null 的變長資料欄。 在具有非唯一索引鍵值的數據列中,其大小為非 Null 和 4 個字節。 此值是索引鍵的一部分,必須用來確定每個資料列都有唯一的索引鍵值。
- Num_Key_Cols = + 1
- Num_Variable_Key_Cols = + 1
- Max_Var_Key_Size = Max_Var_Key_Size + 4
這些修改假設所有值都是非統一的。
計算空值位圖大小:
若索引鍵中有可為 Null 的資料行,索引資料列的一部分會保留給 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 = Variable_Key_Size + Index_Null_Bitmap + 1 (索引資料列的資料列標頭上方) + 6 (子頁面識別碼指標)
計算每頁索引列的數目(每頁 8,096 個可用位元組):
- Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
因為索引數據列不會跨越頁面,因此每個頁面的索引列數目應該四捨五入到最接近的整個數據列。
2公式中的項目是頁面槽陣列中該行的輸入。計算索引中的層級數目:
- 非葉結點層級 = 1 + 對數 (Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)
將這個值進位至最接近的整數。 此值不包含叢集索引的分葉層級。
計算索引中的非分頁頁數:
Num_Index_Pages = ∑Level (Num_Leaf_Pages / (Index_Rows_Per_Page^Level))
其中 1 <= Level <= Non-leaf_Levels
將每個加數四捨五入到最接近的整數。 簡單舉例說明,假設有個索引,其中 Num_Leaf_Pages = 1000 且 Index_Rows_Per_Page = 25。 分葉層級上方的第一個索引層級會儲存 1,000 個索引數據列,這是每個分葉頁面一個索引數據列,而 25 個索引數據列可以容納每頁。 這表示需要 40 頁才能儲存這 1,000 個索引數據列。 索引的下一個層級必須儲存 40 個資料列, 這表示它需要兩頁。 索引的最終層級必須儲存兩個數據列。 這表示它需要一頁。 這會提供 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,這是範例中所描述的頁數。
計算索引的大小(每頁 8,192 個字節總數):
- 索引空間使用 = 8192 x 索引頁面數
步驟 3. 計算值總計
將前兩個步驟所取得的值加總:
- 叢集索引大小 (位元組) = Leaf_Space_Used +
此計算不會考慮下列條件:
分區:分區的空間開銷很小,但計算起來很複雜。 包含並不重要。
配置頁面:至少有一個 IAM 頁面用於追蹤配置給堆記憶體的頁面。 空間額外負荷最少,而且沒有演算法可確定確切計算將使用多少 IAM 頁面。
大型物件(LOB)值:用來判斷儲存 LOB 數據類型 varchar(max)、varbinary(max)、nvarchar(max)、text、ntext、xml 和 image 的演算法是複雜的。 只要新增預期的 LOB 值平均大小、乘 以Num_Rows,然後將它新增至叢集索引大小總計即可。
壓縮:您無法預先計算壓縮索引的大小。
疏鬆數據行:如需疏鬆數據行空間需求的相關信息,請參閱 使用疏鬆數據行。