将NOT IN关联子查询替换为JOIN以优化SQL性能
用JOIN替换NOT IN子查询优化SQL性能
现有两张数据表Tbl和Tbl2,原查询使用带NOT IN的关联子查询获取目标数据,但子查询存在性能瓶颈。下面把原语句替换为JOIN写法,既能优化性能,又能得到预期结果。
数据表内容
Tbl表
| Col1 | Col2 |
|---|---|
| 1 | 100 |
| 2 | 101 |
| 2 | 200 |
| 3 | 205 |
| 4 | 210 |
Tbl2表
| Col1 | Col2 |
|---|---|
| 1 | 100 |
| 2 | 101 |
| 2 | 200 |
| 3 | 300 |
| 4 | 210 |
| 5 | 211 |
| 6 | 212 |
原SQL语句
select t1.col1, t1.col2 from tbl t1 where t1.col2 not in (select t2.col2 from tbl2 t2 where t2.col1 = t1.col1)
优化后的JOIN写法
select t1.col1, t1.col2 from tbl t1 left join tbl2 t2 on t1.col1 = t2.col1 and t1.col2 = t2.col2 where t2.col1 is null
逻辑说明
用LEFT JOIN关联两张表的Col1和Col2,保留Tbl里的所有记录,匹配Tbl2中同Col1且Col2相同的记录。最后筛选出Tbl2侧没有匹配到的记录(即t2.col1 IS NULL),这和原NOT IN子查询的逻辑完全一致,但JOIN的执行计划通常更高效,尤其是数据量较大时,能避免子查询的重复执行开销。
预期输出
| Col1 | Col2 |
|---|---|
| 3 | 205 |
内容的提问来源于stack exchange,提问作者ashok kuna
相关产品推荐
相关产品推荐

