技巧2:union 代替or的情况

当SQL语句中,or 条件上面有一个为子查询,并且子查询上的表与源表不同,这个时候就可以用union代替or或者你发现执行计划中的 filter 有 or 并且 or 后面跟上子查询

(EXISTS...)的时候就要注意,比如:

2 - filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e' OR
"T"."KPR_DM"='e90e3fe4237c4af988477329c7f2059e' OR EXISTS (SELECT 0 FROM "KHGL_KHYWDLXX" "Y" WHERE "Y"."KH_ID"=:B1 AND "Y"."SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e')) 当然了,当你看到operation中的filter也应该要注意这些 示例如下(请自己动手实验): create table test1 as select * from dba_objects;
create table test2 as select * from dba_objects;
create index idx1 on test1(object_id);
create index idx2 on test1(owner);
create index idx3 on test2(object_id);
create index 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;
/ 比如这个SQL: select * from test1 where owner='SCOTT' or object_id in(select object_id from test2 where owner='SCOTT'); 执行计划如下: select * from test1 where owner='SCOTT' or object_id in(select object_id from test2 where owner='SCOTT'); 1859 rows selected. Execution Plan
----------------------------------------------------------
Plan hash value: 4136318878 ------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5493 | 520K| 296 (1)| 00:00:04 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | TEST1 | 74533 | 7060K| 296 (1)| 00:00:04 |
| 3 | BITMAP CONVERSION TO ROWIDS | | 1 | 19 | 2 (0)| 00:00:01 |
| 4 | BITMAP AND | | | | | |
| 5 | BITMAP CONVERSION FROM ROWIDS| | | | | |
|* 6 | INDEX RANGE SCAN | IDX3 | 1860 | | 1 (0)| 00:00:01 |
| 7 | BITMAP CONVERSION FROM ROWIDS| | | | | |
|* 8 | INDEX RANGE SCAN | IDX4 | 1860 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("OWNER"='SCOTT' OR EXISTS (SELECT 0 FROM "TEST2" "TEST2" WHERE
"OBJECT_ID"=:B1 AND "OWNER"='SCOTT'))
6 - access("OBJECT_ID"=:B1)
8 - access("OWNER"='SCOTT') Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
475201 consistent gets
0 physical reads
0 redo size
70860 bytes sent via SQL*Net to client
1772 bytes received via SQL*Net from client
125 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1859 rows processed 将SQL改写成UNION形式: SQL> select * from test1 where owner='SCOTT'
union
select * from test1 where object_id in(select object_id from test2 where owner='SCOTT'); 2 3 1859 rows selected. Execution Plan
----------------------------------------------------------
Plan hash value: 1667050602 ------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3719 | 386K| | 502 (81)| 00:00:07 |
| 1 | SORT UNIQUE | | 3719 | 386K| 553K| 502 (81)| 00:00:07 |
| 2 | UNION-ALL | | | | | | |
| 3 | TABLE ACCESS BY INDEX ROWID | TEST1 | 1859 | 176K| | 55 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX2 | 1859 | | | 5 (0)| 00:00:01 |
|* 5 | HASH JOIN | | 1860 | 210K| | 352 (1)| 00:00:05 |
| 6 | TABLE ACCESS BY INDEX ROWID| TEST2 | 1860 | 35340 | | 55 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX4 | 1860 | | | 5 (0)| 00:00:01 |
| 8 | TABLE ACCESS FULL | TEST1 | 74533 | 7060K| | 296 (1)| 00:00:04 |
------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 4 - access("OWNER"='SCOTT')
5 - access("OBJECT_ID"="OBJECT_ID")
7 - access("OWNER"='SCOTT') Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
1131 consistent gets
0 physical reads
0 redo size
79068 bytes sent via SQL*Net to client
1772 bytes received via SQL*Net from client
125 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1859 rows processed 逻辑读从475201降到1131,性能提升非常明显。

union 代替or的情况的更多相关文章

  1. Linq 集合处理(Union)

    关于Union的两种情况 一.简单值类型或者string类型处理方式(集合需要实现IEnumerable接口) #region int类型 List<, , , , , }; List<, ...

  2. 源码阅读笔记 - 3 std::string 与 Short String Optimization

    众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的.然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大 ...

  3. C学习笔记

    1.struct struct 是一种复合数据类型,其构成元素可以是一些复合数据类型,如array,struct,union,缺省情况下,编译器为结构体的每个成员按其自然对齐(默认对齐,按照结构体成员 ...

  4. 大数据之pig 命令

    1.pig与hive的区别 pig和hive比较类似的,都是类sql的语言,底层都是依赖于hadoop    走的mapreduce任务.    pig和hive的区别就是,想要实现一个业务逻辑的话, ...

  5. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

  6. 查询集API -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  7. linux内存源码分析 - 内存回收(lru链表)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的收缩,所以 ...

  8. C++ 内链接 外链接

    编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来.如果一些变量或函数的定义是内连接的话,链接器链接的时候就不会拿它们去与 ...

  9. mysql数据库explain命令用法详解

    本文转自一位前辈的文章,感觉写得很好,就转过来了.这个是那位前辈的原文地址:http://www.111cn.net/database/mysql/81698.htm    当我们在优化SQL时,想看 ...

随机推荐

  1. Qt数据库sqlite总结

      QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryMo ...

  2. Note | Javascript权威指南[第六版] 第1章:Javascript概述

       JavaScript是一门高端的.动态的.弱类型的编程语言,非常适合面向对象和函数式的编程风格.JavaScript的语法源自Java,它的一等函数(first-class function)来 ...

  3. IOS—通过ChildViewController实现view的切换

    IOS-通过ChildViewController实现view的切换 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖在最后,我们在最外层Vi ...

  4. Javascript绝句欣赏

    1. 取整同时转成数值型: '10.567890'|0 结果: 10 '10.567890'^0 结果: 10 -2.23456789|0 结果: -2 ~~-2.23456789 结果: -2 2. ...

  5. webservice 发布到外网的时候

    在web.config的<system.web></system.web>中间加入如下配置节内容<webServices>          <protoco ...

  6. JavaScript Math对象

    Math对象是JavaScript的一个固有对象,其作用是执行常见的算数任务.该对象的使用并不是像Date,Array对象使用 new关键字来得到对象,而是直接 Math.[{property|met ...

  7. Axis,axis2,Xfire以及cxf对比 (转)

    Axis,axis2,Xfire以及cxf对比   http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http:// ...

  8. css 不确定元素宽度的水平居中

    对于一个不确定宽度的元素居中,我们想到使用的方法是 text-align:center; 或者 margin:0 auto; text-align只对行内元素有效,对于块元素我们要用margin,块元 ...

  9. jdk配置环境变量(windows)

    1.配置环境变量:右击"我的电脑"-->"高级"-->"环境变量"1)在系统变量里新建"JAVA_HOME" ...

  10. linux定时执行python脚本

    每天清晨 4:00:01,用python执行/opt/aa.py文件. 编辑定时任务: #crontab -e 加入: 0 4 * * * python /opt/aa.py 保存,退出即可. 如果执 ...