跳到主要内容

Join 操作

如何强制 Join 顺序

Goose 使用基于代价的查询优化器,会利用基础表(存储在 Goose 数据库或 Parquet 文件中)的统计信息来估算操作基数。

关闭 Join 顺序优化器

要关闭 Join 顺序优化器,请设置以下 PRAGMA

SET disabled_optimizers = 'join_order,build_side_probe_side';

这会同时禁用 Join 顺序优化和 Join 的左右交换。 这样 Goose 会按 JOIN 子句顺序构建 left-deep join tree。

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

相关查询执行完成后,可用以下命令重新启用优化器:

SET disabled_optimizers = '';

创建临时表

若要强制特定 Join 顺序,可将查询拆分为多条语句,并在每步创建临时表:

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 ...

清理时删除中间表:

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