資料分割原則

分割原則會定義是否應該針對特定資料表或具體化檢視分割分區 (資料分區) 及其方式。

原則會在建立範圍之後觸發額外的背景程式,並遵循數據擷取。 此程式包括從來源範圍重新擷取數據,併產生 同質 範圍,其中指定為數據分割 索引鍵 的數據行的所有值都位於單一數據分割內。

數據分割原則的主要目標是在特定 支援的案例中增強查詢效能。

注意

根據預設,未定義數據分割原則 (null) 時,範圍會依建立 (擷取) 進行分割。 在大部分情況下,不需要設定數據分割原則。

支援的案例

只有在以下情境才建議設定資料分割原則。 在所有其他情況下,則不建議設定此原則。

  • 中或高基數 stringguid 數據行上的經常篩選
    • 例如:多租使用者解決方案,或計量數據表,其中大部分或所有查詢都會篩選類型 string 為 或 guid的數據行,例如 TenantIdMetricId
    • 中基數至少為 10,000 個相異值。
    • 哈希分割區索引鍵設定為 stringguid 資料行,並將 屬性設定PartitionAssigmentModeuniform
  • 高基數 string 或數據行上的經常匯總或 guid 聯結
    • 例如,來自許多不同感應器的 IoT 資訊,或許多不同學生的學業成績。
    • 高基數至少為 1,000,000 個相異值,其中資料行中的值接近平均分散。
    • 在此情況下,請將雜湊分割索引鍵設定為經常分組或聯結的資料行,並將 PartitionAssigmentMode 屬性設定為 ByPartition
  • 不按照順序的資料擷取
    • 根據表示資料建立時間的特定 datetime 資料行,擷取到資料表中的資料可能不會排序並分割成分區 (資料分區),且通常會用來篩選資料。 這可能是由於來自異質來源文件的回填,這些來源文件包含較長時間範圍的日期時間值。
    • 在此情況下,請將統一範圍日期時間分割索引鍵設定為 datetime 資料行。
    • 如果您需要保留和快取原則,以配合資料行中的日期時間值,而不是與擷取的時間一致,請將 OverrideCreationTime 屬性設定為 true

警告

  • 針對已定義資料分割原則的資料表數目,沒有設定任何硬式編碼的限制。 但是,每個額外的數據表都會對叢集節點上執行的背景數據分割程式增加額外負荷。 在更多數據表上設定原則會導致使用更多叢集資源,以及因為基礎記憶體交易而成本較高。 如需詳細資訊,請參閱容量
  • 如果每個資料分割的資料壓縮大小預期小於 1GB,則不建議設定分割原則。
  • 數據分割進程會導致分割進程和合併程序期間所取代之所有範圍的剩餘儲存成品。 大部分的剩餘儲存成品預期會在自動清除程式期間刪除。 增加 屬性的值 MaxPartitionCount 會增加剩餘記憶體成品的數目,並減少清除效能。
  • 將資料分割原則套用到具體化檢視之前,請先檢閱具體化檢視資料分割原則的相關建議。

資料分割索引鍵

支援下列資料分割索引鍵。

種類 資料行類型 磁碟分割內容 分割值
雜湊 stringguid Function, MaxPartitionCount, Seed, PartitionAssignmentMode Function(ColumnName, MaxPartitionCount, Seed)
統一範圍 datetime RangeSize, Reference, OverrideCreationTime bin_at(ColumnName, RangeSize, Reference)

雜湊分割索引鍵

如果原則包含雜湊資料分割索引鍵,則屬於相同資料分割的所有同質範圍都會指派給叢集中的相同資料節點。

注意

資料分割作業會增加大量的處理負載。 我們建議只在下列情況下,將哈希分割區索引鍵套用至數據表:

  • 如果大部分的查詢都使用相等篩選 (==in())。
  • 大部分查詢會匯總/聯結類型string的特定數據行,或是guid大型維度 (基數為 10M 或更高) ,例如 device_IDuser_ID
  • 分割資料表的使用模式是在高並行查詢負載中,例如監視或儀表板應用程式。
  • 系統會使用雜湊模數函數分割資料。
  • 同質 (資料分割) 分區中的資料會依照雜湊分割索引鍵來排序。
    • 如果資料表上有定義雜湊分割索引鍵,則您不需要將其包含在資料列排序原則中。
  • 使用隨機策略,且 joinsummarizemake-series 中使用的 shuffle key 是資料表雜湊分割索引鍵的查詢,預計會因為跨叢集節點移動所需的資料量減少而執行得更好。

