Große Delta-Tabellen optimieren – So werden Abfragen deutlich schneller

Delta Lake eignet sich hervorragend für große Datenmengen. Mit zunehmender Größe einer Tabelle können Abfragen jedoch langsamer werden. Durch einige bewährte Optimierungsmaßnahmen lässt sich die Performance deutlich verbessern.

Partitionierung sinnvoll einsetzen

Eine geeignete Partitionierung reduziert die Anzahl der zu lesenden Dateien. Besonders häufig verwendete Filterspalten eignen sich dafür.

Beispiel:

df.write \
.format("delta") \
.partitionBy("Jahr", "Monat") \
.save("/mnt/delta/sales")

Wichtig: Zu viele Partitionen können ebenfalls die Performance verschlechtern. Daher sollten nur Spalten mit einer überschaubaren Anzahl unterschiedlicher Werte verwendet werden.

OPTIMIZE ausführen

Im Laufe der Zeit entstehen viele kleine Dateien. Diese erhöhen den Verwaltungsaufwand und verlangsamen Abfragen.

Mit folgendem Befehl werden kleine Dateien zusammengeführt:

OPTIMIZE sales;

Dadurch werden weniger Dateien gelesen und die Scan-Performance verbessert.

Z-ORDER verwenden

Wer häufig nach bestimmten Spalten filtert, kann zusätzlich Z-ORDER einsetzen.

Beispiel:

OPTIMIZE sales
ZORDER BY (customer_id);

Dadurch werden zusammengehörige Werte physisch näher gespeichert, wodurch Databricks weniger Daten lesen muss.

Predicate Pushdown nutzen

Abfragen sollten möglichst früh gefiltert werden.

Statt:

df = spark.read.table("sales")
result = df.filter(df.country == "DE")

sollten nur die tatsächlich benötigten Daten geladen werden:

result = spark.sql("""
SELECT *
FROM sales
WHERE country = 'DE'
""")

Dadurch kann Delta Lake unnötige Dateien direkt überspringen.

Nur benötigte Spalten auswählen

Ein häufiges Performance-Problem ist die Verwendung von:

SELECT *
FROM sales;

Besser:

SELECT customer_id,
amount,
order_date
FROM sales;

Je weniger Daten gelesen werden müssen, desto schneller wird die Abfrage.

Caching für wiederkehrende Abfragen

Wer dieselben Daten mehrfach verwendet, kann sie im Speicher halten:

df.cache()

oder:

CACHE TABLE sales;

Dadurch entfallen wiederholte Zugriffe auf den Storage.

Statistiken aktuell halten

Der Query Optimizer profitiert von aktuellen Statistiken:

ANALYZE TABLE sales COMPUTE STATISTICS;

Dadurch können effizientere Ausführungspläne erzeugt werden.

Photon aktivieren

In Databricks sorgt die Photon Engine für deutlich schnellere SQL-Abfragen und Joins. Gerade bei sehr großen Delta-Tabellen kann dies die Laufzeiten erheblich reduzieren.

Broadcast-Joins für kleine Dimensionstabellen

Beim Join großer Faktentabellen mit kleinen Dimensionstabellen kann ein Broadcast-Join sinnvoll sein:

from pyspark.sql.functions import broadcast

result = fact_df.join(
broadcast(dim_df),
"customer_id"
)

Dadurch wird ein aufwendiger Shuffle vermieden.

Fazit

Wenn eine große Delta-Tabelle langsam wird, sollten Sie systematisch folgende Punkte prüfen:

  • Sinnvolle Partitionierung
  • OPTIMIZE
  • ZORDER BY
  • Frühes Filtern der Daten
  • Keine Verwendung von SELECT *
  • Caching häufig genutzter Daten
  • Aktuelle Statistiken
  • Photon Engine aktivieren
  • Broadcast-Joins für kleine Tabellen

Mit diesen Maßnahmen lassen sich selbst sehr große Delta-Tabellen in Databricks effizient und performant abfragen.

📺 Weitere Tutorials zu Databricks, Azure Synapse, Power BI und Excel finden Sie auf meinem YouTube-Kanal:
👉 https://www.youtube.com/@datenanalyst

📈 Weitere Anleitungen finden Sie auf:
👉 https://www.datenanalyst.com

Verwandte Artikel