Zum Inhalt springen

Join-Operationen

Wie man eine Join-Reihenfolge erzwingt

DuckDB hat einen kostenbasierten Query-Optimizer, der Statistiken in den Basistabellen (gespeichert in einer DuckDB-Datenbank oder in Parquet-Dateien) nutzt, um die Kardinalität von Operationen zu schätzen.

Den Join-Order-Optimizer ausschalten

Um den Join-Order-Optimizer auszuschalten, setzen Sie die folgenden PRAGMAs:

SET disabled_optimizers = 'join_order,build_side_probe_side';

Das deaktiviert sowohl den Join-Order-Optimizer als auch das Vertauschen von links/rechts bei Joins. DuckDB baut dann einen Left-Deep-Join-Baum in der Reihenfolge der JOIN-Klauseln auf.

SELECT ...
FROM ...
JOIN ... -- this join is performed first
JOIN ...; -- this join is performed second

Nachdem die betreffende Abfrage ausgeführt wurde, schalten Sie die Optimizer mit folgendem Befehl wieder ein:

SET disabled_optimizers = '';

Temporäre Tabellen anlegen

Um eine bestimmte Join-Reihenfolge zu erzwingen, können Sie die Abfrage in mehrere Abfragen aufteilen, von denen jede eine temporäre Tabelle anlegt:

CREATE OR REPLACE TEMPORARY TABLE t1 AS
...;
-- join on the result of the first query, t1
CREATE OR REPLACE TEMPORARY TABLE t2 AS
SELECT * FROM t1 ...;
-- compute the final result using t2
SELECT * FROM t1 ...

Zum Aufräumen löschen Sie die Zwischentabellen:

DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;