Dela via


Komprimera Delta-tabeller

Delta-tabellfiler blir fragmenterade över tid. Fragmentering ökar omkostnaderna för filåtgärder, minskar komprimeringseffektiviteten och kan begränsa läsparallelliteten. Komprimering skriver om många små filer till färre filer i rätt storlek så att Spark kan läsa och bearbeta data mer effektivt.

Kommandot OPTIMIZE är den primära komprimeringsåtgärden. Den grupperar små filer i bin med målet att uppnå en ideal filstorlek och skriver sedan om dem till lagring.

Vägledning för arbetsbelastningsöverskridande om komprimeringsstrategier för SQL Analytics Endpoint, Power BI Direct Lake och Spark, se Underhåll och optimering av tabeller för arbetsbelastningsöverskridande.

Komprimeringsmetoder

Microsoft Fabric erbjuder flera metoder för att upprätthålla optimala filstorlekar i Delta-tabeller:

OPTIMIZE kommando

Kommandot OPTIMIZE är den grundläggande åtgärden för att komprimera Delta-tabeller. Den skriver om små filer till större filer för att förbättra datalayouten i Delta-tabeller.

OPTIMIZE dbo.table_name
Fastighet Description Standardvärde Sessionskonfiguration
minFileSize Filer som är mindre än det här tröskelvärdet grupperas tillsammans och skrivs om som större filer. 1073741824 (1g) spark.databricks.delta.optimize.minFileSize
maxFileSize Målfilstorlek som genereras av OPTIMIZE kommandot. 1073741824 (1g) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE är idempotent, men en överdimensionerad minFileSize kan öka skrivförstärkning. Efter att minFileSize har ställts in på 1 GB kan till exempel en 900 MB-fil skrivas om efter ytterligare en liten skrivning. Vägledning för automatisk filstorlekshantering finns i anpassningsbar målfilstorlek.

OPTIMIZE med Z-Order

När du använder ZORDER BY -satsen OPTIMIZE skriver du om aktiva filer så att rader med liknande värden samplaceeras i samma filer. Detta förbättrar hopp över filer för valbara filter. Använd Z-Order när:

  • Dina frågor filtrerar ofta på två eller flera kolumner tillsammans (till exempel datum + customer_id) och
  • Dessa predikat är tillräckligt selektiva så att filnivåhoppning minskar antalet filer som genomsöks.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE med V-order

VORDER Satsen leder till att filerna avsedda för komprimering får V-Order-optimering tillämpad. Mer information om V-Order finns i den detaljerade dokumentationen.

OPTIMIZE dbo.table_name VORDER

OPTIMIZE med flytande klustring

Flytande klustring anges som ett tabellalternativ. Mer information finns i aktivera flytande klustring . När liquid clustering är aktiverat utförs den fysiska omskrivning som tillämpar klustringspolicyn.

Viktigt!

Data klustras endast när OPTIMIZE körs på tabeller som är aktiverade för flytande klustring. Regelbundna skrivåtgärder klustrar INTE data. Att ha en kompakteringsstrategi, som att använda automatisk kompaktering eller schemalägga optimeringsjobb manuellt, är viktigt för att säkerställa att fördelarna med klustrade data (dvs. förbättrad filtrering av Delta-filer) kan uppnås.

Snabb optimering

Snabboptimering analyserar snabbt Delta-tabellfiler och hoppar över komprimeringsåtgärder som sannolikt inte kommer att förbättra prestandan på ett meningsfullt sätt.

I stället för att blint komprimera filer när små filer finns, utvärderar snabboptimering om varje kandidatkorg (grupp med små filer) uppfyller konfigurerbara mål för komprimering av bästa praxis. "Fast Optimize kör endast optimering på en behållare av filer om sammanslagningen sannolikt kommer nå din minsta målstorlek, eller om det finns för många små filer." Annars hoppar den över den gruppen eller minskar hur många filer den komprimerar.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

