【问题标题】:How to swap the sides of a left join in SQL?如何在 SQL 中交换左连接的两边?
【发布时间】: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


【解决方案1】:

我最终创建了一个只有匹配行的临时表。

CREATE TABLE b_temp
....
  IN (
        SELECT
          DISTINCT user_id
        FROM
          a
     )

这允许我将 b 表过滤到合理的大小。

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多