資料跳過

Note

在 Databricks 執行 13.3 及以上版本中,Databricks 建議使用液態叢集來進行資料表佈局。 叢集與 Z 順序不相容。 請參閱 針對數據表使用液體叢集

當您將資料寫入 Delta Lake 或受管理的 Apache Iceberg 資料表時,系統會自動收集資料跳過統計資訊。 Azure Databricks 在查詢時會使用每個檔案的統計資料(最小值與最大值、空值計數及總記錄數),以跳過無關檔案並加速查詢。

您必須收集用於 ZORDER 語句的欄位統計資訊。 請參閱 什麼是 Z 排序?

指定統計欄位

對於 Unity Catalog 外部資料表,統計資料預設會收集在你資料表結構中定義的前 32 欄。 對於 Unity Catalog 管理的資料表,跳檔統計數據透過預測優化進行智能選擇,並且不受 32 欄的限制。 預測最佳化會自動執行 ANALYZE,這是收集統計資料的指令。 Databricks 建議為所有 Unity 目錄受控數據表啟用預測優化,以簡化數據維護並減少記憶體成本。 請參閱 Unity Catalog 管理資料表的預測性優化

如果你沒有使用預測優化,可以透過設定以下表格屬性之一來修改限制統計資料集 32 欄的行為:

表格屬性 支援 Databricks Runtime Description
dataSkippingNumIndexedCols 所有支援的 Databricks 執行環境版本 可增加或減少統計資料收集欄位的數量。 取決於數據行順序。
dataSkippingStatsColumns Databricks Runtime 13.3 LTS 以及其後的版本 指定一個清單,其中包含要收集統計資料的欄位名稱。 由dataSkippingNumIndexedCols取代。

數據表屬性可以在數據表建立時設定,或使用 ALTER TABLE 語句來設定。 詳見 資料表屬性參考。 下列範例會覆寫默認統計數據集合行為,以在具名數據行上設定統計數據集合:

三角洲湖

ALTER TABLE table_name SET TBLPROPERTIES('delta.dataSkippingStatsColumns' = 'col1, col2, col3')

冰山表

ALTER TABLE table_name SET TBLPROPERTIES('iceberg.dataSkippingStatsColumns' = 'col1, col2, col3')

更新這些屬性並不會自動重新計算現有資料的統計數據。 相反地,它會在加入或更新數據表中的數據時影響未來統計數據集合的行為。 統計資料不會用於目前統計欄位清單中未包含的欄位。

在 Databricks Runtime 14.3 LTS 及以上版本中,如果您已更改資料表屬性或更改統計欄位,您可以使用以下指令手動觸發資料表的統計重算:

ANALYZE TABLE table_name COMPUTE DELTA STATISTICS

Note

在統計數據收集期間,會截斷長字串。 您可以選擇從統計數據集合中排除長字串數據行,特別是當數據行不常用於篩選查詢時。

什麼是 Z 排序?

Note

Databricks 建議所有新增資料表都使用 liquid 叢集。 你不能 ZORDER 和液體聚類一起使用。 請參閱 針對數據表使用液體叢集

Z 排序是一種 技術,用來 將相關資訊共置在同一組檔案中。 Azure Databricks 的資料跳過演算法會自動利用這種共在地性。 這種行為減少了需要讀取的資料量。 進行 Z 順序排列資料時,請在 ZORDER BY 語句中指定排序的欄位:

OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType)

如果您預期在查詢條件中通常會使用某個資料行,並且該資料行具有高基數(也就是相異的值數量很多),請使用 ZORDER BY

您可以將多個欄指定給 ZORDER BY,並以逗號分隔來列出。 然而,每多一欄,效能就會下降。

Databricks 建議不要在沒有統計資料收集的欄位使用 ZORDER BY ,因為這樣效率低且會消耗不必要的運算資源。 跳過資料需要欄位局部統計,例如最小值、最大值和計數值。 您可以藉由重新排序架構中的數據行來設定特定數據行的統計數據收集,也可以增加要收集統計數據的數據行數目。

Note

  • Z 排序 不是等冪, 而是要做為累加作業。 Z排序所需的時間不保證多次執行會縮短。 然而,如果一個僅是 Z 順序的分割沒有新增資料,那麼該分割區再進行一次 Z 排序也不會有任何影響。

  • Z 排序法旨在產生就元組數量而言分布均衡的資料檔案,但就儲存體中的資料大小而言則不一定。 雖然檔案大小與元組數量彼此相關,但在某些情況下兩者可能並非如此,因而使最佳化任務的耗時產生偏差。

    例如,如果您使用ZORDER BYdate,而且最近的記錄都比過去寬得多(例如陣列或字串值較長),OPTIMIZE 工作的任務持續時間和產生的檔案大小可能會失真。 不過這只對指令本身有問題 OPTIMIZE ;通常不會對後續查詢產生負面影響。