Zásady dělení
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer
Zásady dělení definují, jestli a jak se mají rozsahy (horizontální oddíly dat) dělit pro konkrétní tabulku nebo materializované zobrazení.
Zásady aktivují další proces na pozadí, který se provádí po vytvoření rozsahů po příjmu dat. Tento proces zahrnuje reingestování dat ze zdrojových rozsahů a vytváření homogenních rozsahů, ve kterých se všechny hodnoty sloupce určeného jako klíč oddílu nacházejí v jednom oddílu.
Hlavním cílem zásad dělení je zvýšit výkon dotazů v konkrétních podporovaných scénářích.
Poznámka:
Ve výchozím nastavení platí, že pokud není definována zásada dělení dat (je null
), rozsahy se dělí podle času vytvoření (příjmu dat). Ve většině případů není nutné nastavovat zásady dělení dat.
Podporované scénáře
Tady jsou jediné scénáře, ve kterých se doporučuje nastavení zásad dělení dat. Ve všechostatníchch
-
Časté filtry pro střední nebo vysokou kardinalitu
string
neboguid
sloupec:- Příklad: víceklientová řešení nebo tabulka metrik, kde většina nebo všechny dotazy filtrují sloupec typu
string
nebo , například neboguid
TenantId
.MetricId
- Střední kardinalita je alespoň 10 000 jedinečných hodnot.
- Nastavte klíč oddílu
uniform
- Příklad: víceklientová řešení nebo tabulka metrik, kde většina nebo všechny dotazy filtrují sloupec typu
-
Časté agregace nebo spojení ve vysoké kardinalitě
string
neboguid
sloupci:- Například informace o IoT z mnoha různých senzorů nebo akademické záznamy mnoha různých studentů.
- Vysoká kardinalita je alespoň 1 000 000 jedinečných hodnot, kde rozdělení hodnot ve sloupci je přibližně sudé.
- V tomto případě nastavte klíč oddílu
ByPartition
-
Příjem dat mimo pořadí:
- Data ingestovaná do tabulky nemusí být seřazená a rozdělená do rozsahů (horizontálních oddílů) podle konkrétního
datetime
sloupce, který představuje čas vytvoření dat a běžně se používá k filtrování dat. Důvodem může být backfill z heterogenních zdrojových souborů, které obsahují hodnoty data a času v průběhu velkého časového rozsahu. - V tomto případě nastavte klíč oddílu datetime v jednotném rozsahu
datetime
jako sloupec. - Pokud potřebujete zásady uchovávání informací a ukládání do mezipaměti, aby byly v souladu s hodnotami data a času ve sloupci, místo toho, aby odpovídaly času příjmu dat, nastavte
OverrideCreationTime
vlastnost natrue
hodnotu .
- Data ingestovaná do tabulky nemusí být seřazená a rozdělená do rozsahů (horizontálních oddílů) podle konkrétního
Upozornění
- Pro počet tabulek s definovanými zásadami dělení nejsou nastavené žádné pevně zakódované limity. Každá další tabulka ale přidává režijní náklady na proces dělení dat na pozadí. Nastavení zásad u více tabulek bude mít za následek použití více prostředků a vyšší náklady kvůli základním transakcím úložiště. Další informace najdete v tématu kapacita.
- Pokud se očekává, že komprimovaná velikost dat na oddíl bude menší než 1 GB, nedoporučuje se nastavit zásady dělení.
- Proces dělení vede k artefaktům zbytkového úložiště pro všechny rozsahy nahrazené během procesu dělení a během procesu sloučení. Většina artefaktů zbytkového úložiště se očekává, že se během procesu automatického čištění odstraní. Zvýšení hodnoty
MaxPartitionCount
vlastnosti zvyšuje počet artefaktů zbytkového úložiště a může snížit výkon čištění. - Před použitím zásad dělení na materializované zobrazení si projděte doporučení pro materializovaná zobrazení zásad dělení.
Klíče oddílu
Podporují se následující typy klíčů oddílů.
Kind | Typ sloupce | Vlastnosti oddílu | Hodnota oddílu |
---|---|---|---|
Hash |
string nebo guid |
Function , MaxPartitionCount , , Seed PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
Jednotný rozsah | datetime |
RangeSize , , Reference OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
Klíč oddílu hash
Pokud zásada obsahuje klíč oddílu hash, všechny homogenní rozsahy, které patří do stejného oddílu, se přiřadí stejnému datovému uzlu.
Poznámka:
Operace dělení dat přidává významné zatížení zpracování. Pro tabulku doporučujeme použít klíč oddílu hash pouze za následujících podmínek:
- Pokud většina dotazů používá filtry rovnosti (
==
,in()
). - Většina dotazů agreguje nebo spojuje konkrétní sloupec typu
string
nebo který máguid
(kardinalitu 10 M nebo vyšší), například nebodevice_ID
.user_ID
- Vzor použití dělených tabulek je ve vysokém zatížení dotazů souběžnosti, například při monitorování nebo řídicích panelech aplikací.
- Funkce hash-modulo slouží k rozdělení dat.
- Data v homogenních (dělených) rozsahech se řadí podle klíče oddílu hash.
- Pokud je klíč oddílu hash definovaný v tabulce, nemusíte do zásad pořadí řádků zahrnout klíč hash.
- Dotazy, které používají strategii náhodného
make-series
Vlastnosti oddílu
Vlastnost | Popis | Podporované hodnoty | Doporučená hodnota |
---|---|---|---|
Function |
Název funkce hash-modulo, která se má použít. | XxHash64 |
|
MaxPartitionCount |
Maximální počet oddílů, které se mají vytvořit (argument modulo funkce hash-modulo) za časové období. | V rozsahu (1,2048] . |
Vyšší hodnoty vedou k větší režii procesu dělení dat a vyššího počtu rozsahů pro každé časové období. Doporučená hodnota je 128 . Vyšší hodnoty výrazně zvýší režii při dělení dat po příjmu dat a velikost metadat , a proto se nedoporučují. |
Seed |
Slouží k náhodnému určení hodnoty hash. | Kladné celé číslo. |
1 , což je také výchozí hodnota. |
PartitionAssignmentMode |
Režim použitý k přiřazování oddílů uzlům. |
ByPartition : Všechny homogenní (dělené) rozsahy, které patří do stejného oddílu, jsou přiřazeny stejnému uzlu. Uniform : Hodnoty oddílů rozsahů jsou ignorovány. Rozsahy jsou k uzlům přiřazeny jednotně. |
Pokud se dotazy nepřipojují nebo agregují s klíčem oddílu hash, použijte Uniform . V opačném případě použijte ByPartition . |
Příklad klíče oddílu hash
Hash partition key over a string
-typed column named tenant_id
.
Používá XxHash64
funkci hash s MaxPartitionCount
nastavenou na doporučenou hodnotu 128
a výchozí hodnotu Seed
1
.
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Uniform range datetime partition key
Poznámka:
Klíč oddílu datetime s jednotným rozsahem použijte pouze u datetime
sloupce typu -typed v tabulce, pokud se data ingestovaná do tabulky pravděpodobně nebudou řadit podle tohoto sloupce.
V těchto případech můžete data mezi rozsahy přemístit tak, aby každý rozsah obsahoval záznamy z omezeného časového rozsahu. Tento proces vede k datetime
efektivnějšímu filtrování sloupce v době dotazu.
Použitá funkce oddílu je bin_at() a není přizpůsobitelná.
Vlastnosti oddílu
Vlastnost | Popis | Doporučená hodnota |
---|---|---|
RangeSize |
timespan Skalární konstanta, která označuje velikost každého oddílu data a času. |
Začněte hodnotou 1.00:00:00 (jeden den). Nenastavujte kratší hodnotu, protože může vést k tomu, že tabulka má velký počet malých rozsahů, které nelze sloučit. |
Reference |
Skalární konstanta datetime označující pevný bod v čase, podle kterého jsou oddíly datetime zarovnány. |
Začněte s 1970-01-01 00:00:00 . Pokud existují záznamy, ve kterých má klíč null oddílu datetime hodnoty, jejich hodnota oddílu je nastavena na hodnotu Reference . |
OverrideCreationTime |
Určuje bool , zda se minimální a maximální doba vytvoření rozsahu výsledku má přepsat rozsahem hodnot v klíči oddílu. |
Výchozí hodnota false je . Nastavte na true to, jestli se data neingestují v pořadí od příjezdu. Jeden zdrojový soubor může například obsahovat hodnoty datetime, které jsou vzdálené, nebo můžete chtít vynutit uchovávání dat nebo ukládání do mezipaměti na základě hodnot data a času, nikoli času příjmu dat.Pokud OverrideCreationTime je nastavena na true , rozsahy mohou být vynechány v procesu sloučení. Rozsahy se zmešká, pokud je jejich čas vytvoření starší než Lookback období zásad sloučení rozsahů tabulky. Chcete-li zajistit, aby rozsahy byly zjistitelné, nastavte Lookback vlastnost na HotCache hodnotu . |
Příklad oddílu datetime v jednotném rozsahu
Fragment kódu ukazuje klíč oddílu rozsahu data a času přes datetime
zadaný sloupec s názvem timestamp
.
Používá datetime(2021-01-01)
se jako referenční bod s velikostí 7d
každého oddílu a nepřepíše časy vytváření rozsahů.
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
Objekt zásad
Ve výchozím nastavení zásady dělení dat tabulky jsou null
, v takovém případě se data v tabulce po ingestování nepředělá.
Zásady dělení dat mají následující hlavní vlastnosti:
PartitionKeys:
- Kolekce klíčů oddílů, které definují, jak rozdělit data v tabulce.
- Tabulka může mít až klíče
2
oddílů s jednou z následujících možností: - Každý klíč oddílu má následující vlastnosti:
-
ColumnName
:string
– Název sloupce, podle kterého budou data rozdělena. -
Kind
:string
– Druh dělení dat, který se má použít (Hash
neboUniformRange
). -
Properties
:property bag
– Definuje parametry podle toho, které dělení se provádí.
-
EffectiveDateTime:
- Datum a čas UTC, ze kterého je zásada platná.
- Tato vlastnost je nepovinná. Pokud není zadaný, zásada se projeví pro data ingestovaná po použití zásady.
Upozornění
- Hodnotu data a času můžete nastavit v minulosti a dělit už ingestovaná data. Tento postup ale může výrazně zvýšit prostředky používané v procesu dělení.
- Ve většině případů se doporučuje mít pouze nově ingestovaná data rozdělená na oddíly a vyhnout se dělení velkých objemů historických dat.
- Pokud se rozhodnete rozdělit historická data, zvažte to postupně tak, že nastavíte EffectiveDateTime na předchozí
datetime
v krocích až několik dní pokaždé, když zásadu změníte.
Příklad dělení dat
Objekt zásad dělení dat se dvěma klíči oddílu.
- Hash partition key over a
string
-typed column namedtenant_id
.- Používá
XxHash64
funkci hash sMaxPartitionCount
nastavenou na doporučenou hodnotu128
a výchozí hodnotuSeed
1
.
- Používá
- Uniform datetime range partition key over a
datetime
type column namedtimestamp
.- Používá
datetime(2021-01-01)
se jako referenční bod s velikostí každého oddílu7d
.
- Používá
{
"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
}
}
]
}
Další vlastnosti
Následující vlastnosti lze definovat jako součást zásad. Tyto vlastnosti jsou volitelné a nedoporučujeme je měnit.
Vlastnost | Popis | Doporučená hodnota | Default value |
---|---|---|---|
MinRowCountPerOperation | Minimální cíl pro součet počtu řádků zdrojových rozsahů jedné operace dělení dat. | 0 |
|
MaxRowCountPerOperation | Maximální cíl pro součet počtu řádků zdrojových rozsahů jedné operace dělení dat. | Pokud zjistíte, že operace dělení spotřebovávají velké množství paměti nebo procesoru na operaci, nastavte hodnotu nižší než 5 M. |
0 , s výchozím cílem 5 000 000 záznamů. |
MaxOriginalSizePerOperation | Maximální cíl pro součet původní velikosti (v bajtech) zdrojových rozsahů jedné operace dělení dat. | Pokud operace dělení spotřebovávají velké množství paměti nebo procesoru na operaci, nastavte hodnotu nižší než 5 GB. |
0 , s výchozím cílem 5 368 709 120 bajtů (5 GB). |
Proces dělení dat
- Dělení dat se spouští jako proces po příjmu dat na pozadí.
- Očekává se, že tabulka, do které se průběžně ingestuje, bude mít vždy "ocas" dat, která se ještě mají dělit (nehomogenní rozsahy).
- Dělení dat se spouští pouze v horkých rozsahech bez ohledu na hodnotu
EffectiveDateTime
vlastnosti v zásadách.- Pokud je vyžadováno dělení studených rozsahů, je nutné dočasně upravit zásady ukládání do mezipaměti.
Stav dělení tabulek s definovanými zásadami v databázi můžete monitorovat pomocí příkazu .show database extents partitioning statistics a partitioning metrics.
Dělení kapacity
Proces dělení dat vede k vytvoření více rozsahů. Kapacity sloučení se můžou postupně zvyšovat, aby proces sloučení rozsahů mohl zůstat vzhůru.
Pokud existuje vysoká propustnost příjmu dat nebo dostatek velkého počtu tabulek, které mají definované zásady dělení, může se kapacita oddílu Extents postupně zvýšit, aby proces rozsahů dělení mohl zůstat vzhůru.
- Aby se zabránilo spotřebě příliš velkého množství prostředků, jsou tyto dynamické nárůsty omezené. Možná budete muset postupně a lineárně je zvýšit nad rámec limitu, pokud jsou zcela využity.
- Pokud zvýšení kapacit způsobí významné zvýšení využití prostředků clusteru, můžete vertikálně navýšit/ kapacitu clusteru ručně nebo povolením automatického škálování.
Omezení
- Pokusy o dělení dat v databázi, která už má více než 5 000 000 rozsahů, budou omezeny.
- V takových případech
EffectiveDateTime
se vlastnost zásad dělení tabulek v databázi automaticky zpozdí o několik hodin, abyste mohli znovu vyhodnotit konfiguraci a zásady.
- V takových případech
Odlehlé hodnoty v dělených sloupcích
- Následující situace můžou přispět k nevyvážené distribuci dat mezi uzly a snížení výkonu dotazů:
- Pokud klíč oddílu hash obsahuje hodnoty, které jsou mnohem častější než jiné, například prázdný řetězec nebo obecná hodnota (například
null
).N/A
- Hodnoty představují entitu (například
tenant_id
), která je v datové sadě obecnější.
- Pokud klíč oddílu hash obsahuje hodnoty, které jsou mnohem častější než jiné, například prázdný řetězec nebo obecná hodnota (například
- Pokud má klíč oddílu datetime v jednotném rozsahu dostatečně velké procento hodnot, které jsou "daleko" od většiny hodnot ve sloupci, zvýší se režie procesu dělení dat a může vést k mnoha malým rozsahům, aby bylo možné sledovat. Příkladem takové situace jsou hodnoty data a času ze vzdálené minulosti nebo budoucnosti.
Vobouch datech v obou těchto případech buď "opravte" data, nebo vyfiltrujte všechny irelevantní záznamy v datech před nebo v době příjmu dat, abyste snížili režijní náklady na dělení dat. Použijte například zásadu aktualizace.