【 TiDB 使用环境】
v5.1.2
【概述】 场景 + 问题概述
请问下,像是如下sql,在x_tab表数据量几十亿,IN子查询数据量几千万场景下,该怎样优化呢。
EXPLAIN ANALYZE
SELECT
x.uid,
sum(x.m) as amount
FROM
x_tab x
WHERE
uid IN
(
SELECT
uid
FROM
x_tab
WHERE
z_time BETWEEN '2022-03-29 00:00:00' AND '2022-03-30 00:00:00'
UNION DISTINCT
SELECT
uid
FROM
y_tab
WHERE
z_time BETWEEN '2022-03-29 00:00:00' AND '2022-03-30 00:00:00'
)
GROUP BY
x.uid;
如果不做任何处理,直接在TiFlash上运行,会自动将子查询转为inner join语义
如果禁止该优化,则我的得到的反而是semi join,而非将子查询展开后的IN查询语义。
set SESSION tidb_opt_insubq_to_join_and_agg=OFF;