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
OPTIMIZEZORDER 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
