15 半连接(semi-join)--优化主题系列
2017-10-10 17:01
204 查看
半连接(semi-join)
半连接是指两个表/结果集做JOIN,但是只返回某一个表/结果集中的数据。
执行计划中,看到有NESTED LOOPS SEMI/HASH JOIN SEMI
就表示有半连接
比如下面的SQL(基于HROracle11gR2)
select department_name
from hr.departments dept
where department_id IN (select department_id from hr.employeesemp)
该SQL是departments表和employees表进行JOIN,但是只返回departments表中的数据。
他们肯定在网上看到过相关的理论,in可以被exists代替,现在用exists改写
select department_name
from hr.departments dept
where EXISTS (select null from hr.employees emp
where emp.department_id = dept.department_id);
我们还可以用join改写这个SQL
select distinct department_name
from hr.departments dept, hr.employees emp
where dept.department_id = emp.department_id;
这种写法就是乱写,in里嵌套连接。exists里是可以的。
select department_name
from hr.departments dept
where department_id IN (select department_id from hr.employeesemp where emp.department_id = dept.department_id)
如果半连接改成JOIN
是不是有时候要写DISTINCT关键字??
如果你们select
主键 from A... where
半连接
与主键JOIN
semi join SQL如果改写为innerjoin,一定要记得去重,这里也给了我们一个思路,当你看到SQL是innerjoin,并且用了distinct,并且只从一个表中取数据,可以将这类SQL写成半连接,避免distinct排序,提升性能。
in和exists一般情况下执行计划是一样的,当SQL很复杂,用in或者是exists不同的写法对性能就会产生巨大影响。
半连接是指两个表/结果集做JOIN,但是只返回某一个表/结果集中的数据。
执行计划中,看到有NESTED LOOPS SEMI/HASH JOIN SEMI
就表示有半连接
比如下面的SQL(基于HROracle11gR2)
select department_name
from hr.departments dept
where department_id IN (select department_id from hr.employeesemp)
该SQL是departments表和employees表进行JOIN,但是只返回departments表中的数据。
他们肯定在网上看到过相关的理论,in可以被exists代替,现在用exists改写
select department_name
from hr.departments dept
where EXISTS (select null from hr.employees emp
where emp.department_id = dept.department_id);
我们还可以用join改写这个SQL
select distinct department_name
from hr.departments dept, hr.employees emp
where dept.department_id = emp.department_id;
这种写法就是乱写,in里嵌套连接。exists里是可以的。
select department_name
from hr.departments dept
where department_id IN (select department_id from hr.employeesemp where emp.department_id = dept.department_id)
如果半连接改成JOIN
是不是有时候要写DISTINCT关键字??
如果你们select
主键 from A... where
半连接
与主键JOIN
semi join SQL如果改写为innerjoin,一定要记得去重,这里也给了我们一个思路,当你看到SQL是innerjoin,并且用了distinct,并且只从一个表中取数据,可以将这类SQL写成半连接,避免distinct排序,提升性能。
in和exists一般情况下执行计划是一样的,当SQL很复杂,用in或者是exists不同的写法对性能就会产生巨大影响。
相关文章推荐
- MySQL5.7性能优化系列(二)——SQL语句优化(2)——使用 Semi-Join半连接变换优化子查询,派生表和视图
- 11 哈希连接(HASH JOIN)--优化主题系列
- 16 反连接(anti-join)--优化主题系列
- 14 外连接(hash join outer)--优化主题系列
- 29 超大表与超小表HASH JOIN优化方法--优化主题系列
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 28 分析函数优化自连接,减少表访问次数 --优化主题系列
- 12 排序合并连接(SORT MERGE JOIN)--优化主题系列
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 9 join方法--优化主题系列
- MySQL优化系列(二)--查找优化(2)(外连接、多表联合查询以及查询注意点)
- MySQL优化之使用连接(join)代替子查询
- 1 如何掌握编写一套高质量SQL之本领--优化主题系列
- 【Hive】 Hive调优总结——数据倾斜,join表连接优化
- 使用exists(Semi-Join)优化distinct语句
- 3 直方图--优化主题系列
- 关于mysql inner join 连接查询的优化
- LINQ系列:LINQ to SQL Join连接