適用於:
Databricks 執行時間 18.0 及以上版本
此 ANALYZE TABLE … COMPUTE STORAGE METRICS 指令用於計算資料表的總儲存容量指標。 它會顯示詳細的儲存分解,方便成本分析與優化。 關於查詢效能優化,請參見 ANALYZE TABLE ...計算統計數據。
預設情況下,指令會直接掃描資料表的檔案。 在大型資料表中,可以加入 USING INVENTORY 從預先生成的雲端儲存庫存報告讀取的條款,這樣不僅降低了計算儲存指標的時間,也降低了成本。 請參閱 使用庫存報告。
語法
ANALYZE TABLE table_name COMPUTE STORAGE METRICS
[ USING INVENTORY LOCATION inventory_path
CONF conf_name ]
參數
-
識別要分析的數據表。 名稱不得包含 時態規格或選項規格 或路徑。 如果找不到該表格,Azure Databricks 會觸發 TABLE_OR_VIEW_NOT_FOUND錯誤狀況。
USING INVENTORYOptional. 它會從預先產生的雲端儲存庫存報告中讀取儲存指標,而不是掃描資料表的檔案。 請參閱 使用庫存報告。 取兩個子參數:
LOCATION inventory_path一個包含完整雲端儲存路徑(包含任何前綴)的 STRING 字面值。 這條路徑必須與你在來源桶或容器上設定庫存報告時設定的目的地相符,且必須有你能存取的外部位置作為後盾。 請參閱 使用庫存報告。
例如:
'abfss://your-destination-container@your-storage-account.dfs.core.windows.net/your-prefix/'。CONF conf_nameRequired. 一個字串字面值,用來識別來源桶或容器上應使用的庫存報告設定。
如果你用 Azure CLI 設定 blob inventory policy 規則,請使用你設定的
name。 如果你用 Azure 主控台設定,請改用你設定的規則名稱值。
Description
計算特定資料表的總儲存容量指標。 此指令回傳完整的儲存資訊,包括總位元組、活躍位元組、可真空位元組及時間旅行位元組,以及每個類別相關的檔案數量。
使用此指令識別大型或未使用的資料表、優化儲存成本,並理解總儲存大小與活動資料表大小為何不同。 這對於需要分析多個資料表間儲存模式或追蹤儲存變化的平台管理員非常有用。
輸出指標
指令回傳三欄:metric_name、、 metric_valuemetric_description和 。 以下每個指標都會回傳一列:
metric_name |
Description |
|---|---|
total_bytes |
資料表的總儲存大小(以位元組為單位)。 這等於交易日誌大小 + 活動位元組 + 可真空位元組 + 時間旅行位元組。 |
num_total_files |
檔案總數,包括 delta log 檔案、活動檔案、可真空檔案及時間旅行檔案。 |
active_bytes |
資料檔案大小(以位元組計),由資料表主動參考(與 sizeInBytes相同)。 |
num_active_files |
表格積極參考的檔案總數。 |
vacuumable_bytes |
資料大小(以位元組計),你可以透過執行 VACUUM 或啟用 預測優化來移除。 |
num_vacuumable_files |
可吸塵檔案的數量。 |
time_travel_bytes |
用於回滾與 時間旅行 操作的歷史資料大小(以位元組為單位)。 也稱為墓碑式位元組或故障安全位元組。 |
num_time_travel_files |
用於時間旅行的檔案數量。 |
詳細資訊
- 預設情況下,該指令使用遞迴列表方法來計算儲存資訊。 執行時間通常在幾分鐘內,但對於非常大的資料表,可能需要長達數小時。
- 此指令適用於 Unity Catalog 管理的資料表及外部資料表。
- 指令在執行時計算儲存資源指標。 結果不會儲存在 Unity 目錄中,也不會反映在
DESCRIBE EXTENDED輸出中,輸出只會顯示活動中的表格大小。 - 為了追蹤儲存空間隨時間的變化,請定期執行此指令並將結果儲存在資料表中。 將此指令在多個資料表中循環執行,以分析資料資產中的儲存模式。 請參閱 目錄中所有資料表的計算儲存度量。
使用庫存報告
適用於:
執行時間 19 及以上
在大型資料表上使用條款 USING INVENTORY ,透過閱讀預先生成的雲端儲存庫存報告,而非掃描資料表檔案,以降低計算儲存指標的時間與成本。 Databricks 建議對於包含 100,000 個以上檔案的資料表,或是多鍵分割的表格,使用此條款。 對於較小的資料表,或沒有設定庫存報告的資料表,請使用不含此子句的指令。
此 USING INVENTORY 條款適用於 Unity 目錄管理及外部資料表。 它只在經典運算系統上運行。 更多限制,請參見 「使用庫存限制」。
這很重要
庫存報告只在公制陳舊可接受的表格上使用。
使用此條款計算的指標反映的是截至最近庫存報告時的狀態,而非目前狀態。 由於雲端服務商會定期產生庫存報告,結果可能長達24小時內都過時。 結果可能與指令在未使用此子句時回傳的值不同。
如果最近的庫存報告過於過時,指令會回傳錯誤,而非計算指標。 請參閱 陳舊庫存報告錯誤。
關於指令回傳的指標資訊,請參見 輸出指標。
先決條件
該 USING INVENTORY 條款有以下先決條件:
-
首次設定權限:Metastore 管理員預設擁有 Azure Databricks 所需的權限。 如果您不是管理員,若要設定庫存報告並將其目的地註冊為外部地點,您必須擁有以下權限:
- 雲端提供者權限,可在來源桶或容器上設定庫存報告。
- 以下 Azure Databricks 有一項權限可將庫存目的地註冊為外部地點:
- 同時擁有
CREATE EXTERNAL LOCATION元儲存庫及其參考的儲存憑證的權限。 - 對外部位置的
MANAGE權限。
- 同時擁有
-
已設定的庫存報告:在每個存放你想分析的資料表的來源容器上,設定一個 Azure 儲存體 的 blob inventory 報告。 請使用以下設定:
- 物件類型:Blob
- 黏液類型:方塊黏液與附加黏液
- 子類型:不啟用 包含快照 或 包含已刪除的 blob
- 頻率:每日
- 匯出格式:Apache Parquet
-
Blob 庫存欄位:包含名稱、最後修改、內容長度、快照、已刪除及 HDI 資料夾狀態(CLI
schemaFields:Name,Last-Modified,Content-Length,SnapshotDeleted)。hdi_isfolder沒有這些指令,指令無法計算正確的輸出。
Tip
Databricks 建議選擇所有可用的元資料欄位,以增加未來彈性。
Databricks 也建議在庫存目的地桶設定 14 天生命週期政策,自動刪除舊報表。 這能提升指令效能並降低儲存成本。 請參閱 AWS 生命週期管理、Azure 生命週期管理或 GCP 生命週期管理。
庫存報告的外部位置:您必須在 Azure Databricks 中取得庫存報告目的地路徑的讀取權限。
- 如果路徑不在現有的外部位置,先將其註冊為外部位置。 請參閱 連線至 Azure Data Lake Storage Gen2(ADLS Gen2)外部位置。
執行指令的權限:你必須擁有
READ FILESAzure Databricks 中支持庫存報告目的地的外部位置權限,此外還要保留你分析資料表上的現有權限。
Note
雲端服務提供者在初始設定後,產生第一份庫存報告可能需要長達 48 小時(AWS)或 24 小時(Azure、GCP)。
要找到資料表的來源桶或容器,執行 DESCRIBE TABLE EXTENDED 並檢查 Location 輸出欄位。 對於實體化視圖和串流表,你必須用它 DESCRIBE EXTENDED 來找到實際的儲存位置。 你必須確認你的庫存報告是否已設定在該來源桶或容器上。
陳舊庫存報告錯誤
指揮部會搜尋過去14天內產生的最新完整庫存報告。 如果該視窗內找不到報告,指令不會計算指標,並回傳 ANALYZE_TABLE_COMPUTE_STORAGE_METRICS_INVENTORY_CONTENTS_NOT_VALID 類似以下訊息的錯誤:
No inventory reports found in the last 14 days (window: 2026-07-08 to 2026-07-22).
1 report directory(s) exist but fall outside the lookback window.
Ensure a recent inventory report has been generated.
要解決這個錯誤,請確認來源桶或容器是否依照你設定的排程產生庫存報告,然後在產生新報告後再執行該指令。 請參閱必要條件。
表格類型的考量
對於具現化檢視與串流表,total_bytes 包含資料表大小及相關元資料。 該 active_bytes 度量排除了表中的 vacuumable_bytes 和 time_travel_bytes。
對於淺層複製,僅 total_bytes 包含複製人自身的元資料與 Delta 日誌檔案,排除來源資料表檔案。
active_bytes 為零,因為克隆會參考來源資料表的資料檔案。
範例
運算儲存指標
要計算儲存指標,請執行以下指令:
ANALYZE TABLE main.my_schema.my_table COMPUTE STORAGE METRICS;
指令會回傳輸出,例如以下內容:
metric_name metric_value metric_description
----------------------- ------------ --------------------------------------------------
total_bytes 5368709120 Total bytes on disk
num_total_files 1250 Total files on disk
active_bytes 4294967296 Bytes in current snapshot
num_active_files 1000 Files in current snapshot
vacuumable_bytes 805306368 Bytes eligible for vacuum
num_vacuumable_files 150 Files eligible for vacuum
time_travel_bytes 268435456 Bytes reachable by time travel (excluding active)
num_time_travel_files 100 Files reachable by time travel (excluding active)
輸出結果如下:
- 總儲存空間:5.37 GB,涵蓋 1,250 個檔案
- 活動資料:4.29 GB,分布於 1,000 個檔案(目前資料表版本)
-
可真空資料:805 MB,分成 150 個檔案(
VACUUM可回收此儲存容量) - 時間旅行資料:268 MB,分成 100 個檔案(用於歷史查詢)
利用庫存報告計算儲存指標
以下範例是從庫存報告中計算相同的指標,而非掃描資料表檔案:
ANALYZE TABLE main.my_schema.my_table COMPUTE STORAGE METRICS
USING INVENTORY LOCATION 'abfss://your-destination-container@your-storage-account.dfs.core.windows.net/your-prefix/'
CONF 'databricks-inventory-list-config';
由於庫存報告反映的是報告產生時(最多早24小時)的狀態,輸出可能與直接掃描不同。 例如:
metric_name metric_value metric_description
----------------------- ------------ --------------------------------------------------
total_bytes 5100273664 Total bytes on disk
num_total_files 1232 Total files on disk
active_bytes 4076863488 Bytes in current snapshot
num_active_files 984 Files in current snapshot
vacuumable_bytes 771751936 Bytes eligible for vacuum
num_vacuumable_files 148 Files eligible for vacuum
time_travel_bytes 251658240 Bytes reachable by time travel (excluding active)
num_time_travel_files 100 Files reachable by time travel (excluding active)
請參閱 使用庫存報告。
目錄中所有資料表的運算儲存指標
要計算目錄中每個資料表的儲存指標,且皆使用同一目的地的庫存報告,請使用迴圈。 以下範例列出使用資訊 結構的資料表,每個目錄都會自動包含該結構:
%python
tables = spark.sql("""
SELECT table_catalog, table_schema, table_name
FROM main.information_schema.tables
WHERE table_type IN (
'MANAGED', 'EXTERNAL',
'STREAMING_TABLE', 'MATERIALIZED_VIEW',
'MANAGED_SHALLOW_CLONE', 'EXTERNAL_SHALLOW_CLONE'
)
""").collect()
for t in tables:
full_name = f"{t.table_catalog}.{t.table_schema}.{t.table_name}"
result = spark.sql(f"""
ANALYZE TABLE {full_name} COMPUTE STORAGE METRICS
USING INVENTORY LOCATION 'abfss://your-destination-container@your-storage-account.dfs.core.windows.net/your-prefix/'
CONF 'databricks-inventory-list-config'
""")
result.show()
利用庫存限制
該 USING INVENTORY 條款有以下限制:
- 此子句僅在經典運算上執行。 它不支援無伺服器運算或 Databricks SQL 倉庫。
- 此條款僅支援目錄資料表,包括管理資料表與外部資料表。 它不支援基於路徑的 Delta Lake 表格,這會產生錯誤: ANALYZE_TABLE_COMPUTE_STORAGE_METRICS_NOT_SUPPORTED 錯誤條件。
- 如果在來源桶或容器上啟用了物件版本控制,結果並不保證正確。
- 如果資料表的儲存位置改變,請在新的來源桶或容器重新設定庫存報告。 原本的位置不再為該資料表產生報告。 例如,將外部資料表轉換為受管理資料表時,該資料表的儲存位置會被改變。 請參見「將外部或外來 Delta Lake 資料表轉換為 Unity Catalog 受管理資料表」。
Azure 不支援跨儲存帳號的庫存配置。 如果你的資料表跨越多個儲存帳戶,每個儲存帳戶都需要自己的庫存設定。
筆記本:多個資料表的運算儲存指標
以下筆記本會執行 ANALYZE TABLE ... COMPUTE STORAGE METRICS ... USING INVENTORY 一組 Unity 目錄資料表,並將結果儲存在 Delta Lake 資料表中。 用它來同時分析多張資料表的儲存空間。