Filhopp for Delta-tabeller

Filhopping er en Delta Lake-leseoptimalisering som lar Spark-motoren unngå å skanne datafiler som ikke kan inneholde matchende rader. Fordi motoren leser mindre data, kjører spørringene raskere og bruker færre I/O-ressurser.

Hvordan filhopp fungerer

Hver gang en datafil skrives til en Delta-tabell, registrerer Delta Lake kolonnestatistikk per fil i transaksjonsloggen. Disse statistikkene inkluderer minimumsverdi, maksimumsverdi og nullantall for hver indeksert kolonne i den filen.

Når en spørring inkluderer et filterpredikat, sammenligner motoren predikatverdien med min/max-området lagret for hver fil. Hvis predikatverdien faller utenfor området for en fil, hoppes den filen helt over – det er ikke nødvendig å åpne eller skanne den.

For eksempel, vurder en sales tabell delt opp i fem datafiler etter datointervaller:

Filen Min/max-statistikk Resultat for WHERE date = '2024-03-15'
Fil 1 date [2024-01-01 .. 2024-02-28] Hoppet over
Fil 2 date [2024-03-01 .. 2024-03-31] Les ✓
Fil 3 date [2024-04-01 .. 2024-05-31] Hoppet over
Fil 4 date [2024-06-01 .. 2024-07-31] Hoppet over
Fil 5 date [2024-08-01 .. 2024-09-30] Hoppet over

I dette tilfellet hoppes fire av fem filer over—80% mindre data skannet—fordi deres min/max-områder ikke overlapper med filterverdien.

Important

Datatypen til predikatverdien må samsvare med kolonnetypen. En typemismatch kan hindre motoren i å bruke filnivåstatistikk for å hoppe over.

Standard virkemåte

Delta Lake samler automatisk inn filstatistikk med følgende standardinnstillinger:

  • Kun de første 32 kolonnene (etter ordinal posisjon) har samlet inn statistikk.
  • Statistikk sporet per kolonne per fil: min,maks og null antall
  • Å samle statistikk på kolonner med lange strenger er kostbart og gir skriveoverhead, så posisjonering betyr noe.

Tabellegenskapen delta.dataSkippingNumIndexedCols styrer kolonnegrensen. Kolonner over denne terskelen får ikke filnivåstatistikk og kan ikke delta i filhopping.

Kvalifiserte datatyper

Ikke alle kolonnetyper støtter filnivåstatistikk og dermed filhopp. Motoren evaluerer hver kolonnes datatype for å avgjøre om min/max-statistikk kan samles inn.

Alltid kvalifisert (atomtyper)

  • NumericType(ByteType, ShortType, , IntegerType, LongType, FloatType, DoubleType, ) DecimalType
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

Betinget kvalifisert

Bemerkning

Følgende typer kan aktiveres ved start i Fabric Spark runtime 2.0 (Delta 4.1)

  • VariantType: når spark.databricks.delta.variantShredding.collectVariantDataSkippingStats er aktivert.
  • ArrayType: når spark.microsoft.delta.skipping.complexTypes.enabled er aktivert og elementtypen selv er kvalifisert.
  • MapType: når spark.microsoft.delta.skipping.complexTypes.enabled er aktivert og både nøkkel- og verditypene er kvalifisert.

Ikke kvalifisert

  • BinaryType
  • BooleanType
  • StructType (som helhet—bladfeltene inne i strukturer vurderes individuelt)
  • NullType

Maksimer kolonnedekning

For å få mest mulig ut av filhopping, sørg for at kolonnene du filtrerer på oftest dekkes av filstatistikk.

Plasser ofte filtrerte kolonner først

Plasser kolonner som oftest forekommer i WHERE leddsetninger, join-nøkler og filtreringspredikater i de første 32 ordinalposisjonene i tabellskjemaet. Flytt lange kolonner eller kolonner med lav selektivitet forbi posisjon 32 for å unngå å kaste bort skriveoverhead på statistikk som sjelden hjelper.

ALTER TABLE table_name ALTER COLUMN long_str_col AFTER last_indexed_col

Øk antall indekserte kolonner

Hvis tabellen din har mer enn 32 kolonner som drar nytte av statistikk, øk standardgrensen:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingNumIndexedCols' = '40')

Bemerkning

Å øke antall indekserte kolonner legger til skriveoverhead for hver datafil. Øk denne verdien kun når de ekstra kolonnene ofte brukes i filterpredikater.

Spesifiser eksakte kolonner for statistikk

Bruk delta.dataSkippingStatsColumns for eksplisitt å kontrollere hvilke kolonner som får filstatistikk, uavhengig av ordinal posisjon:

ALTER TABLE table_name SET TBLPROPERTIES ('delta.dataSkippingStatsColumns' = 'col1,col2')

Når delta.dataSkippingStatsColumns er satt, samles statistikk kun inn i de angitte kolonnene. Denne tilnærmingen gir deg finkornet kontroll over avveiningen mellom skrivekostnad og lesefordel.

Kombiner filhopp med dataoppsett

Filhopping fungerer best når relaterte verdier er samlet i de samme filene. Teknikker som ZORDER BY væskeklynging reorganiserer fysisk data slik at rader med lignende kolonneverdier ender opp i de samme filene. Å plassere lignende verdier strammer inn min/max-områdene per fil, noe som øker prosentandelen filer motoren kan hoppe over for et gitt filter.

For mer om optimalisering av dataoppsett, se tabellkomprimering, væskeklynging og Z-orden.