Komprimieren von Delta-Tabellen

Delta-Tabellendateien werden im Laufe der Zeit fragmentiert. Fragmentierung erhöht den Dateibetriebsaufwand, reduziert die Komprimierungseffizienz und kann die Leseparallelität einschränken. Die Komprimierung schreibt viele kleine Dateien in weniger dateien mit der rechten Größe um, sodass Spark Daten effizienter lesen und verarbeiten kann.

Der OPTIMIZE Befehl ist der primäre Komprimierungsvorgang. Es gruppiert kleine Dateien in Bins, die auf eine ideale Dateigröße abzielen, und schreibt sie dann in storage um.

Anleitungen zu Komprimierungsstrategien für SQL Analytics-Endpoint, Power BI Direct Lake und Spark im Rahmen von Cross-Workload-Szenarien finden Sie unter Cross-Workload-Tabellenwartung und -optimierung.

Komprimierungsmethoden

Microsoft Fabric bietet mehrere Ansätze, um optimale Dateigrößen in Delta-Tabellen beizubehalten:

OPTIMIZE-Befehl

Der OPTIMIZE Befehl ist der grundlegende Vorgang zum Komprimieren von Delta-Tabellen. Es schreibt kleine Dateien in größere Dateien um, um das Datenlayout in Delta-Tabellen zu verbessern.

OPTIMIZE dbo.table_name
Eigentum Description Standardwert Sitzungskonfiguration
minFileSize Dateien, die kleiner als dieser Schwellenwert sind, werden gruppiert und als größere Dateien umgeschrieben. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Durch den Befehl OPTIMIZE erzeugte Zieldateigröße. 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE ist idempotent, aber eine überdimensionierte minFileSize kann die Schreibverstärkung erhöhen. Wenn beispielsweise minFileSize auf 1 GB festgelegt ist, kann eine 900-MB-Datei nach einem kleinen zusätzlichen Schreibzugriff erneut geschrieben werden. Anleitungen zur automatischen Verwaltung von Dateigrößen finden Sie unter adaptive Zieldateigröße.

OPTIMIZE mit Z-Order

Wenn Sie die ZORDER BY-Klausel verwenden, schreibt OPTIMIZE aktive Dateien neu, damit Zeilen mit ähnlichen Werten in denselben Dateien platziert werden. Die kolokierte Anordnung verbessert das Überspringen von Dateien bei selektiven Filtern. Verwenden Sie Z-Reihenfolge, wenn:

  • Ihre Abfragen filtern häufig nach zwei oder mehr Spalten (z. B. Datum + customer_id) und
  • Diese Prädikate sind selektiv genug, damit das Überspringen auf Dateiebene die Anzahl der gescannten Dateien reduziert.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE mit V-Order

Die VORDER Klausel bewirkt, dass auf die Dateien, die zur Komprimierung vorgesehen sind, die V-Order-Optimierung angewendet wird. Weitere Informationen zur V-Bestellung finden Sie in der detaillierten Dokumentation.

OPTIMIZE dbo.table_name VORDER

Sie können Z-Reihenfolge und V-Reihenfolge in einem einzigen Befehl kombinieren. Spark wendet die Vorgänge in dieser Reihenfolge an: bin compaction → Z-Order → V-Order.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

Das Verhalten der V-Reihenfolge während OPTIMIZE hängt davon ab, wie Sie den Befehl aufrufen:

Aufruf Behavior
OPTIMIZE table VORDER Erzwingt die V-Reihenfolge bei umgeschriebenen Dateien, unabhängig von Sitzungs- oder Tabelleneinstellungen.
OPTIMIZE table (kein VORDER Schlüsselwort) Übernimmt das V-Order-Verhalten von TBLPROPERTIES("delta.parquet.vorder.enabled"), falls es festgelegt ist; andernfalls wird auf die Sitzungskonfiguration spark.sql.parquet.vorder.default zurückgegriffen.

OPTIMIZE mit flüssiger Clusterung

Liquid Clustering wird als Tabellenoption angegeben; Details finden Sie unter "Aktivieren von Flüssigclustering". Wenn die Liquid-Clustering-Funktion aktiviert ist, führt OPTIMIZE die physische Neuschreibung durch, die die Clusteringrichtlinie anwendet.

Von Bedeutung

