Ist ein SQL-Subselect mit DISTINCT schneller?

Antwort vom

Nein, DISTINCT macht einen Subselect nicht automatisch schneller; es kann wirkungslos sein oder zusätzliche Arbeit verursachen.

DISTINCT entfernt doppelte Ergebniszeilen. Ob sich das lohnt, hängt davon ab, wie die Unterabfrage verwendet wird und welchen Ausführungsplan die Datenbank wählt. Es ist deshalb kein allgemeiner Performance-Schalter.

Entscheidend ist die Verwendung

  • Bei IN oder EXISTS: Duplikate ändern nicht, ob ein passender Datensatz existiert. MySQL ignoriert DISTINCT ausdrücklich, wenn die Unterabfrage die Voraussetzungen für eine Semijoin-Optimierung erfüllt. Dann bringt das zusätzliche Schlüsselwort keinen Vorteil.
  • Bei einer Unterabfrage als JOIN-Eingabe: DISTINCT kann die weiterzuverarbeitende Zeilenmenge reduzieren. Dafür müssen zunächst Duplikate entfernt werden. Ob die Gesamtabfrage dadurch gewinnt, muss der Ausführungsplan zeigen. Wichtig: Das Entfernen von Duplikaten kann hier auch das Ergebnis verändern.

Konkretes Beispiel und Prüfung

Bei dieser Abfrage ist DISTINCT für das Ergebnis nicht erforderlich:

SELECT *
FROM kunden
WHERE id IN (
    SELECT DISTINCT kunden_id
    FROM bestellungen
);

Ob eine Kunden-ID in der Unterabfrage einmal oder mehrfach vorkommt, ändert die Zugehörigkeitsprüfung nicht. Unter den genannten MySQL-Optimierungsbedingungen wird DISTINCT daher ignoriert.

Praktisch sinnvoll: Vergleiche beide Varianten anhand des tatsächlichen Ausführungsplans. In PostgreSQL liefert EXPLAIN ANALYZE tatsächliche Laufzeiten und Zeilenzahlen, führt die Abfrage dabei aber wirklich aus. Entscheidend ist die gesamte Abfrage, nicht nur der Subselect.

Quellen:

Kategorie: Programmierung Unterkategorien: Datenbanken

Erstellt mit GPT-6.1 Sol (OpenAI) auf Basis einer aktuellen Websuche.

Verwandte Fragen

Was ist ein Commit in SQL?

COMMIT ist ein SQL-Befehl, der eine Transaktion abschließt und ihre Änderungen dauerhaft in der Datenbank speichert. Eine Transaktion fasst Datenbankoperationen zusammen, beispielsweise &A...

Wie lassen sich PostgreSQL-INSERT-RETURNING-Werte in eine andere bestehende Tabelle einfügen?

Setze das erste INSERT in eine WITH-Abfrage und übernimm dessen RETURNING-Ergebnis mit INSERT … SELECT in die zweite Tabelle. Beispiel Angenommen, die bestehenden Tabellen heißen &b...

Wie wandelt man in SQL ein Textfeld in ein Zahlenfeld um?

Mit CAST wandelst du Text in einer Abfrage in Zahlen um; mit ALTER TABLE änderst du den Spaltentyp dauerhaft. Umwandlung in einer Abfrage Für eine Ganzzahl kannst du beispielsweise schreibe...

Wie verwendet man einen Datumsparameter in einer Hibernate Query?

Einen Datumsparameter bindest du mit setParameter() an einen benannten Platzhalter, beispielsweise als LocalDate für ein Datum ohne Uhrzeit. Beispiel: Die Entity „Bestellung“ besitzt...