25 union代替or --优化主题系列
2017-10-31 10:47
246 查看
当SQL语句中 or条件上面有一个为子查询 这个时候就可以用union代替or或者你发现执行计划中的filter有or 并且or后面跟上子查询EXISTS(select...)的时候就要注意 比如:
当然了 当你看到operation中的filter也应该要注意这些
看到filter后有orexists(select xx)
则改成union
示例如下(请自己动手实验):
create table test1 as select * from dba_objects;
createtable test2 as select * from dba_objects;
createindex idx1 on test1(object_id);
createindex idx2 on test1(owner);
createindex idx3 on test2(object_id);
createindex idx4 on test2(owner);
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
tabname => 'TEST1',
estimate_percent => 100,
method_opt => 'for columns owner size 200',
no_invalidate => FALSE,
degree => 1,
cascade => TRUE);
END;
/
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
tabname => 'TEST2',
estimate_percent => 100,
method_opt => 'for columns owner size 200',
no_invalidate => FALSE,
degree => 1,
cascade => TRUE);
END;
/
select* from test1 where owner='SCOTT' or object_id in(select object_id from test2where owner='SCOTT');
select* from test1 where owner='SCOTT'
union
select* from test1 where object_id in(select object_id from test2 whereowner='SCOTT');
逻辑读从184742到1221
当然了 当你看到operation中的filter也应该要注意这些
看到filter后有orexists(select xx)
则改成union
示例如下(请自己动手实验):
create table test1 as select * from dba_objects;
createtable test2 as select * from dba_objects;
createindex idx1 on test1(object_id);
createindex idx2 on test1(owner);
createindex idx3 on test2(object_id);
createindex idx4 on test2(owner);
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
tabname => 'TEST1',
estimate_percent => 100,
method_opt => 'for columns owner size 200',
no_invalidate => FALSE,
degree => 1,
cascade => TRUE);
END;
/
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
tabname => 'TEST2',
estimate_percent => 100,
method_opt => 'for columns owner size 200',
no_invalidate => FALSE,
degree => 1,
cascade => TRUE);
END;
/
select* from test1 where owner='SCOTT' or object_id in(select object_id from test2where owner='SCOTT');
select* from test1 where owner='SCOTT'
union
select* from test1 where object_id in(select object_id from test2 whereowner='SCOTT');
逻辑读从184742到1221
相关文章推荐
- 26 union代替or-续 --优化主题系列
- sql 数据优化 union 代替or
- 使用or展开进行sql优化(即sql语法union all代替or可以提高效率)
- 10 嵌套循环(NESTED LOOP)--优化主题系列
- SQL联合查询优化 用union all来代替union
- 170505、MySQL的or/in/union与索引优化
- SQL联合查询优化 用union all来代替union
- MySQL的or/in/union与索引优化
- MySQL的or/in/union与索引优化
- 18 索引扫描成本计算--优化主题系列
- MySQL的or/in/union与索引优化
- 23 查看真实基数--优化主题系列
- 29 超大表与超小表HASH JOIN优化方法--优化主题系列
- 3 直方图--优化主题系列
- 12 排序合并连接(SORT MERGE JOIN)--优化主题系列
- 16 反连接(anti-join)--优化主题系列
- 21 视图合并(view merge) --优化主题系列
- 2 基数与选择性--优化主题系列
- spark sql优化:小表大表关联优化 & union替换or & broadcast join
- 14 外连接(hash join outer)--优化主题系列