Daten werden nur gruppiert, wenn OPTIMIZE auf Tabellen mit aktiviertem Liquid Cluster ausgeführt wird. Reguläre Schreibvorgänge gruppieren die Daten NICHT. Eine Komprimierungsstrategie wie die Verwendung der automatischen Komprimierung oder die manuelle Planung von Optimierungsaufträgen ist wichtig, um sicherzustellen, dass die Vorteile von gruppierten Daten (d. h. verbessertes Überspringen von Delta-Dateien) realisiert werden können.

Schnelle Optimierung

Schnelle Optimierung analysiert Delta-Tabellendateien intelligent und überspringt Komprimierungsvorgänge, die wahrscheinlich die Leistung nicht sinnvoll verbessern.

Anstatt Dateien blind zu komprimieren, wenn kleine Dateien vorhanden sind, wird schnell optimiert, ob jeder Kandidatenbehälter (Gruppe kleiner Dateien) die konfigurierbaren Ziele gemäß bewährten Kompaktierungspraktiken erfüllt. Fast Optimize führt nur eine Verdichtung bei einer Gruppe von Dateien durch, wenn das Zusammenführen wahrscheinlich Ihre minimale Zielgröße erreicht oder zu viele kleine Dateien vorhanden sind. Andernfalls wird diese Gruppe übersprungen oder die Anzahl der Dateien, die zusammengefasst werden, reduziert.

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

Die schnelle Optimierung kann basierend auf Ihren Erwartungen an die Datenkomprimierung fein abgestimmt werden.

Eigentum Description Standardwert Sitzungskonfiguration
minNumFiles Die Anzahl kleiner Dateien, die in einem Bin vorhanden sein müssen, damit die Optimierung durchgeführt werden kann, falls der Bin nicht genügend Daten enthält, die als ausreichend zur Erstellung einer komprimierten Datei eingeschätzt werden. 50 spark.microsoft.delta.optimize.fast.minNumFiles
ParquetCoefficient Multipliziert mit der minimalen Dateigröße im Optimierungskontext, um die minimale Menge an Daten kleiner Dateien zu ermitteln, die in einem Bin vorhanden sein müssen, damit dieser für die Komprimierung einbezogen wird. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Hinweis

Dies parquetCoefficient führt dazu, dass die Zielgröße eines Bins größer als die minimale Zieldateigröße des Optimierungskontexts ist. Dieser Koeffizienten macht die Realität aus, dass die Kombination mehrerer kleiner Parkettdateien zu einer besseren Komprimierung und damit weniger Daten als die Summe kleiner Dateien führt. Erhöhen Sie den Wert, um festzulegen, dass die Schnelloptimierung Bins konservativer überspringt, oder verringern Sie den Wert, um ein großzügigeres Überspringen von Bins zu ermöglichen.

Funktionsweise

Schnelle Optimierung führt zusätzliche Prüfungen ein, bevor Container komprimiert werden. Für jeden Kandidatencontainer bewertet die schnelle Optimierung Folgendes:

  • Die geschätzte Menge an Rohdaten im Bin (Summe kleiner Dateigrößen)
  • Gibt an, ob die Kombination der kleinen Dateien geschätzt wird, um eine Datei zu erstellen, die die konfigurierte Mindestzielgröße erfüllt.
  • Gibt an, ob der Bin mindestens die konfigurierte Mindestanzahl kleiner Dateien enthält.

Schnelle Optimierung wertet jeden Bin kleiner Dateien aus und komprimiert nur die Bins, die wahrscheinlich die minimale Zielgröße erreichen oder die minimale Dateianzahl überschreiten. Bins, die diese Schwellenwerte nicht erfüllen, werden übersprungen oder teilweise komprimiert. Das Überspringen suboptimaler Bins reduziert unnötige Neuschreibungen, verringert die Schreibverstärkung und macht OPTIMIZE-Aufträge mehr idempotent.

Screenshot, das zeigt, wie schnell Fast Optimize auswertet, ob ein Container kompakt ist.

Hinweis

Die genaue Implementierung unterliegt im Laufe der Zeit einer Weiterentwicklung.

Fast Optimize kann die neu geschriebenen Daten über einen Delta-Tabellenlebenszyklus reduzieren. Wie im folgenden Diagramm gezeigt, überspringt die schnelle Optimierung die suboptimalen Bins, was zu schnelleren und idempotenteren OPTIMIZE Prozessen mit weniger Schreibverstärkung führt.

