Partitioneringsprincip
Gäller för: ✅Microsoft Fabric✅Azure Data Explorer
Partitioneringsprincipen definierar om och hur omfattningar (datashards) ska partitioneras för en specifik tabell eller en materialiserad vy.
Principen utlöser ytterligare en bakgrundsprocess som äger rum efter skapandet av omfattningar, efter datainmatning. Den här processen omfattar att flytta data från källutbredningen och producera homogena omfattningar, där alla värden i kolumnen som anges som partitionsnyckel finns i en enda partition.
Det primära målet med partitioneringsprincipen är att förbättra frågeprestanda i specifika scenarier som stöds.
Not
När en princip för datapartitionering inte har definierats (är null
) partitioneras som standard utsträckningen när den skapas (inmatning). I de flesta fall behöver du inte ange en princip för datapartitionering.
Scenarier som stöds
Följande är de enda scenarier där du bör ange en princip för datapartitionering. I alla andra scenarier rekommenderas inte att du anger principen.
-
Frekventa filter med medelhög eller hög kardinalitet
string
ellerguid
kolumn:- Till exempel: lösningar för flera klientorganisationer eller en måtttabell där de flesta eller alla frågor filtrerar på en kolumn av typen
string
ellerguid
, till exempelTenantId
ellerMetricId
. - Medel kardinalitet är minst 10 000 distinkta värden.
- Ange hashpartitionsnyckeln som kolumnen
string
ellerguid
och ange egenskapenPartitionAssignmentMode
tilluniform
.
- Till exempel: lösningar för flera klientorganisationer eller en måtttabell där de flesta eller alla frågor filtrerar på en kolumn av typen
-
Frekventa aggregeringar eller kopplingar med hög kardinalitet
string
ellerguid
kolumn:- Till exempel IoT-information från många olika sensorer eller akademiska poster för många olika studenter.
- Hög kardinalitet är minst 1 000 000 distinkta värden, där fördelningen av värden i kolumnen är ungefär jämn.
- I det här fallet anger du hashpartitionsnyckeln vara kolumnen som ofta grupperas efter eller är ansluten och anger egenskapen
PartitionAssignmentMode
tillByPartition
.
-
datainmatning i fel ordning:
- Data som matas in i en tabell kanske inte sorteras och partitioneras i omfattningar (shards) enligt en specifik
datetime
kolumn som representerar datagenereringstiden och som ofta används för att filtrera data. Detta kan bero på en återfyllnad från heterogena källfiler som innehåller datetime-värden under ett stort tidsintervall. - I det här fallet anger du datetime-partitionsnyckel för enhetligt intervall vara kolumnen
datetime
. - Om du behöver kvarhållnings- och cachelagringsprinciper för att justera med datetime-värdena i kolumnen, i stället för att justera med tiden för inmatning, anger du egenskapen
OverrideCreationTime
tilltrue
.
- Data som matas in i en tabell kanske inte sorteras och partitioneras i omfattningar (shards) enligt en specifik
Försiktighet
- Det finns inga hårdkodade gränser för antalet tabeller med partitioneringsprincipen definierad. Men varje ytterligare tabell lägger till omkostnader för partitioneringsprocessen för bakgrundsdata. Om du anger en princip för fler tabeller kommer fler resurser att användas och högre kostnader på grund av underliggande lagringstransaktioner. Mer information finns i kapacitet.
- Vi rekommenderar inte att du anger en partitioneringsprincip om den komprimerade storleken på data per partition förväntas vara mindre än 1 GB.
- Partitioneringsprocessen resulterar i kvarstående lagringsartefakter för alla de utsträckningar som ersätts under partitioneringsprocessen och under sammanslagningsprocessen. De flesta kvarstående lagringsartefakter förväntas tas bort under den automatiska rensningsprocessen. Om du ökar värdet för egenskapen
MaxPartitionCount
ökar antalet kvarstående lagringsartefakter och kan rensningsprestandan minskas. - Innan du tillämpar en partitioneringsprincip i en materialiserad vy bör du granska rekommendationerna för materialiserade vyer partitioneringsprincipen.
Partitionsnycklar
Följande typer av partitionsnycklar stöds.
Sort | Kolumntyp | Partitionsegenskaper | Partitionsvärde |
---|---|---|---|
Hash |
string eller guid |
Function , MaxPartitionCount , Seed , PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
Enhetligt intervall | datetime |
RangeSize , Reference , OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
Hashpartitionsnyckel
Om principen innehåller en hashpartitionsnyckel tilldelas alla homogena omfattningar som tillhör samma partition till samma datanod.
Not
Datapartitioneringsåtgärden lägger till betydande bearbetningsbelastning. Vi rekommenderar att du endast tillämpar en hash-partitionsnyckel på en tabell under följande villkor:
- Om de flesta frågor använder likhetsfilter (
==
,in()
). - Majoriteten av frågorna aggregeras/kopplas till en viss kolumn av typen
string
ellerguid
som är av med stor dimension (kardinalitet på 10 M eller högre), till exempel endevice_ID
elleruser_ID
. - Användningsmönstret för de partitionerade tabellerna är i hög samtidighetsfrågebelastning, till exempel i övervaknings- eller instrumentpanelsprogram.
- En hash-modulo-funktion används för att partitionering av data.
- Data i homogena (partitionerade) omfattningar sorteras efter hashpartitionsnyckeln.
- Du behöver inte inkludera hashpartitionsnyckeln i radordningsprincipen, om en definieras i tabellen.
- Frågor som använder shuffle-strategin, och där
shuffle key
som används ijoin
,summarize
ellermake-series
är tabellens hashpartitionsnyckel, förväntas fungera bättre eftersom mängden data som krävs för att flytta mellan noder minskar.
Partitionsegenskaper
Egenskap | Beskrivning | Värde som stöds | Rekommenderat värde |
---|---|---|---|
Function |
Namnet på en hash-modulo-funktion som ska användas. | XxHash64 |
|
MaxPartitionCount |
Det maximala antalet partitioner som ska skapas (modulo-argumentet till funktionen hash-modulo) per tidsperiod. | I intervallet (1,2048] . |
Högre värden leder till större omkostnader för datapartitioneringsprocessen och ett högre antal omfattningar för varje tidsperiod. Det rekommenderade värdet är 128 . Högre värden ökar avsevärt omkostnaderna för partitionering av data efter inmatning och storleken på metadata – och rekommenderas därför inte. |
Seed |
Används för att randomisera hash-värdet. | Ett positivt heltal. |
1 , som också är standardvärdet. |
PartitionAssignmentMode |
Det läge som används för att tilldela partitioner till noder. |
ByPartition : Alla homogena (partitionerade) omfattningar som tillhör samma partition tilldelas till samma nod. Uniform : Partitionsvärdena för en omfattning ignoreras. Omfattningar tilldelas enhetligt till noderna. |
Om frågor inte ansluter eller aggregerar på hashpartitionsnyckeln använder du Uniform . Annars använder du ByPartition . |
Exempel på hashpartitionsnyckel
En hashpartitionsnyckel över en string
-typad kolumn med namnet tenant_id
.
Den använder funktionen XxHash64
hash med MaxPartitionCount
inställt på det rekommenderade värdet 128
och standard Seed
för 1
.
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Partitionsnyckel för enhetligt intervalldatumtid
Not
Använd endast en datetime-partitionsnyckel för enhetligt intervall på en datetime
-typad kolumn i en tabell när data som matas in i tabellen sannolikt inte kommer att sorteras enligt den här kolumnen.
I dessa fall kan du omfördefiniera data mellan omfattningar så att varje omfattning innehåller poster från ett begränsat tidsintervall. Den här processen resulterar i att filter i kolumnen datetime
blir effektivare vid frågetillfället.
Partitionsfunktionen som används är bin_at() och är inte anpassningsbar.
Partitionsegenskaper
Egenskap | Beskrivning | Rekommenderat värde |
---|---|---|
RangeSize |
En timespan skalär konstant som anger storleken på varje datetime-partition. |
Börja med värdet 1.00:00:00 (en dag). Ange inte ett kortare värde eftersom det kan leda till att tabellen har ett stort antal små omfattningar som inte kan sammanfogas. |
Reference |
En datetime skalär konstant som anger en fast tidpunkt, beroende på vilken datetime-partitioner som är justerade. |
Börja med 1970-01-01 00:00:00 . Om det finns poster där datetime-partitionsnyckeln har null värden anges deras partitionsvärde till värdet för Reference . |
OverrideCreationTime |
Ett bool som anger om resultatomfångets minsta och högsta skapandetider ska åsidosättas av intervallet för värdena i partitionsnyckeln. |
Standardvärdet är false . Ange till true om data inte matas in i ordning efter ankomsttid. En enskild källfil kan till exempel innehålla datetime-värden som är avlägsna och/eller så kanske du vill framtvinga kvarhållning eller cachelagring baserat på datetime-värdena i stället för tiden för inmatning.När OverrideCreationTime är inställt på true kan du missa omfattningen i sammanslagningsprocessen. Omfattningar missas om deras skapandetid är äldre än den Lookback perioden för tabellens Omfångssammanslagningsprincip. Ange egenskapen Lookback till HotCache för att säkerställa att omfattningen kan identifieras. |
Exempel på datetime-partition för enhetligt intervall
Kodfragmentet visar en partitionsnyckel för enhetligt datetime-intervall över en datetime
kolumn med namnet timestamp
.
Den använder datetime(2021-01-01)
som referenspunkt, med en storlek på 7d
för varje partition, och åsidosätter inte skapandetiderna för omfattningen.
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
Principobjektet
Som standard är en tabells princip för datapartitionering null
, i vilket fall data i tabellen inte partitioneras om när de har matats in.
Principen för datapartitionering har följande huvudegenskaper:
PartitionKeys:
- En samling partitionsnycklar som definierar hur data ska partitioneras i tabellen.
- En tabell kan ha upp till
2
partitionsnycklar med något av följande alternativ: - Varje partitionsnyckel har följande egenskaper:
-
ColumnName
:string
– namnet på kolumnen enligt vilken data ska partitioneras. -
Kind
:string
– Datapartitioneringstypen som ska tillämpas (Hash
ellerUniformRange
). -
Properties
:property bag
– Definierar parametrar enligt vilka partitionering utförs.
-
EffectiveDateTime:
- UTC-datetime som principen gäller från.
- Den här egenskapen är valfri. Om den inte anges börjar principen gälla för data som matas in efter att principen har tillämpats.
Försiktighet
- Du kan ange ett datetime-värde tidigare och partitionerade data som redan har matats in. Den här metoden kan dock avsevärt öka de resurser som används i partitioneringsprocessen.
- I de flesta fall rekommenderar vi att endast nyligen inmatade data partitioneras och att du undviker att partitionera stora mängder historiska data.
- Om du väljer att partitionera historiska data bör du överväga att göra det gradvis genom att ange EffectiveDateTime- till en tidigare
datetime
i steg på upp till några dagar varje gång du ändrar principen.
Exempel på datapartitionering
Principobjekt för datapartitionering med två partitionsnycklar.
- En hashpartitionsnyckel över en
string
-typad kolumn med namnettenant_id
.- Den använder funktionen
XxHash64
hash medMaxPartitionCount
inställt på det rekommenderade värdet128
och standardSeed
för1
.
- Den använder funktionen
- En partitionsnyckel för enhetligt datetime-intervall över en kolumn av
datetime
typ med namnettimestamp
.- Den använder
datetime(2021-01-01)
som referenspunkt, med storleken7d
för varje partition.
- Den använder
{
"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
}
}
]
}
Ytterligare egenskaper
Följande egenskaper kan definieras som en del av principen. De här egenskaperna är valfria och vi rekommenderar att du inte ändrar dem.
Egenskap | Beskrivning | Rekommenderat värde | Standardvärde |
---|---|---|---|
MinRowCountPerOperation | Minsta mål för summan av radantalet för källutbredningen för en enskild datapartitioneringsåtgärd. | 0 |
|
MaxRowCountPerOperation | Maximalt mål för summan av radantalet för källutbredningen för en enskild datapartitioneringsåtgärd. | Ange ett värde som är lägre än 5 miljoner om du ser att partitioneringsåtgärderna förbrukar en stor mängd minne eller processor per åtgärd. |
0 , med ett standardmål på 5 000 000 poster. |
MaxOriginalSizePerOperation | Maximalt mål för summan av den ursprungliga storleken (i byte) för källutbredningen för en enskild datapartitioneringsåtgärd. | Om partitioneringsåtgärderna förbrukar en stor mängd minne eller PROCESSOR per åtgärd anger du ett värde som är lägre än 5 GB. |
0 , med ett standardmål på 5 368 709 120 byte (5 GB). |
Datapartitioneringsprocessen
- Datapartitionering körs som en bakgrundsprocess efter inmatning.
- En tabell som kontinuerligt matas in i förväntas alltid ha en "tail" av data som ännu inte har partitionerats (icke-homogena omfattningar).
- Datapartitionering körs endast i frekventa utsträckningar, oavsett värdet för egenskapen
EffectiveDateTime
i principen.- Om det krävs partitionering av kalla omfattningar måste du tillfälligt justera cachelagringsprincipen.
Du kan övervaka partitioneringsstatusen för tabeller med definierade principer i en databas med hjälp av .show database extents partitioneringsstatistik kommando och partitioneringsmått.
Partitioneringskapacitet
Processen för datapartitionering resulterar i att fler omfattningar skapas. Sammanslagningskapaciteten för omfattningar kan gradvis öka, så att processen med sammanslagnings omfattningar kan hänga med.
Om det finns ett högt dataflöde för inmatning eller ett tillräckligt stort antal tabeller som har definierat en partitioneringsprincip kan partitionskapaciteten Omfattningar gradvis öka, så att processen med partitioneringsutbredningar kan hänga med.
- För att undvika att använda för många resurser begränsas dessa dynamiska ökningar. Du kan bli skyldig att gradvis och linjärt öka dem bortom taket, om de är helt förbrukade.
- Om en ökning av kapaciteterna leder till en betydande ökning av användningen av klustrets resurser kan du skala upp klustret /ut, antingen manuellt eller genom att aktivera autoskalning.
Begränsningar
- Försök att partitionering av data i en databas som redan har mer än 5 000 000 omfattningar begränsas.
- I sådana fall fördröjs den
EffectiveDateTime
egenskapen för partitioneringsprinciper för tabeller i databasen automatiskt med flera timmar, så att du kan omvärdera konfigurationen och principerna.
- I sådana fall fördröjs den
Extremvärden i partitionerade kolumner
- Följande situationer kan bidra till obalanserad fördelning av data mellan noder och försämra frågeprestanda:
- Om en hashpartitionsnyckel innehåller värden som är mycket vanligare än andra, till exempel en tom sträng eller ett allmänt värde (till exempel
null
ellerN/A
). - Värdena representerar en entitet (till exempel
tenant_id
) som är vanligare i datauppsättningen.
- Om en hashpartitionsnyckel innehåller värden som är mycket vanligare än andra, till exempel en tom sträng eller ett allmänt värde (till exempel
- Om en datetime-partitionsnyckel för enhetligt intervall har en tillräckligt stor procentandel värden som är "långt" från majoriteten av värdena i kolumnen, ökar datapartitioneringsprocessens omkostnader och kan leda till många små delar att hålla reda på. Ett exempel på en sådan situation är datetime-värden från det avlägsna förflutna eller framtiden.
I båda dessa fall kan du antingen "åtgärda" data eller filtrera bort eventuella irrelevanta poster i data före eller vid inmatningstid, för att minska kostnaderna för datapartitioneringen. Använd till exempel en uppdateringsprincip.