如何交换 SQL 中左连接的边?

How to swap the sides of a left join in SQL?

我有两个 table 我想查询,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
;

这会杀死查询引擎,因为右侧比左侧大得多,所以我认为对于左侧的每一行,它都必须查询右侧。

遇到这种情况(右手边比左手边大很多)最好怎么办:

我在考虑两种可能:

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

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

这让我可以将 b table 过滤到一个合理的大小。