Screenshot, der zeigt, wie schnelle Optimierungsergebnisse über die Zeit zu weniger Datenneuschreibungen führen.

Hinweis

Die obigen Diagramme gehen nur aus Veranschaulichungszwecken davon aus, dass die Größe der aus Komprimierung geschriebenen Datei die Summe der Größe kleiner Dateien ist. Sie impliziert auch eine parquetCoefficient von 1.

Einschränkungen
  • Nicht anwendbar auf Flüssigclustering- und Z-Order-Vorgänge
  • Schnelle Optimierung ändert das Verhalten der automatischen Komprimierung nicht

Komprimierungsziele auf Dateiebene

Um das Neuschreiben von Daten zu vermeiden, die zuvor als komprimiert (groß genug) betrachtet wurden, basierend auf dem Ändern von Komprimierungs-Min- und max.-Dateigrößenzielen, können aktiviert werden, spark.microsoft.delta.optimize.fileLevelTarget.enabled um eine erneute Compaction von bereits komprimierten Dateien zu verhindern. Wenn diese Option aktiviert ist, werden Dateien nicht erneut kompagiert, wenn sie zuvor mindestens die Hälfte der Zieldateigröße zum Zeitpunkt der Komprimierung erreicht haben. Die Verwaltung von Zielen auf Dateiebene minimiert die Schreibverstärkung, da sich die Größe der Komprimierungsziele im Laufe der Zeit ändert (z. B. durch Bewertung und Festlegung eines größeren Ziels). Wenn diese Option aktiviert ist, wird das OPTIMIZE_TARGET_SIZE Tag neuen Dateien hinzugefügt, wenn OPTIMIZE ausgeführt wird oder bei einem Schreibvorgang, wenn die Tabelleneigenschaft delta.targetFileSize oder delta.targetFileSize.adaptive festgelegt ist.

Hinweis

Obwohl nicht standardmäßig aktiviert, empfiehlt Microsoft die Aktivierung von Komprimierungszielen auf Dateiebene, um eine potenzielle Schreibverstärkung zu begrenzen.

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

Automatische Komprimierung

Die automatische Komprimierung wertet den Partitionsstatus nach jedem Schreibvorgang aus. Wenn eine übermäßige Dateifragmentierung (zu viele kleine Dateien) innerhalb einer Partition erkannt wird, löst sie einen synchronen OPTIMIZE Vorgang unmittelbar nach dem Commit des Schreibvorgangs aus. Dieser writer-gesteuerte Ansatz zur Dateiwartung ist optimal, da die Komprimierung nur ausgeführt wird, wenn programmgesteuert festgestellt wird, dass sie von Vorteil ist.

Aktivieren auf Sitzungsebene

Legen Sie spark.databricks.delta.autoCompact.enabled auf Sitzungsebene fest, um die automatische Komprimierung für neue Tabellen zu aktivieren, die in dieser Spark-Sitzung erstellt wurden:

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

Auf Tabellenebene aktivieren

Legen Sie die Tabelleneigenschaft delta.autoOptimize.autoCompact fest, um die automatische Komprimierung für bestimmte Tabellen zu aktivieren:

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

Verwenden Sie die DataFrameWriter-Option delta.autoOptimize.autoCompact , um die automatische Komprimierung beim Erstellen einer Tabelle zu aktivieren:

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

Aktivieren Sie dieselbe Tabelleneigenschaft für eine vorhandene Tabelle:

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

Reduzieren des Auswertungsaufwands

Ab Fabric Spark Runtime 2.0 (Delta 4.1) können Sie den automatischen Komprimierungsmodus onCheckpointOnly aktivieren. Standardmäßig wertet die automatische Komprimierung Dateimetadaten nach jedem Schreibvorgang aus, um zu bestimmen, ob eine Tabelle zu viele kleine Dateien enthält. Mit onCheckpointOnly wird die Auswertung auf Checkpoint-Vorgänge des Protokolls verschoben (typischerweise alle 10 Commits). Zum Zeitpunkt des Checkpoints ist der Snapshot der Tabelle bereits vollständig rekonstruiert, sodass die Auswertung auf Metadaten zugreift, die sich bereits im Speicher befinden, ohne einen zusätzlichen Scan zu erfordern. Die verzögerte Auswertung reduziert den Aufwand pro Commit, während gleichzeitig sichergestellt wird, dass Tabellen in regelmäßigen Abständen komprimiert werden.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE