Dela via


Partitioneringsprincip

Gäller för: ✅Microsoft FabricAzure 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 eller guid 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 eller guid, till exempel TenantId eller MetricId.
    • Medel kardinalitet är minst 10 000 distinkta värden.
    • Ange hashpartitionsnyckeln som kolumnen string eller guid och ange egenskapen PartitionAssignmentMode till uniform.
  • Frekventa aggregeringar eller kopplingar med hög kardinalitet string eller guid 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 till ByPartition.
  • 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 till true.

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 eller guid som är av med stor dimension (kardinalitet på 10 M eller högre), till exempel en device_IDeller user_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 i join, summarize eller make-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 128och 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å truekan 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 HotCachefö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:

  • 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.

  1. 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 128och standard Seed för 1.
  2. En partitionsnyckel för enhetligt datetime-intervall över en kolumn av datetime typ med namnet timestamp.
    • Den använder datetime(2021-01-01) som referenspunkt, med storleken 7d för varje partition.
{
  "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.

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

  • 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.

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 eller N/A).
    • Värdena representerar en entitet (till exempel tenant_id) som är vanligare i datauppsättningen.
  • 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.