Snabb optimering kan finjusteras baserat på dina komprimeringsförväntningar:

Fastighet Description Standardvärde Sessionskonfiguration
minNumFiles Antalet små filer som behöver finnas i en bin för att optimering ska kunna utföras, om den inte innehåller tillräckligt med data för att skapa en uppskattad komprimerad fil. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Multiplicerat med den minsta filstorleken för optimeringskontexten för att fastställa den minsta mängden små fildata som måste finnas i en lagerplats för att lagerplatsen ska ingå i komprimeringsomfånget. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Anmärkning

Resultatet parquetCoefficient blir att målstorleken för en bin är större än den minsta målfilstorleken för optimeringskontexten. Den här koefficienten förklarar verkligheten att en kombination av flera små parquet-filer resulterar i bättre komprimering och därmed mindre data än summan av små filer. Det här värdet kan ökas för att göra snabboptimeringen mer konservativ i hur ofta den hoppar över fack, eller minskas för att tillåta mer tillåtande binhopp.

Så här fungerar det

Snabboptimering introducerar extra kontroller innan behållare kompakteras. För varje kandidathink utvärderar snabb optimering:

  • Den uppskattade mängden rådata i korgen (summan av storlekar för små filer)
  • Om en kombination av de små filerna beräknas skapa en fil som uppfyller den konfigurerade minsta målstorleken
  • Om behållaren innehåller minst det konfigurerade minimala antalet små filer

Snabboptimering utvärderar varje lagerplats med små filer och komprimerar bara de små filer som sannolikt kommer att nå den minsta målstorleken eller överskrida det minsta antalet filer. Behållare som inte uppfyller dessa tröskelvärden hoppas över eller komprimeras delvis. Om du hoppar över suboptimala bin minskar onödiga omskrivningar och skrivförstärkning, och gör OPTIMIZE-jobben mer idempotenta.

Skärmbild som visar hur snabbt optimize utvärderar om en bin komprimeras.

Anmärkning

Den exakta implementeringen kan utvecklas över tid.

Snabb optimering kan minska omskrivna data under en Delta-tabelllivscykel. Som du ser i följande diagram hoppar den snabba optimeringsfunktionen över suboptimala fack, vilket resulterar i snabbare och mer idempotenta OPTIMIZE jobb med lägre skrivförstärkning.

Skärmbild som visar hur snabb optimering resulterar i mindre dataomskrivning över tid.

Anmärkning

Endast i illustrationssyfte förutsätter diagrammen ovan att storleken på filen som skrivs från komprimering är summan av storleken på små filer. Det antyder också en parquetCoefficient av 1.

Begränsningar
  • Gäller inte för flytande klustrings- och Z-orderåtgärder
  • Snabb optimering ändrar inte beteendet för automatisk komprimering

Komprimeringsmål på filnivå

För att undvika omskrivning av data som tidigare ansågs kompakterade baserat på ändrade kompakteringsmin- och maxstorleksmål för filer, kan spark.microsoft.delta.optimize.fileLevelTarget.enabled aktiveras för att förhindra omkompaktering av redan kompakterade filer. När de är aktiverade kompileras inte filerna om de tidigare uppfyllde minst hälften av målfilens storlek vid tidpunkten för komprimering. Att underhålla mål på filnivå minimerar skrivförstärkning när storleken på målet för komprimering ändras över tid (till exempel genom att anpassa sig till målfilstorleken genom att utvärdera och ställa in ett större mål). Om funktionen är aktiverad läggs taggen OPTIMIZE_TARGET_SIZE till i nya filer när OPTIMIZE körs eller för någon skrivåtgärd där tabellegenskapen delta.targetFileSize eller delta.targetFileSize.adaptive har angetts.

Anmärkning

Även om det inte är aktiverat som standard rekommenderar Microsoft att du aktiverar komprimeringsmål på filnivå för att begränsa potentiell skrivförstärkning.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Automatisk komprimering

