資料分割原則
分割原則會定義是否應該針對特定資料表或具體化檢視分割分區 (資料分區) 及其方式。
原則會在建立範圍之後觸發額外的背景程式,並遵循數據擷取。 此程式包括從來源範圍重新擷取數據,併產生 同質 範圍,其中指定為數據分割 索引鍵 的數據行的所有值都位於單一數據分割內。
數據分割原則的主要目標是在特定 支援的案例中增強查詢效能。
注意
根據預設,未定義數據分割原則 (null
) 時,範圍會依建立 (擷取) 進行分割。 在大部分情況下,不需要設定數據分割原則。
支援的案例
只有在以下情境才建議設定資料分割原則。 在所有其他情況下,則不建議設定此原則。
- 中或高基數
string
或guid
數據行上的經常篩選:- 例如:多租使用者解決方案,或計量數據表,其中大部分或所有查詢都會篩選類型
string
為 或guid
的數據行,例如TenantId
或MetricId
。 - 中基數至少為 10,000 個相異值。
- 將哈希分割區索引鍵設定為
string
或guid
資料行,並將 屬性設定PartitionAssigmentMode
為uniform
。
- 例如:多租使用者解決方案,或計量數據表,其中大部分或所有查詢都會篩選類型
- 高基數
string
或數據行上的經常匯總或guid
聯結:- 例如,來自許多不同感應器的 IoT 資訊,或許多不同學生的學業成績。
- 高基數至少為 1,000,000 個相異值,其中資料行中的值接近平均分散。
- 在此情況下,請將雜湊分割索引鍵設定為經常分組或聯結的資料行,並將
PartitionAssigmentMode
屬性設定為ByPartition
。
- 不按照順序的資料擷取:
- 根據表示資料建立時間的特定
datetime
資料行,擷取到資料表中的資料可能不會排序並分割成分區 (資料分區),且通常會用來篩選資料。 這可能是由於來自異質來源文件的回填,這些來源文件包含較長時間範圍的日期時間值。 - 在此情況下,請將統一範圍日期時間分割索引鍵設定為
datetime
資料行。 - 如果您需要保留和快取原則,以配合資料行中的日期時間值,而不是與擷取的時間一致,請將
OverrideCreationTime
屬性設定為true
。
- 根據表示資料建立時間的特定
警告
- 針對已定義資料分割原則的資料表數目,沒有設定任何硬式編碼的限制。 但是,每個額外的數據表都會對叢集節點上執行的背景數據分割程式增加額外負荷。 在更多數據表上設定原則會導致使用更多叢集資源,以及因為基礎記憶體交易而成本較高。 如需詳細資訊,請參閱容量。
- 如果每個資料分割的資料壓縮大小預期小於 1GB,則不建議設定分割原則。
- 數據分割進程會導致分割進程和合併程序期間所取代之所有範圍的剩餘儲存成品。 大部分的剩餘儲存成品預期會在自動清除程式期間刪除。 增加 屬性的值
MaxPartitionCount
會增加剩餘記憶體成品的數目,並減少清除效能。 - 將資料分割原則套用到具體化檢視之前,請先檢閱具體化檢視資料分割原則的相關建議。
資料分割索引鍵
支援下列資料分割索引鍵。
種類 | 資料行類型 | 磁碟分割內容 | 分割值 |
---|---|---|---|
雜湊 | string 或 guid |
Function , MaxPartitionCount , Seed , PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
統一範圍 | datetime |
RangeSize , Reference , OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
雜湊分割索引鍵
如果原則包含雜湊資料分割索引鍵,則屬於相同資料分割的所有同質範圍都會指派給叢集中的相同資料節點。
注意
資料分割作業會增加大量的處理負載。 我們建議只在下列情況下,將哈希分割區索引鍵套用至數據表:
- 如果大部分的查詢都使用相等篩選 (
==
、in()
)。 - 大部分查詢會匯總/聯結類型
string
的特定數據行,或是guid
大型維度 (基數為 10M 或更高) ,例如device_ID
或user_ID
。 - 分割資料表的使用模式是在高並行查詢負載中,例如監視或儀表板應用程式。
- 系統會使用雜湊模數函數分割資料。
- 同質 (資料分割) 分區中的資料會依照雜湊分割索引鍵來排序。
- 如果資料表上有定義雜湊分割索引鍵,則您不需要將其包含在資料列排序原則中。
- 使用隨機策略,且
join
、summarize
或make-series
中使用的shuffle key
是資料表雜湊分割索引鍵的查詢,預計會因為跨叢集節點移動所需的資料量減少而執行得更好。
磁碟分割內容
屬性 | 描述 | 支援的值 | 建議值 |
---|---|---|---|
Function |
要使用的雜湊模數函式名稱。 | XxHash64 |
|
MaxPartitionCount |
每一段時間要建立的分割區數目上限 (雜湊模數函數的模數引數)。 | 介於範圍 (1,2048] 。 |
較高的值會導致叢集節點上的資料分割程序有更高的負荷,而且每一段時間的分區數目也會更高。 建議值是 128 。 較高的值會大幅增加數據后擷取數據分割的額外負荷,以及元數據的大小,因此不建議這麼做。 |
Seed |
用來隨機化雜湊值。 | 正整數。 | 1 ,也是預設值。 |
PartitionAssignmentMode |
用來將資料分割指派給叢集中節點的模式。 | ByPartition :屬於相同資料分割的所有同質 (分割) 分區都會指派給相同的節點。 Uniform :會忽略分區的資料分割值。 分區會統一指派給叢集的節點。 |
如果查詢未聯結或彙總雜湊資料分割索引鍵,請使用 Uniform 。 否則,使用 ByPartition 。 |
雜湊分割索引鍵範例
名為 tenant_id
的 string
類型資料行上的雜湊分割索引鍵。
其使用 XxHash64
雜湊函數,並將 MaxPartitionCount
設定為建議的值 128
,並使用預設 Seed
值 1
。
{
"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 會指出是否應該以資料分割索引鍵的值範圍覆寫結果分區的最小和最大建立時間。 |
預設值為 false 。 true 如果資料未依抵達時間順序擷取,請將 設定為 。 例如,單一來源檔案可能包含遠距的日期時間值,而且/或您可能想要根據日期時間值強制執行保留或快取,而不是擷取的時間。當 設定為 true 時OverrideCreationTime ,可能會遺漏合併程式中的範圍。 如果建立時間比 Lookback 數據表範圍合併原則的期間還舊, 則會遺漏範圍。 若要確定可探索範圍,請將 Lookback 屬性設定為 HotCache 。 |
統一範圍日期時間分割區範例
程式碼片段會在名為 timestamp
的 datetime
類型資料行上顯示統一的日期時間範圍資料分割索引鍵。
它會使用 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:
- 資料分割索引鍵的集合,定義如何分割資料表中的資料。
- 資料表可具有最多
2
個資料分割索引鍵,並具有下列其中一個選項:- 一個雜湊分割索引鍵。
- 一個統一範圍日期時間分割索引鍵。
- 一個雜湊資料分割索引鍵和一個統一範圍日期時間分割索引鍵。
- 每個資料分割索引鍵都具有下列屬性:
ColumnName
:string
- 資料行名稱,系統將根據此名稱進行資料分割。Kind
:string
- 要套用的資料分割種類 (Hash
或UniformRange
)。Properties
:property bag
- 根據完成的資料分割定義參數。
EffectiveDateTime:
- 原則生效的 UTC 日期時間。
- 這是選用屬性。 如果未指定,在套用原則之後,原則將會對內嵌的資料生效。
警告
- 您可以設定過去的日期時間值,並對已內嵌的資料進行資料分割。 不過,這種作法可能會大幅增加資料分割流程中使用的資源。
- 在大部分情況下,建議只將新內嵌的資料分割,並避免分割大量的歷程記錄資料。
- 如果您選擇分割歷程記錄資料,請考慮逐步執行此操作,每次更改策略時將 EffectiveDateTime 設定為之前的
datetime
,最多可設定幾天。
資料分割範例
具有兩個資料分割索引鍵的資料分割原則物件。
- 名為
tenant_id
的string
類型資料行上的雜湊分割索引鍵。- 其使用
XxHash64
雜湊函數,並將MaxPartitionCount
設定為建議的值128
,並使用預設Seed
值1
。
- 其使用
- 名為
timestamp
的datetime
類型資料行上的統一日期時間範圍資料分割索引鍵。- 其使用
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
資料庫中數據表的數據分割原則屬性會自動延遲數小時,以便重新評估設定和原則。
- 在這種情況下,
分割資料行中的極端值
- 下列情況可能會對叢集節點上的資料不平衡發佈造成影響,並降低查詢效能:
- 如果雜湊分割索引鍵所包含的值比其他值更普遍,例如空字串或泛型值 (例如
null
或N/A
)。 - 這些值代表實體 (,例如
tenant_id
數據集中較普遍的) 。
- 如果雜湊分割索引鍵所包含的值比其他值更普遍,例如空字串或泛型值 (例如
- 如果統一範圍的日期時間分割索引鍵有足夠高比例的值與資料行中大部分的值「大不相同」,則資料分割程序的額外負荷會增加,而且可能會導致叢集需要追蹤許多小型分區。 這類情況的其中一個範例是來自過去或未來的日期時間值。
在這兩種情況下,都可以「修正」資料,或在擷取期間篩選出資料中的任何無關記錄,以減少叢集上資料分割的額外負荷。 例如,使用更新原則。
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應