SQL优化之标量子查询,坑到你了吗?

关注我的微信公众号:pythonislover,领取python,大数据,SQL优化相关视频资料!~

Python大数据与SQL优化笔 QQ群:771686295

select a.object_id,(select b.username from t1 b where a.owner=b.username) from t2 a;

 

如上面select选项里面套select的格式就是标量子查询。

 

其实标量子查询最重要的一点就是要理解一个关键字 Filter

 

Filter分析单节点和双节点,这里说的就是双节点的Filter,这个有可能就是个性能隐患

 

SQL> create table a (id int,name varchar2(10));Table created.SQL> create table b (id int,name varchar2(10));Table created.SQL> insert into a values (1,'a1');1 row created.SQL> insert into a values (2,'a2');1 row created.SQL> insert into b values (1,'b1');1 row created.SQL> insert into b values (2,'b2');1 row created.SQL> commit;Commit complete.
SQL> select a.*,(select name from b where b.id=a.id) c from a;        ID NAME                 c---------- -------------------- --------------------         1 a1                   b1         2 a2                   b2

------------------------------------------------------------------------------------| Id  | Operation         | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |------------------------------------------------------------------------------------|*  1 |  TABLE ACCESS FULL| B    |      2 |      1 |      2 |00:00:00.01 |      14 ||   2 |  TABLE ACCESS FULL| A    |      1 |      2 |      2 |00:00:00.01 |       8 |------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("B"."ID"=:B1)

 

看到filter("B"."ID"=:B1)了吗? B表 Starts =2 说明B被扫描2次

 

这里的filter其实就相当于nest loop, 在a表里把每条id传到b表里执行

select name from b where b.id=a.id,所以就有了filter

 

也就是说a表有多少条数据,b表就要执行多少次,假如a表有1000W数

据,怎么办? 灾难啊 b表被扫描1000W次,假如b的id列还没有索引,完了,你的系统要垮了

 

当然oracle没这么傻,其实B表扫描的次数 是A表的  count(distinct id)的数量,也就是同样的ID传入B表里,B表之扫描一次。

 

所以标量子查询用在什么情况下,比较合适了

  1. A表的count(distinct id)比较小

  2. B表的连接键,这里就是ID上有比较高效的选择性的索引

 

那么如果项目上遇到标量子查询的性能,问题的时候怎么办呢?

 

那就改成left join吧,这样,可以走hash join, 就避免了filter,性能就蹭蹭的上来了。

 

今天就说到这里了。

 

 

个人意见,如有错误之处,望指正

你可能感兴趣的:(oracle,sql,语句调优及相关技术)