Automatisk komprimering utvärderar partitionens hälsa efter varje skrivåtgärd. När den upptäcker överdriven filfragmentering (för många små filer) i en partition utlöser den en synkron OPTIMIZE åtgärd omedelbart efter att skrivning har checkats in. Den här skrivdrivna metoden för filunderhåll är optimal eftersom komprimering endast körs när programmatiskt bedöms vara fördelaktigt.

Aktivera på sessionsnivå

Ange spark.databricks.delta.autoCompact.enabled på sessionsnivå för att aktivera automatisk komprimering för nya tabeller som skapats i spark-sessionen:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Aktivera på tabellnivå

Ange tabellegenskap delta.autoOptimize.autoCompact för att aktivera automatisk komprimering för specifika tabeller:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Använd alternativet delta.autoOptimize.autoCompact DataFrameWriter för att aktivera automatisk komprimering när du skapar en tabell:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Aktivera samma tabellegenskap i en befintlig tabell:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Justera tröskelvärden för automatisk komprimering

Justera funktionen för automatisk komprimering genom att ange följande Konfigurationer för Spark-sessioner:

Fastighet Description Standardvärde Sessionskonfiguration
maxFileSize Maximal filstorlek i bytes för komprimerade filer. 134217728b (128 MB) spark.databricks.delta.autoCompact.maxFileSize
minFileSize Den minsta filstorleken i byte för en fil som ska betraktas som komprimerad. Allt under det här tröskelvärdet beaktas för komprimering och räknas mot minNumFiles tröskelvärdet. Inte angivet som standard, beräknat som 1/2 av maxFileSize om du inte anger ett värde uttryckligen. spark.databricks.delta.autoCompact.minFileSize
minNumFiles Det minsta antalet filer som måste finnas under minFileSize tröskelvärdet för att automatisk komprimering ska utlösas. 50 spark.databricks.delta.autoCompact.minNumFiles

Välj mellan automatisk komprimering och schemalagd OPTIMIZE

Microsoft rekommenderar automatisk komprimering som standardstrategi för de flesta inmatningsarbetsbelastningar. Det överträffar vanligtvis fasta scheman och minskar driftkostnaderna för att underhålla OPTIMIZE jobb.

Om dina svarstidsmål är strikta kan schemalagda OPTIMIZE på en separat Spark-pool passa bättre eftersom automatisk komprimering körs synkront efter skrivningar.

Använd komprimering tillsammans med funktioner för skydd mot små filer, till exempel optimera skrivning. Vägledning finns i Optimera skrivning.

Underhåll av Lakehouse-tabell

Du kan köra ad hoc-underhållsåtgärder, till exempel OPTIMIZE från Lakehouse Explorer. Mer information finns i Underhåll av Lakehouse-tabeller.

Sammanfattning av metodtips

Använd dessa rekommendationer för att balansera skrivkostnader, läsprestanda och underhållskostnader för Delta-tabellkomprimering.

  • Aktivera automatisk kompaktering för inmatningspipelines med frekventa små skrivningar (strömning eller mikrobatch) för att minska manuell schemaläggning.
  • Använd automatisk komprimering selektivt för andra skrivmönster när dina servicenivåmål kan tolerera tillfälliga toppar med skrivfördröjning.
  • Schemalägg fullständig tabell OPTIMIZE under tysta fönster när du behöver skriva om många partitioner eller använda Z-Order.
  • Aktivera snabb optimering för att minska skrivförstärkningen och göra OPTIMIZE mer idempotent.
  • Aktivera komprimeringsmål på filnivå för att minska onödig omkompaction när målfilstorlekarna ökar med tiden.
  • Använd optimera skrivning i lämpliga inmatningsvägar eftersom komprimering före skrivning ofta är mindre kostsam än komprimering efter skrivning. Vägledning finns i Optimera skrivning.