Überspringen von Dateien für Delta-Tabellen

Das Überspringen von Dateien ist eine Delta Lake-Leseoptimierung, mit der das Spark-Modul das Scannen von Datendateien vermeiden kann, die keine übereinstimmenden Zeilen enthalten können. Da das Modul weniger Daten liest, werden Abfragen schneller ausgeführt und verbrauchen weniger E/A-Ressourcen.

So funktioniert das Überspringen von Dateien

Jedes Mal, wenn eine Datendatei in eine Delta-Tabelle geschrieben wird, zeichnet Delta Lake statistiken pro Dateispalte im Transaktionsprotokoll auf. Diese Statistiken umfassen den Minimalwert, den Maximalwert und die NULL-Anzahl für jede indizierte Spalte in dieser Datei.

Wenn eine Abfrage ein Filter-Prädikat enthält, vergleicht das Modul den Prädikatwert mit dem für jede Datei gespeicherten Min/Max-Bereich. Wenn der Prädikatwert außerhalb des Bereichs für eine Datei liegt, wird diese Datei vollständig übersprungen – es ist nicht erforderlich, sie zu öffnen oder zu scannen.

Betrachten Sie beispielsweise eine sales Tabelle, die nach Datumsbereichen in fünf Datendateien unterteilt ist:

Datei Min/Max.-Statistiken Ergebnis für WHERE date = '2024-03-15'
Datei 1 date [2024-01-01 .. 2024-02-28] Übersprungen
Datei 2 date [2024-03-01 .. 2024-03-31] Gelesen ✓
Datei 3 date [2024-04-01 .. 2024-05-31] Übersprungen
Datei 4 date [2024-06-01 .. 2024-07-31] Übersprungen
Datei 5 date [2024-08-01 .. 2024-09-30] Übersprungen

In diesem Fall werden vier von fünf Dateien übersprungen – 80% weniger gescannte Daten – da ihre Min/Max-Bereiche nicht mit dem Filterwert überlappen.

Important

Der Datentyp des Prädikatwerts muss mit dem Spaltentyp übereinstimmen. Ein Typkonflikt kann verhindern, dass das Modul Statistiken auf Dateiebene zum Überspringen verwendet.

Standardverhalten

Delta Lake sammelt Dateistatistiken automatisch mit den folgenden Standardwerten:

  • Nur die ersten 32 Spalten (nach Ordnungsposition) haben Statistiken gesammelt.
  • Statistiken, die pro Spalte pro Datei nachverfolgt werden: Min., Max. und Nullanzahl
  • Das Sammeln von Statistiken zu langen Zeichenfolgenspalten ist kostspielig und erhöht den Schreibaufwand, sodass die Positionierung wichtig ist.

Die delta.dataSkippingNumIndexedCols Tabelleneigenschaft steuert den Spaltengrenzwert. Spalten, die über diesen Schwellenwert hinausgehen, erhalten keine Statistiken auf Dateiebene und können nicht am Überspringen von Dateien teilnehmen.

Berechtigte Datentypen

Nicht alle Spaltentypen unterstützen Statistiken auf Dateiebene und daher das Überspringen von Dateien. Das Modul wertet den Datentyp jeder Spalte aus, um zu bestimmen, ob Min/Max-Statistiken erfasst werden können.

Immer geeignet (Atomtypen)

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

Bedingt berechtigt

Note

Die folgenden Typen können ab Fabric Spark Runtime 2.0 (Delta 4.1) aktiviert werden.

  • VariantType: wenn spark.databricks.delta.variantShredding.collectVariantDataSkippingStats aktiviert ist.
  • ArrayType: wenn spark.microsoft.delta.skipping.complexTypes.enabled aktiviert ist und der Elementtyp selbst berechtigt ist.
  • MapType: wenn spark.microsoft.delta.skipping.complexTypes.enabled aktiviert ist und sowohl die Schlüssel- als auch die Werttypen berechtigt sind.

Nicht berechtigt

  • BinaryType
  • BooleanType
  • StructType (als Ganzes – Blattfelder innerhalb von Strukturen werden einzeln ausgewertet)
  • NullType

Maximieren der Spaltenabdeckung

Um den größten Vorteil beim Überspringen von Dateien zu erzielen, stellen Sie sicher, dass die Spalten, nach denen Sie am häufigsten filtern, von Dateistatistiken abgedeckt werden.

Häufig gefilterte Spalten zuerst positionieren

Platzieren Sie Spalten, die am häufigsten in WHERE-Klauseln, Join-Schlüsseln und Filterprädikaten vorkommen, in den ersten 32 Positionen des Tabellenschemas. Verschieben Sie lange Zeichenfolgenspalten oder Spalten mit geringer Selektivität hinter Position 32, um keinen Schreibaufwand für Statistiken zu verschwenden, die nur selten nützlich sind.

ALTER TABLE table_name ALTER COLUMN long_str_col AFTER last_indexed_col

Anzahl der indizierten Spalten erhöhen

Wenn Ihre Tabelle mehr als 32 Spalten enthält, die von Statistiken profitieren, erhöhen Sie den Standardgrenzwert:

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

Note

Das Erhöhen der Indizierungsspaltenanzahl erhöht den Schreibaufwand für jede Datendatei. Erhöhen Sie diesen Wert nur, wenn die zusätzlichen Spalten häufig in Filter-Prädikaten verwendet werden.

Angeben exakter Spalten für Statistiken

Verwenden Sie delta.dataSkippingStatsColumns, um explizit zu steuern, welche Spalten die Dateistatistik erhalten, unabhängig von ihrer Position:

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

Wenn delta.dataSkippingStatsColumns festgelegt ist, werden nur für die angegebenen Spalten Statistiken erfasst. Dieser Ansatz bietet Ihnen eine differenzierte Kontrolle über den Kompromiss zwischen Schreibkosten und Lesevorteil.

Dateiüberspringen mit Datenlayout kombinieren

Das Überspringen von Dateien funktioniert am besten, wenn verwandte Werte in denselben Dateien gespeichert werden. Techniken wie ZORDER BY und Liquid Clustering reorganisieren Daten physisch so, dass Zeilen mit ähnlichen Spaltenwerten in denselben Dateien gespeichert werden. Das räumliche Zusammenfassen ähnlicher Werte macht die Min-/Max.-Bereiche pro Datei enger, was den Anteil der Dateien erhöht, die die Engine bei einem bestimmten Filter überspringen kann.

Weitere Informationen zur Datenlayoutoptimierung finden Sie unter "Tabellenkomprimierung", "Liquid Clustering" und "Z-Order".