磁碟分割內容

屬性 描述 支援的值 建議值
Function 要使用的雜湊模數函式名稱。 XxHash64
MaxPartitionCount 每一段時間要建立的分割區數目上限 (雜湊模數函數的模數引數)。 介於範圍 (1,2048] 較高的值會導致叢集節點上的資料分割程序有更高的負荷,而且每一段時間的分區數目也會更高。 建議值是 128。 較高的值會大幅增加數據后擷取數據分割的額外負荷,以及元數據的大小,因此不建議這麼做。
Seed 用來隨機化雜湊值。 正整數。 1,也是預設值。
PartitionAssignmentMode 用來將資料分割指派給叢集中節點的模式。 ByPartition:屬於相同資料分割的所有同質 (分割) 分區都會指派給相同的節點。
Uniform:會忽略分區的資料分割值。 分區會統一指派給叢集的節點。
如果查詢未聯結或彙總雜湊資料分割索引鍵,請使用 Uniform。 否則,使用 ByPartition

雜湊分割索引鍵範例

名為 tenant_idstring 類型資料行上的雜湊分割索引鍵。 其使用 XxHash64 雜湊函數,並將 MaxPartitionCount 設定為建議的值 128,並使用預設 Seed1

{
  "ColumnName": "tenant_id",
  "Kind": "Hash",
  "Properties": {
    "Function": "XxHash64",
    "MaxPartitionCount": 128,
    "Seed": 1,
    "PartitionAssignmentMode": "Uniform"
  }
}

統一範圍日期時間分割索引鍵

注意

只有當內嵌到資料表中的資料不太可能根據此資料行排序時,才在資料表的 datetime 類型資料行上套用統一範圍日期時間分割索引鍵。

在這些情況下,您可以重新調整分區之間的資料,讓每個分區都包含有限時間範圍內的記錄。 此程序會導致 datetime 資料行上的篩選在查詢時更有效率。

使用的資料分割函式是 bin_at(),而且無法自訂。

磁碟分割內容

屬性 描述 建議值
RangeSize 指出每個日期時間資料分割大小的 timespan 純量常數。 從值 1.00:00:00 (一天) 開始。 請勿設定較短的值,因為這可能會導致資料表有大量無法合併的小分區。
Reference 表示固定時間點的 datetime 純量常數,根據對齊的日期時間分割區而定。 請從 1970-01-01 00:00:00 開始。 如果有記錄的日期時間分割索引鍵具有 null 值,其分割區值會設定為值 Reference
OverrideCreationTime bool 會指出是否應該以資料分割索引鍵的值範圍覆寫結果分區的最小和最大建立時間。 預設值為 falsetrue如果資料未依抵達時間順序擷取,請將 設定為 。 例如,單一來源檔案可能包含遠距的日期時間值,而且/或您可能想要根據日期時間值強制執行保留或快取,而不是擷取的時間。

當 設定為 trueOverrideCreationTime,可能會遺漏合併程式中的範圍。 如果建立時間比 Lookback 數據表範圍合併原則的期間還舊, 則會遺漏範圍。 若要確定可探索範圍,請將 Lookback 屬性設定為 HotCache

統一範圍日期時間分割區範例

程式碼片段會在名為 timestampdatetime 類型資料行上顯示統一的日期時間範圍資料分割索引鍵。 它會使用 datetime(2021-01-01) 作為其參考點,且每個分割區的大小 7d 為 ,而且不會覆寫範圍的建立時間。

{
  "ColumnName": "timestamp",
  "Kind": "UniformRange",
  "Properties": {
    "Reference": "2021-01-01T00:00:00",
    "RangeSize": "7.00:00:00",
    "OverrideCreationTime": false
  }
}

原則物件

根據預設,數據表的數據分割原則是 null,在此情況下,數據表中的數據在內嵌之後將不會重新分割。

資料分割原則具有下列主要屬性:

  • PartitionKeys

  • EffectiveDateTime

    • 原則生效的 UTC 日期時間。
    • 這是選用屬性。 如果未指定,在套用原則之後,原則將會對內嵌的資料生效。

