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 firstJOIN ...; -- this join is performed secondNachdem 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, t1CREATE OR REPLACE TEMPORARY TABLE t2 AS SELECT * FROM t1 ...;
-- compute the final result using t2SELECT * FROM t1 ...Zum Aufräumen löschen Sie die Zwischentabellen:
DROP TABLE IF EXISTS t1;DROP TABLE IF EXISTS t2;