SQL等价改写核心思想概述;;1;1:1 关系
两表关联返回1的关系,常见于对表做垂直拆分之后的两表关联(主键关联)
1:N 关系
两表关联返回N的关系
最常见的应用,比如一个商品(1)对应多个订单(N)
N:N 关系
两表关联返回局部范围笛卡尔积,常见于半连接和反连接中(in,exists/not in,not exists);select count(*) from a left join b on a.id=b.id;
某运营商,2012年,Oracle10gR2
a:b是1:1关系,a和b都是上千万条数据,原始SQL要跑12秒
因为是left join,不管a和b是否能关联上,都会返回a的所有数据,b属于1的关系 不管有没有关联上,不影响最终count(*)的结果,所以SQL被改写为:
select count(*) from a;
最终0.05秒就能返回结果
其实,只要b是1的关系,不管a是属于1的关系还是N的关系,都能这样改写
注:到了Oracle11g之后,CBO会自动改写上面SQL;1;;select * from dept where deptno in (select deptno from emp);
dept与emp是1:N关系,上面查询只返回dept表的数据,也就是说返回的是1的关系
将上面查询改写为内连接的时候,可以将emp变成1的关系,再与dept关联
原创力文档

文档评论(0)