【发布时间】:2022-01-24 08:35:35
【问题描述】:
我有两个要查询的表,tableA 有 ~53_000 行,而 tableB 有 ~530M 行。
SELECT
b.some_field AS field,
a.*
FROM tableA a -- 53_462
LEFT JOIN tableB b -- 527_795_032
ON a.user_id = b.user_id
AND a.numeric_field >= b.numeric_field
AND a.numeric_field <= b.other_numeric_field
;
这会杀死查询引擎,因为右侧比左侧大得多,所以我认为左侧的每一行都必须查询右侧。
在这种情况下(右手边的尺寸比左手边大得多)最好的做法是:
我在考虑两种可能性:
- 换边并使用右连接
- 通过查询右侧存在的行并连接该表来创建一个可能小得多的表
【问题讨论】:
-
在传统的数据库系统上,您会查看 index 这个查询,这可能会有很大帮助。不确定 Presto 是否会支持这一点。请注意,使用
LIMIT而不使用ORDER BY是毫无意义的;如果您打算使用LIMIT,您的查询应该有一个ORDER BY子句。 -
顺便说一句,
Presto应该有Full Outer Join,即使我不知道从它支持的版本开始,看来你会需要 -
LIMIT 用于调试。
-
这会杀死查询引擎,因为右侧比左侧大得多 啊哈不。事实上相反;您希望右侧更大,因为连接数是左侧的行数。请在这些表上显示所有相关索引。
-
这是一个分布式查询引擎(请查看标签),不涉及索引。
标签: sql amazon-web-services amazon-athena presto