警告

  • 您可以設定過去的日期時間值,並對已內嵌的資料進行資料分割。 不過,這種作法可能會大幅增加資料分割流程中使用的資源。
  • 在大部分情況下,建議只將新內嵌的資料分割,並避免分割大量的歷程記錄資料。
  • 如果您選擇分割歷程記錄資料,請考慮逐步執行此操作,每次更改策略時將 EffectiveDateTime 設定為之前的 datetime,最多可設定幾天。

資料分割範例

具有兩個資料分割索引鍵的資料分割原則物件。

  1. 名為 tenant_idstring 類型資料行上的雜湊分割索引鍵。
    • 其使用 XxHash64 雜湊函數,並將 MaxPartitionCount 設定為建議的值 128,並使用預設 Seed1
  2. 名為 timestampdatetime 類型資料行上的統一日期時間範圍資料分割索引鍵。
    • 其使用 datetime(2021-01-01) 做為參考點,每個分割區的大小都是 7d
{
  "PartitionKeys": [
    {
      "ColumnName": "tenant_id",
      "Kind": "Hash",
      "Properties": {
        "Function": "XxHash64",
        "MaxPartitionCount": 128,
        "Seed": 1,
        "PartitionAssignmentMode": "Uniform"
      }
    },
    {
      "ColumnName": "timestamp",
      "Kind": "UniformRange",
      "Properties": {
        "Reference": "2021-01-01T00:00:00",
        "RangeSize": "7.00:00:00",
        "OverrideCreationTime": false
      }
    }
  ]
}

其他屬性

下列屬性可以定義為原則的一部分。 這些屬性是選擇性的,建議您不要變更這些屬性。

屬性 描述 建議值 預設值
MinRowCountPerOperation 單一資料分割作業來源分區的資料列計數總和最小目標。 0
MaxRowCountPerOperation 單一資料分割作業來源分區的資料列計數總和最大目標。 如果您看到資料分割作業耗用大量儲存體或每作業 CPU,請將值設定為低於 5M。 0,預設目標為 5,000,000 筆記錄。
MaxOriginalSizePerOperation 單一資料分割作業來源分區的原始大小總和最大目標。 如果資料分割作業耗用大量的記憶體或每作業 CPU,請將值設定為低於 5 GB。 0,預設目標為 5,368,709,120 位元組 (5 GB)。

資料分割流程

  • 資料分割會在叢集中以擷取後的背景程序形式執行。
    • 持續擷取到 的數據表預期一律會有數據「尾」,但尚未分割 (非異質範圍) 。
  • 無論原則中的 EffectiveDateTime 屬性值為何,資料分割都只會在熱分區上執行。
    • 如果需要分割冷分區,您需要暫時調整快取原則

您可以使用 .show 資料庫範圍 數據分割統計數據命令,監視資料庫中已定義原則之數據表的數據分割狀態。

資料分割容量

  • 資料分割流程會導致更多分區建立。 叢集可能會逐漸增加其分區合併容量,以便讓合併分區的流程可以保持運作。
  • 如果擷取輸送量很高,或有足夠大量已定義分割原則的資料表,則叢集可能會逐漸增加其分區合併容量,以便讓資料分割分區的流程可以保持運作。
  • 為了避免耗用太多資源,這些動態增加受到限制。 如果已完全用完,您可能需要逐漸線性地增加到超出上限。
    • 如果增加容量會導致叢集資源的使用顯著增加,您可以手動或透過啟用自動調整來向上/向外擴展叢集。

限制

  • 嘗試分割已超過 5,000,000 個分區的資料庫中的資料將會受到節流。
    • 在這種情況下, EffectiveDateTime 資料庫中數據表的數據分割原則屬性會自動延遲數小時,以便重新評估設定和原則。

分割資料行中的極端值

  • 下列情況可能會對叢集節點上的資料不平衡發佈造成影響,並降低查詢效能:
    • 如果雜湊分割索引鍵所包含的值比其他值更普遍,例如空字串或泛型值 (例如 nullN/A)。
    • 這些值代表實體 (,例如 tenant_id 數據集中較普遍的) 。
  • 如果統一範圍的日期時間分割索引鍵有足夠高比例的值與資料行中大部分的值「大不相同」,則資料分割程序的額外負荷會增加,而且可能會導致叢集需要追蹤許多小型分區。 這類情況的其中一個範例是來自過去或未來的日期時間值。

在這兩種情況下,都可以「修正」資料,或在擷取期間篩選出資料中的任何無關記錄,以減少叢集上資料分割的額外負荷。 例如,使用更新原則