如何交换 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
来创建可能更小的 table
我最终创建了一个只有匹配行的临时 table。
CREATE TABLE b_temp
....
IN (
SELECT
DISTINCT user_id
FROM
a
)
这让我可以将 b table 过滤到一个合理的大小。
我有两个 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 来创建可能更小的 table
我最终创建了一个只有匹配行的临时 table。
CREATE TABLE b_temp
....
IN (
SELECT
DISTINCT user_id
FROM
a
)
这让我可以将 b table 过滤到一个合理的大小。