Partitioneringsbeleid
Van toepassing op: ✅Microsoft Fabric✅Azure Data Explorer-
Het partitioneringsbeleid definieert of en hoe gebieden (gegevensshards) moeten worden gepartitioneerd voor een specifieke tabel of een gerealiseerde weergave.
Het beleid activeert een extra achtergrondproces dat plaatsvindt na het maken van gebieden, na het opnemen van gegevens. Dit proces omvat het opnieuw opnemen van gegevens uit de bronbereiken en het produceren van homogene gebieden, waarin alle waarden van de kolom die als de partitiesleutel zich binnen één partitie bevinden.
Het primaire doel van het partitioneringsbeleid is het verbeteren van queryprestaties in specifieke ondersteunde scenario's.
Notitie
Wanneer een beleid voor gegevenspartitionering niet is gedefinieerd (is null
), worden de gebieden standaard gepartitioneerd op het moment van maken (opname). In de meeste gevallen hoeft u geen beleid voor gegevenspartitionering in te stellen.
Ondersteunde scenario's
Hier volgen de enige scenario's waarin het instellen van een beleid voor gegevenspartitionering wordt aanbevolen. In alle andere scenario's wordt het instellen van het beleid niet aanbevolen.
-
veelgebruikte filters op een gemiddelde of hoge kardinaliteit
string
ofguid
kolom:- Bijvoorbeeld: oplossingen voor meerdere tenants of een tabel met metrische gegevens waarbij de meeste of alle query's filteren op een kolom van het type
string
ofguid
, zoals deTenantId
of deMetricId
. - Gemiddelde kardinaliteit is ten minste 10.000 afzonderlijke waarden.
- Stel de hashpartitiesleutel in als de kolom
string
ofguid
en stel de eigenschapPartitionAssignmentMode
in opuniform
.
- Bijvoorbeeld: oplossingen voor meerdere tenants of een tabel met metrische gegevens waarbij de meeste of alle query's filteren op een kolom van het type
-
frequente aggregaties of joins voor een hoge kardinaliteit
string
ofguid
kolom:- IoT-gegevens van veel verschillende sensoren of academische records van veel verschillende studenten.
- Hoge kardinaliteit is ten minste 1.000.000 afzonderlijke waarden, waarbij de verdeling van waarden in de kolom ongeveer gelijk is.
- In dit geval stelt u de hashpartitiesleutel in op als kolom die vaak wordt gegroepeerd op of gekoppeld, en stelt u de eigenschap
PartitionAssignmentMode
in opByPartition
.
-
gegevensopname buiten volgorde:
- Gegevens die zijn opgenomen in een tabel, worden mogelijk niet geordend en gepartitioneerd in gebieden (shards) op basis van een specifieke
datetime
kolom die de aanmaaktijd van gegevens aangeeft en vaak wordt gebruikt om gegevens te filteren. Dit kan worden veroorzaakt door een backfill van heterogene bronbestanden die datum/tijd-waarden bevatten gedurende een lange periode. - In dit geval stelt u de uniforme datum/tijd-partitiesleutel voor het in op de
datetime
kolom. - Als u bewaar- en cachebeleid nodig hebt om af te stemmen op de datum/tijdwaarden in de kolom, stelt u de eigenschap
OverrideCreationTime
in optrue
.
- Gegevens die zijn opgenomen in een tabel, worden mogelijk niet geordend en gepartitioneerd in gebieden (shards) op basis van een specifieke
Voorzichtigheid
- Er zijn geen in code vastgelegde limieten ingesteld voor het aantal tabellen waarvoor het partitioneringsbeleid is gedefinieerd. Maar elke extra tabel voegt overhead toe aan het partitioneringsproces voor achtergrondgegevens. Het instellen van een beleid voor meer tabellen resulteert in meer resources die worden gebruikt en hogere kosten als gevolg van onderliggende opslagtransacties. Zie capaciteitvoor meer informatie.
- Het wordt niet aanbevolen om een partitioneringsbeleid in te stellen als de gecomprimeerde grootte van gegevens per partitie naar verwachting kleiner is dan 1 GB.
- Het partitioneringsproces resulteert in restopslagartefacten voor alle gebieden die zijn vervangen tijdens het partitioneringsproces en tijdens het samenvoegproces. De meeste resterende opslagartefacten worden naar verwachting verwijderd tijdens het automatische opschonen. Door de waarde van de eigenschap
MaxPartitionCount
te verhogen, wordt het aantal resterende opslagartefacten verhoogd en kunnen de opschoonprestaties worden verminderd. - Voordat u een partitioneringsbeleid toepast op een gerealiseerde weergave, bekijkt u de aanbevelingen voor gerealiseerde weergaven die het partitioneringsbeleid.
Partitiesleutels
De volgende soorten partitiesleutels worden ondersteund.
Soort | Kolomtype | Partitie-eigenschappen | Partitiewaarde |
---|---|---|---|
Hash- |
string of guid |
Function , MaxPartitionCount , Seed , PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
Uniform- | datetime |
RangeSize , Reference , OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
Hashpartitiesleutel
Als het beleid een hashpartitiesleutel bevat, worden alle homogene gebieden die deel uitmaken van dezelfde partitie toegewezen aan hetzelfde gegevensknooppunt.
Notitie
Met de bewerking voor gegevenspartitionering wordt een aanzienlijke verwerkingsbelasting toegevoegd. Het is raadzaam om alleen onder de volgende voorwaarden een hashpartitiesleutel toe te passen op een tabel:
- Als de meeste query's gelijkheidsfilters gebruiken (
==
,in()
). - Het merendeel van de query's aggregeren/samenvoegen voor een specifieke kolom van het type
string
ofguid
van grote dimensie (kardinaliteit van 10 miljoen of hoger), zoals eendevice_ID
ofuser_ID
. - Het gebruikspatroon van de gepartitioneerde tabellen heeft een hoge gelijktijdigheidsquerybelasting, zoals in bewakings- of dashboardtoepassingen.
- Een hash-modulo-functie wordt gebruikt om de gegevens te partitioneren.
- Gegevens in homogene (gepartitioneerde) gebieden worden geordend door de hash-partitiesleutel.
- U hoeft de hashpartitiesleutel niet op te nemen in het beleid voor rijvolgorde, als er een is gedefinieerd in de tabel.
- Query's die gebruikmaken van de shuffle-strategieen waarin de
shuffle key
die worden gebruikt injoin
,summarize
ofmake-series
de hashpartitiesleutel van de tabel is, worden naar verwachting beter uitgevoerd omdat de hoeveelheid gegevens die nodig is om over knooppunten te verplaatsen, wordt verminderd.
Partitie-eigenschappen
Eigenschap | Beschrijving | Ondersteunde waarde(s) | Aanbevolen waarde |
---|---|---|---|
Function |
De naam van een hash-modulo-functie die moet worden gebruikt. | XxHash64 |
|
MaxPartitionCount |
Het maximum aantal partities dat moet worden gemaakt (het modulo-argument voor de hash-modulo-functie) per periode. | In het bereik (1,2048] . |
Hogere waarden leiden tot een grotere overhead van het proces voor gegevenspartitionering en een hoger aantal gebieden voor elke periode. De aanbevolen waarde is 128 . Hogere waarden verhogen de overhead van het partitioneren van de gegevens na opname aanzienlijk en de grootte van metagegevens en worden daarom niet aanbevolen. |
Seed |
Gebruiken voor het randomiseren van de hashwaarde. | Een positief geheel getal. |
1 , wat ook de standaardwaarde is. |
PartitionAssignmentMode |
De modus die wordt gebruikt voor het toewijzen van partities aan knooppunten. |
ByPartition : alle homogene (gepartitioneerde) gebieden die deel uitmaken van dezelfde partitie, worden toegewezen aan hetzelfde knooppunt. Uniform : partitiewaarden van een extents worden genegeerd. Gebieden worden uniform toegewezen aan de knooppunten. |
Als query's niet worden samengevoegd of samengevoegd op de hashpartitiesleutel, gebruikt u Uniform . Gebruik anders ByPartition . |
Voorbeeld van hashpartitiesleutel
Een hashpartitiesleutel over een string
-getypte kolom met de naam tenant_id
.
Hierbij wordt de XxHash64
hash-functie gebruikt, waarbij MaxPartitionCount
is ingesteld op de aanbevolen waarde 128
en de standaard-Seed
van 1
.
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Partitiesleutel uniform bereik datum/tijd
Notitie
Pas alleen een uniforme datum/tijd-partitiesleutel toe op een datetime
-getypte kolom in een tabel wanneer gegevens die in de tabel zijn opgenomen, waarschijnlijk niet worden gerangschikt op basis van deze kolom.
In deze gevallen kunt u de gegevens tussen gebieden opnieuw toewijzen, zodat elke mate records uit een beperkt tijdsbereik bevat. Dit proces resulteert in filters op de datetime
kolom die effectiever is tijdens het uitvoeren van query's.
De gebruikte partitiefunctie is bin_at() en kan niet worden aangepast.
Partitie-eigenschappen
Eigenschap | Beschrijving | Aanbevolen waarde |
---|---|---|
RangeSize |
Een timespan scalaire constante die de grootte van elke datum/tijd-partitie aangeeft. |
Begin met de waarde 1.00:00:00 (één dag). Stel geen kortere waarde in, omdat deze kan leiden tot een groot aantal kleine hoeveelheden die niet kunnen worden samengevoegd in de tabel. |
Reference |
Een datetime scalaire constante die een vast tijdstip aangeeft, volgens welke datum/tijd-partities worden uitgelijnd. |
Begin met 1970-01-01 00:00:00 . Als er records zijn waarin de datum/tijd-partitiesleutel null waarden heeft, wordt de partitiewaarde ingesteld op de waarde van Reference . |
OverrideCreationTime |
Een bool die aangeeft of de minimale en maximale aanmaaktijden van de resultaatbereiken moeten worden overschreven door het bereik van de waarden in de partitiesleutel. |
Standaard ingesteld op false . Ingesteld op true als gegevens niet worden opgenomen in volgorde van aankomst. Een enkel bronbestand kan bijvoorbeeld datum/tijd-waarden bevatten die ver weg zijn en/of u wilt retentie of caching afdwingen op basis van de datum/tijd-waarden in plaats van de tijd van opname.Wanneer OverrideCreationTime is ingesteld op true , kunnen gebieden worden gemist in het samenvoegproces. Gebieden worden gemist als de aanmaaktijd ouder is dan de Lookback periode van het beleid voor het samenvoegen van gebieden in de tabel. Als u ervoor wilt zorgen dat de gebieden kunnen worden gedetecteerd, stelt u de eigenschap Lookback in op HotCache . |
Voorbeeld van een uniform datum/tijd-partitiebereik
Het fragment toont een uniforme partitiesleutel voor het datum/tijd-bereik boven een datetime
getypte kolom met de naam timestamp
.
Het gebruikt datetime(2021-01-01)
als referentiepunt, met een grootte van 7d
voor elke partitie en overschrijft de aanmaaktijden van de gebieden niet.
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
Het beleidsobject
Standaard wordt het beleid voor gegevenspartitionering van een tabel null
. In dat geval worden gegevens in de tabel niet opnieuw gepartitioneerd nadat deze zijn opgenomen.
Het beleid voor gegevenspartitionering heeft de volgende hoofdeigenschappen:
PartitionKeys:
- Een verzameling partitiesleutels die definiëren hoe de gegevens in de tabel moeten worden gepartitioneren.
- Een tabel kan maximaal
2
partitiesleutels bevatten, met een van de volgende opties: - Elke partitiesleutel heeft de volgende eigenschappen:
-
ColumnName
:string
- De naam van de kolom op basis waarvan de gegevens worden gepartitioneerd. -
Kind
:string
: het type gegevenspartitionering dat moet worden toegepast (Hash
ofUniformRange
). -
Properties
:property bag
- Definieert parameters op basis waarvan partitionering wordt uitgevoerd.
-
EffectiveDateTime:
- De UTC-datum/tijd van waaruit het beleid van kracht is.
- Deze eigenschap is optioneel. Als dit niet is opgegeven, wordt het beleid van kracht voor gegevens die zijn opgenomen nadat het beleid is toegepast.
Voorzichtigheid
- U kunt een datum/tijd-waarde instellen in het verleden en de reeds opgenomen gegevens partitioneren. Deze procedure kan echter aanzienlijk leiden tot een aanzienlijke toename van resources die worden gebruikt in het partitioneringsproces.
- In de meeste gevallen is het raadzaam om alleen nieuw opgenomen gegevens te partitioneren en te voorkomen dat grote hoeveelheden historische gegevens worden gepartitioneerd.
- Als u ervoor kiest om historische gegevens te partitioneren, kunt u dit geleidelijk overwegen door de EffectiveDateTime- in te stellen op een eerdere
datetime
in stappen van maximaal een paar dagen wanneer u het beleid wijzigt.
Voorbeeld van gegevenspartitionering
Gegevenspartitioneringsbeleidsobject met twee partitiesleutels.
- Een hashpartitiesleutel over een
string
-getypte kolom met de naamtenant_id
.- Hierbij wordt de
XxHash64
hash-functie gebruikt, waarbijMaxPartitionCount
is ingesteld op de aanbevolen waarde128
en de standaard-Seed
van1
.
- Hierbij wordt de
- Een uniforme partitiesleutel voor datum/tijd voor een
datetime
typekolom met de naamtimestamp
.- Het gebruikt
datetime(2021-01-01)
als referentiepunt, met een grootte van7d
voor elke partitie.
- Het gebruikt
{
"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
}
}
]
}
Aanvullende eigenschappen
De volgende eigenschappen kunnen worden gedefinieerd als onderdeel van het beleid. Deze eigenschappen zijn optioneel en we raden u aan deze eigenschappen niet te wijzigen.
Eigenschap | Beschrijving | Aanbevolen waarde | Standaardwaarde |
---|---|---|---|
MinRowCountPerOperation- | Minimumdoel voor de som van het aantal rijen van de bronregio's van één gegevenspartitioneringsbewerking. | 0 |
|
MaxRowCountPerOperation- | Maximumdoel voor de som van het aantal rijen van de bronlengten van één gegevenspartitioneringsbewerking. | Stel een waarde lager dan 5M in als u ziet dat de partitioneringsbewerkingen een grote hoeveelheid geheugen of CPU per bewerking verbruiken. |
0 , met een standaarddoel van 5.000.000 records. |
MaxOriginalSizePerOperation- | Maximumdoel voor de som van de oorspronkelijke grootte (in bytes) van de bronlengten van één gegevenspartitioneringsbewerking. | Als de partitioneringsbewerkingen een grote hoeveelheid geheugen of CPU per bewerking verbruiken, stelt u een waarde lager dan 5 GB in. |
0 , met een standaarddoel van 5.368.709.120 bytes (5 GB). |
Het proces voor gegevenspartitionering
- Gegevenspartitionering wordt uitgevoerd als een achtergrondproces na opname.
- Een tabel die continu wordt opgenomen, is naar verwachting altijd een 'staart' aan gegevens die nog moeten worden gepartitioneerd (niet-homogene gebieden).
- Gegevenspartitionering wordt alleen uitgevoerd op dynamische gebieden, ongeacht de waarde van de eigenschap
EffectiveDateTime
in het beleid.- Als het partitioneren van koude gebieden is vereist, moet u het cachebeleid tijdelijk aanpassen.
U kunt de partitioneringsstatus van tabellen met gedefinieerde beleidsregels in een database bewaken met behulp van de .show database extents partitionering statistieken opdracht en partitionering van metrische gegevens.
Partitioneringscapaciteit
Het proces voor gegevenspartitionering resulteert in het maken van meer gebieden. De mate van samenvoegcapaciteit kan geleidelijk toenemen, zodat het proces van samenvoegings gebieden kan bijhouden.
Als er sprake is van een hoge opnamedoorvoer of een groot genoeg aantal tabellen waarvoor een partitioneringsbeleid is gedefinieerd, kan de Extents-partitiecapaciteit geleidelijk toenemen, zodat het partitioneringsproces kan bijhouden.
- Om te voorkomen dat er te veel resources worden verbruikt, worden deze dynamische toenames beperkt. Mogelijk moet u ze geleidelijk en lineair verhogen buiten de limiet, als ze volledig worden gebruikt.
- Als het verhogen van de capaciteiten een aanzienlijke toename veroorzaakt in het gebruik van de resources van het cluster, kunt u het cluster omhoog schalen/, handmatig of door automatische schaalaanpassing in te schakelen.
Beperkingen
- Pogingen om gegevens te partitioneren in een database die al meer dan 5.000.000 gebieden heeft, worden beperkt.
- In dergelijke gevallen wordt de eigenschap
EffectiveDateTime
van partitioneringsbeleidsregels van tabellen in de database automatisch met enkele uren vertraagd, zodat u uw configuratie en beleid opnieuw kunt evalueren.
- In dergelijke gevallen wordt de eigenschap
Uitbijters in gepartitioneerde kolommen
- De volgende situaties kunnen bijdragen aan een onevenwichtige distributie van gegevens tussen knooppunten en de prestaties van query's verminderen:
- Als een hashpartitiesleutel waarden bevat die veel vaker voorkomen dan andere, bijvoorbeeld een lege tekenreeks of een algemene waarde (zoals
null
ofN/A
). - De waarden vertegenwoordigen een entiteit (zoals
tenant_id
) die vaker voorkomt in de gegevensset.
- Als een hashpartitiesleutel waarden bevat die veel vaker voorkomen dan andere, bijvoorbeeld een lege tekenreeks of een algemene waarde (zoals
- Als een uniforme datum/tijd-partitiesleutel een groot genoeg percentage waarden heeft dat 'ver' ligt van het merendeel van de waarden in de kolom, wordt de overhead van het gegevenspartitioneringsproces verhoogd en kan dit leiden tot veel kleine hoeveelheden om bij te houden. Een voorbeeld van een dergelijke situatie zijn datum/tijd-waarden uit het verre verleden of de toekomst.
In beide gevallen 'corrigeer' de gegevens of filtert u alle irrelevante records in de gegevens vóór of tijdens opnametijd, om de overhead van de gegevenspartitionering te verminderen. Gebruik bijvoorbeeld een updatebeleid.