Neu

msg digital mehr

Gradient lila

SQL-Optimierung
in wenigen Schritten

Viele Performance-Probleme lassen sich bereits mit kleinen Anpassungen beheben. Die folgenden Tipps zeigen, wie sich Abfragen gezielt optimieren lassen, um das volle Leistungspotenzial auszuschöpfen.

7 Tipps für schnellere Abfragen in verteilten Datenbanken

Ineffiziente Queries als echter Performance-Killer

Viele Performance-Probleme sind nicht auf langsame Hardware, sondern auf ineffiziente SQL-Abfragen zurückzuführen. Meistens fallen diese aber bei kleinen Datenmengen nicht auf. Mit der Zeit vervielfachen sich Daten und Abfragezeiten. Die bestmögliche Lösung kann man nur im jeweiligen Fall ermitteln. Dennoch kann die Beachtung folgender Tipps die SQL-Performance bereits maßgeblich verbessern.

Grundlegende Optimierungen

1.      zu wenig Filter-Kriterien:

Häufig wird nur ein bestimmter Datenbereich der gejointen Tabellen benötigt. Durch die Begrenzung auf bestimmte Ausprägungen müssen weniger Daten verarbeitet werden. 
Beispielsweise können historisierte Tabellen in der Regel auf die letzten fachlich gültigen Daten begrenzt werden (im Bild die Zeilen mit guelt_stat = L). So können viele Zeilen gespart werden, da sich über Jahrzehnte eine große Datenmenge anhäuft.

Ausschnitt einer Datenbanktabelle mit Spalten guelt_ab, guelt_bis, guelt_stat und upd_dat. Die Tabelle zeigt mehrere historisierte Datensätze mit unterschiedlichen Gültigkeitszeiträumen und Statuswerten ‚H‘ und ‚L‘.

2.      unzureichende Join-Bedingung:

Wenn mehrere Zeilen auf beiden Seiten matchen (Viele-zu-viele-Beziehung), entsteht ein kartesisches Produkt (Cross Join) der beiden Tabellen. Cross Joins sind selten beabsichtigt - oder notwendig - und sollte unbedingt vermieden werden. Bereits mittlere Datenmengen erzeugen eine erhebliche Last und Abfragezeit. In diesem Fall sollten eindeutige Felder für den Join verwendet werden. Diese sollten für die beste Performance zusätzlich dieselben Datentypen haben.

Grafische Darstellung eines SQL-Explain-Plans: Daten aus der Tabelle sales durchlaufen eine Broadcast Motion, während products materialisiert wird. Anschließend erfolgt ein Nested Loop Left Join, gefolgt von einer Gather Motion.

3.      schlechtes Datenmodell:

Optimierte SQLs bringen keinen signifikanten Vorteil, wenn das Datenmodell nicht hinreichend durchdacht oder zukunftsfähig ist. Zu viel aber auch zu wenig Normalisierung kann zu Performance-Problemen führen. Datentypen sollten von vornherein sinnvoll gewählt werden. Oftmals sind diese Datenmodelle durch die Quellsysteme bedingt und nicht änderbar. Dann sollten die Daten in kleineren Schritten an ein performantes Datenmodell angepasst werden. Meistens befinden sich Data-Engineers im Unternehmen, die diese Optimierung unterstützen können.

ERM-Diagramm einer Hochschuldatenbank mit den Tabellen Students, Professors, Addresses, Classes, Semesters und Grades. Die Tabellen sind über Primär- und Fremdschlüsselbeziehungen miteinander verbunden.

Spezifische Optimierung für verteilte Datenbanken am Beispiel von Greenplum

1.      Tabellen-Analyze durchführen:

Für den Optimizer ist die Kenntnis über die Datenstrukturen und -Statistiken essenziell. Dabei werden z.B. die häufigsten Spaltenwerte und eine geschätzte Datenverteilung ermittelt. Diese Informationen helfen dem Query Planner den effizientesten Execution Plan für Abfragen zu ermitteln. In bestimmten Fällen sollte allerdings kein explizites Analyze erfolgen (z.B. zwischen direkt aufeinanderfolgenden Inserts, Updates oder Deletes).

2.      Sub-Selects vermeiden:

Die Ergebnismenge des Sub-Selects wird per Datenbank-Broadcast auf alle Segment-Server verteilt. Je nach Größe kann das signifikante Performance-Nachteile bedeuten. Stattdessen sollten Sub-Selects in vorherige Temp-Tabellen ausgelagert und anschließen im eigentlichen Select gejoint werden.

3.      Verteilung (Distribution) optimieren:

Durch den Verteilschlüssel werden die Daten auf alle Segment-Server der Greenplum-DB verteilt. Dieser Schlüssel wird am Ende von Tabellendefinitionen hinterlegt mit distributed by <Spalte>. Die Ausprägungen der Spalte sollten ein Vielfaches der Anzahl der Segment-Server sein, da es sonst zu ungleicher Verteilung und höheren Abfragezeiten kommt. Dabei können einzelne Ausprägungen die gleichmäßige Verteilung stören, beispielsweise wenn eine große Anzahl NULLs existiert.

„Diagramm der Greenplum MPP-Architektur mit Nutzern, einem lokalen Netzwerk, zwei Coordinator Hosts und mehreren Segment Hosts, die über einen 25/50/100-GbE-Switch verbunden sind.“

Quelle: https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/7/greenplum-database/admin_guide-intro-arch_overview.html am 08.10.2025

4.      durchdachtes Indexing:

In klassischen Datenbanken können Indexe den Datenzugriff maßgeblich beschleunigen. In einer auf viele Segmente verteilten Datenbank wie Greenplum sollte das allerdings in Maßen genutzt werden.

Greenplum kann sehr schnelle sequentielle Scans durchführen, weshalb die Performance bei großen Datenmengen für BI-Lösungen ohne Indexing oftmals besser ist. Auch bei vielen regelmäßigen Schreiboperationen erzeugt Indexing einen größeren Aufwand durch die Pflege des Indexes.

Dennoch gibt es Fälle in denen auch Indexing die Abfragezeit in GreenplumDBs verbessert.

Diagramm, das zeigt, wie eine Datenbankabfrage über einen Index passende Pointer findet und anschließend die zugehörigen Zeilen in der Tabelle nachlädt.

Quelle: https://www.atlassian.com/data/databases/how-does-indexing-work am 08.10.2025

Fazit

Es gibt viele Wege, um die Query-Performance zu boosten. Für die Einzelfallbehandlung müssen allerdings immer die Gegebenheiten der Datenbank und des Datenmodells beachtet werden. Bei unterschiedlichen Einstellungen können vermeintliche Optimierungen ineffizienter sein. Daher ist es essenziell mit dem Datenbank-Admin und Data Engineers in Kontakt zu treten und die optimale Herangehensweise für Ihr Unternehmen / Ihren Bereich / Ihre Anwendung herauszufinden.

Haben Sie Fragen? Sprechen Sie uns an!

Porträt von Marcel Dittmann, msg

Marcel Dittmann

IT Consultant