CTE oder Unterabfrage oder temporäre Tabelle
Vor- und Nachteile bei Materialisierung, Wiederverwendung und dem Verhalten des Optimierers
CTE oder Unterabfrage oder temporäre Tabelle ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Drei Möglichkeiten, Logik zwischenzuspeichern
Wenn eine Abfrage ein Zwischenergebnis benötigt, stehen Ihnen drei gängige Werkzeuge zur Verfügung: eine Unterabfrage, eine CTE und eine temporäre Tabelle. Interviewerinnen und Interviewer lassen Sie diese vergleichen, weil die Wahl zeigt, ob Sie Materialisierung und das Verhalten des Optimizers verstehen.
Diese Lektion vermittelt Ihnen ein Entscheidungsmodell, das Sie auch unter Druck wiedergeben können.
Die Unterabfrage
Eine Unterabfrage ist eine Inline-Abfrage, die innerhalb einer anderen Abfrage verschachtelt ist, häufig in FROM, WHERE oder SELECT. Sie ist Teil derselben Anweisung, und der Optimizer betrachtet sie als eine zusammenhängende Einheit.
- Es ist kein Name erforderlich (abgeleitete Tabellen benötigen allerdings einen Alias).
- Der Optimizer kann sie mit der äußeren Abfrage zusammenführen.
- Bei tiefer Verschachtelung wird sie unübersichtlich und schwer lesbar.
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) t
WHERE t.total > 1000;Die CTE
Eine CTE ist eine benannte Unterabfrage in einem WITH-Block, deren Gültigkeitsbereich auf eine einzige Anweisung beschränkt ist. Sie ist besser lesbar als eine tief verschachtelte Unterabfrage und kann mehrfach referenziert werden.
- Sie ist benannt, sodass die Absicht dokumentiert ist.
- Sie kann innerhalb derselben Anweisung mehr als einmal referenziert werden.
- Ihr Gültigkeitsbereich bleibt auf eine einzige Anweisung beschränkt; danach ist sie nicht mehr vorhanden.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;Die temporäre Tabelle
Eine temporäre Tabelle ist eine echte, physische Tabelle, die für die Sitzung (oder Transaktion) besteht. Sie wird mit einer Anweisung befüllt und in späteren, getrennten Anweisungen abgefragt.
- Sie bleibt über mehrere Anweisungen innerhalb der Sitzung hinweg bestehen.
- Sie kann Indizes besitzen und mit Statistiken versehen werden.
- Sie verursacht Festplatten-I/O und erfordert eine explizite Bereinigung.
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;
SELECT * FROM spend WHERE total > 1000;Materialisierung: Der zentrale Unterschied
Das zentrale Konzept, nach dem Interviewerinnen und Interviewer fragen, ist die Materialisierung: die Frage, ob das Zwischenergebnis physisch irgendwo geschrieben wird.
- Unterabfragen und CTEs werden normalerweise nicht materialisiert; der Optimizer bindet sie häufig inline ein.
- Eine temporäre Tabelle wird immer im Speicher oder auf einem Speichermedium materialisiert.
- Einige Datenbanken ermöglichen es, die Materialisierung von CTEs mit Hinweisen zu erzwingen oder zu verhindern.
Optimizer-Schranken und die alte Postgres-Falle
Historisch behandelte PostgreSQL jede CTE als Optimierungsschranke, materialisierte sie und verhinderte das Weiterreichen von Prädikaten. Seit Postgres 12 werden einfache, nicht rekursive CTEs, auf die einmal verwiesen wird, standardmäßig inline eingebunden. Mit den Hinweisen MATERIALIZED und NOT MATERIALIZED kann dieses Verhalten überschrieben werden.
Wenn Sie diese Feinheit erwähnen, signalisiert das ein hohes Erfahrungsniveau.
WITH spend AS NOT MATERIALIZED (
SELECT customer_id, SUM(amount) AS total
FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;Wiederverwendung innerhalb einer Anweisung
Wenn Sie in einer Anweisung mehrmals auf dasselbe Zwischenergebnis verweisen, kann eine CTE übersichtlicher sein, als eine Unterabfrage zu wiederholen. Beachten Sie jedoch: Eine inline eingebundene CTE kann bei jedem Verweis erneut berechnet werden.
Wenn die Neuberechnung teuer ist, verhindert das Erzwingen der Materialisierung (oder die Verwendung einer temporären Tabelle), dass die Arbeit doppelt ausgeführt wird.
Wiederverwendung über mehrere Anweisungen hinweg
CTEs und Unterabfragen bestehen jeweils nur für eine Anweisung. Wenn Sie dasselbe Ergebnis in mehreren separaten Abfragen benötigen, ist eine temporäre Tabelle das richtige Werkzeug.
Ein typischer Fall ist ein mehrstufiger ETL-Prozess oder Bericht, bei dem Sie einmal eine Staging-Menge aufbauen und anschließend mehrere Analysen darauf ausführen. Durch das Erstellen von Indizes auf der temporären Tabelle können dann alle nachfolgenden Abfragen beschleunigt werden.
Indizes und Statistiken
Nur eine temporäre Tabelle kann Indizes und aktuelle Statistiken enthalten. Bei einer großen Zwischenergebnismenge, die mehrfach verknüpft wird, kann das entscheidend sein.
- CTE/Unterabfrage: Der Optimizer schätzt anhand der zugrunde liegenden Tabellen.
- Temporäre Tabelle: Sie können
ANALYZEausführen und Indizes hinzufügen, die auf Ihre späteren Verknüpfungen zugeschnitten sind.
Bei großen, intensiv wiederverwendeten Ergebnissen kann eine temporäre Tabelle daher trotz der zusätzlichen Schritte bei der Leistung überlegen sein.
Die Entscheidungshilfe
Eine prägnante Antwort im Vorstellungsgespräch:
- Unterabfrage: einmalige Verwendung, geringe Verschachtelung, Lesbarkeit ist ausreichend.
- CTE: verbessert die Lesbarkeit oder wird innerhalb einer Anweisung einige Male referenziert.
- Temporäre Tabelle: wird über mehrere Anweisungen hinweg wiederverwendet, ist sehr groß oder benötigt Indizes/Statistiken.
Verwenden Sie standardmäßig eine CTE für mehr Klarheit; greifen Sie zu einer temporären Tabelle, wenn Materialisierung oder Wiederverwendung über mehrere Anweisungen hinweg tatsächlich Vorteile bringt.
Den Zielkonflikt formulieren
Vermeiden Sie absolute Aussagen wie „CTEs sind immer langsamer“. Sagen Sie stattdessen: CTEs und Unterabfragen werden normalerweise inline eingebunden, daher geht es bei ihnen vor allem um Lesbarkeit; eine temporäre Tabelle wird materialisiert und lohnt sich, wenn ich ein großes Ergebnis über mehrere Anweisungen hinweg wiederverwende oder einen Index benötige.
Wenn Sie anerkennen, dass dieses Verhalten von der jeweiligen Engine abhängt (und bei Postgres auch von der Version), zeigen Sie echtes fachliches Verständnis.
Kurzer Selbsttest
Wählen Sie das Szenario aus, in dem eine temporäre Tabelle eindeutig die bessere Wahl ist.
Rückblick: CTE vs. Unterabfrage vs. temporäre Tabelle
Die Entscheidung hängt von Materialisierung und Gültigkeitsbereich ab.
- Unterabfragen und CTEs: normalerweise inline eingebunden, auf eine Anweisung beschränkt und aufgrund ihrer Lesbarkeit gewählt.
- CTEs bieten Benennung und Wiederverwendung innerhalb einer Anweisung.
- Temporäre Tabellen: immer materialisiert, über mehrere Anweisungen hinweg vorhanden und mit Indizes versehbar.
- Postgres 12+ bindet einfache CTEs inline ein; verwenden Sie MATERIALIZED-Hinweise, um dieses Verhalten zu steuern.
Als Nächstes: Eine unübersichtliche verschachtelte Abfrage in saubere CTEs umstrukturieren.
Häufig gestellte Fragen
Ist die Lektion „CTE oder Unterabfrage oder temporäre Tabelle“ kostenlos?
Ja — der vollständige Text von „CTE oder Unterabfrage oder temporäre Tabelle“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „CTE oder Unterabfrage oder temporäre Tabelle“?
Vor- und Nachteile bei Materialisierung, Wiederverwendung und dem Verhalten des Optimierers Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „CTE oder Unterabfrage oder temporäre Tabelle“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ihre erste CTE schreiben
- Mehrere CTEs verketten
- CTE oder Unterabfrage oder temporäre Tabelle
- Verschachtelte Abfragen in CTEs umstrukturieren