oracle中or会使索引,为何查询条件中多了 OR 选项,索引就走全扫描?
ORACLE 11204, SOLARIS
如下:原始写法,where 条件中,有 OR 条件,这时,索引 IDX_BD_LOTMASTER_NO 走全索引扫描,导致效率非常低,
-bash-3.2$ sqlplus
SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 16 09:17:30 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL>set autot trace exp stat;
SQL>SELECT * FROM
2 (SELECT t0.FNUMBER FNUMBER, t0_L.FNAME FNAME, t0.FLOTID FLOTID
FROM T_BD_LOTMASTER T0
LEFT OUTER JOIN T_BD_LOTMASTER_L T0_L ON (t0.FLOTID = t0_L.FLOTID AND t0_L.FLocaleId = 2052)
WHERE (((t0.FUSEORGID IN (100132)) AND t0.FBIZTYPE = '1')
AND ((t0.FNUMBER LIKE N'8%') OR
(t0_L.FNAME LIKE N'8%') ) ) ORDER BY t0.FNUMBER ASC) WHERE ROWNUM <= 5 3 4 5 6 7 ;
Elapsed: 00:00:30.64
Execution Plan
----------------------------------------------------------
Plan hash value: 3360367673
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 2635 | 67582 (1)| 00:01:16 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | VIEW | | 5 | 2635 | 67582 (1)| 00:01:16 |
|* 3 | FILTER | | | | | |
| 4 | NESTED LOOPS OUTER | | 5 | 465 | 67582 (1)| 00:01:16 |
|* 5 | TABLE ACCESS BY INDEX ROWID| T_BD_LOTMASTER | 1860K| 85M| 35032 (1)| 00:00:40 |
| 6 | INDEX FULL SCAN | IDX_BD_LOTMASTER_NO | 35968 | | 309 (2)| 00:00:01 |
|* 7 | TABLE ACCESS BY INDEX ROWID| T_BD_LOTMASTER_L | 1 | 45 | 3 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | IDX_BD_LOTMASTER_L_ID | 1 | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=5)
3 - filter("T0"."FNUMBER" LIKE U'8%' OR "T0_L"."FNAME" LIKE U'8%')
5 - filter("T0"."FUSEORGID"=100132 AND "T0"."FBIZTYPE"='1')
7 - filter("T0_L"."FLOCALEID"(+)=2052)
8 - access("T0"."FLOTID"="T0_L"."FLOTID"(+))
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
9352435 consistent gets
113 physical reads
724 redo size
809 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
SQL>
--去掉 OR 条件后,IDX_BD_LOTMASTER_NO 走范围扫描,效率高多了,问:为何多了 OR 条件后,索引就走全扫描?SQL>SELECT * FROM
2 (SELECT t0.FNUMBER FNUMBER, t0_L.FNAME FNAME, t0.FLOTID FLOTID
FROM T_BD_LOTMASTER T0
LEFT OUTER JOIN T_BD_LOTMASTER_L T0_L ON (t0.FLOTID = t0_L.FLOTID AND t0_L.FLocaleId = 2052 )
WHERE (((t0.FUSEORGID IN (100132)) AND t0.FBIZTYPE = '1')
AND ( (t0.FNUMBER LIKE N'8%')) ) ORDER BY t0.FNUMBER ASC) 3 4 5 6 ;
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 1298050334
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 431 | 40083 | 2701 (1)| 00:00:04 |
| 1 | NESTED LOOPS OUTER | | 431 | 40083 | 2701 (1)| 00:00:04 |
|* 2 | TABLE ACCESS BY INDEX ROWID| T_BD_LOTMASTER | 431 | 20688 | 1401 (1)| 00:00:02 |
|* 3 | INDEX RANGE SCAN | IDX_BD_LOTMASTER_NO | 1435 | | 15 (0)| 00:00:01 |
|* 4 | TABLE ACCESS BY INDEX ROWID| T_BD_LOTMASTER_L | 1 | 45 | 3 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_BD_LOTMASTER_L_ID | 1 | | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("T0"."FUSEORGID"=100132 AND "T0"."FBIZTYPE"='1')
3 - access("T0"."FNUMBER" LIKE U'8%')
filter("T0"."FNUMBER" LIKE U'8%')
4 - filter("T0_L"."FLOCALEID"(+)=2052)
5 - access("T0"."FLOTID"="T0_L"."FLOTID"(+))
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
22 consistent gets
0 physical reads
0 redo size
809 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
oracle中or会使索引,为何查询条件中多了 OR 选项,索引就走全扫描?相关推荐
- Mybatis-Plus 使用自定义注入器后,查询条件中不再添加逻辑删除字段限定条件
例如项目中加入如下注入器代码后,查询条件中不再添加逻辑删除字段限定条件 /*** 自定义Sql注入** @author nieqiurong 2018/8/11 20:23.*/ @Component ...
- mysql查询集合中的特定数据_快速查询List中指定的数据
时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ...
- MySQL查询条件中的各种运算符/操作符说明
文章目录 一.比较运算符 (一)正则表达式 (二)模糊匹配 LIKE (三)转义字符 二.单行比较运算符 (一)安全等号 <=> 1. 和 = 的相同点 2. 和 = 的不同点 (二)区间 ...
- Mysql查询条件为大于时,不走索引失效问题排查
我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...
- Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法
默认看到查询条件有 3 条结果,我想只查询出日期最晚的那一条记录. -- 默认查询条件 select settledate as "日期", syscalculationmny a ...
- Oracle: SQL组合不同字段作为一个查询条件
前端程序传过来的值是有三个字段组合之后的结果,后端程序处理,并且将查询的数据反馈给前端. PS:不能直接使用字段RPT_NO的,因为在这条记录中RPT_NO恰好等于其他三个字段的组合值. 正确的做法是 ...
- 查询条件中含有加号_excel中最全的多条件查询方法都在这里了
今天在制作一个简单的公司人事查询,总结了一下多条件查询,原来excel中竟然有这么多的方法,那么可能会有不少人会认为:我只要会一种最简单的方法不就行了,干嘛要费脑子学那么多?其实学会更多不就是为了掌握 ...
- mysql 查询字段中是否存在空格的_mysql查询字段中带空格的值的sql语句
(1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 代码如下 update ` ...
- 查询条件中含有加号_中国邮储银行信用卡公众号账单查询
导读: 使用信用卡的过程中要多关注账单,那么邮政银行信用卡账单能不能通过微信查询呢?小编今天就为大家带来相关内容. 使用信用卡的过程中要多关注账单,那么邮政银行信用卡账单能不能通过微信查询呢?小编今天 ...
最新文章
- Matlab与线性代数 -- 矩阵的范数
- 存储引擎-存储结构之一:行
- 验证电话号码是否正确
- 出席国际海水稻论坛-林裕豪:从玉农业谋定陆丰稻作改良
- centos安装包选择--liveCD、liveDVD、bin-DVD、netinstall和minimal
- boost::mp11::mp_inherit相关用法的测试程序
- Android应用程序签名过程和解析过程分析
- 吴恩达DeepLearningCourse3-结构化机器学习项目
- 目前效果最好、应用较广且比较成熟的语音识别模型是什么?
- 关于影响NodeManager执行MR任务constainer数量的设置问题
- ESP32直接烧写bin文件
- GlobalMapper20脚本应用(数据批量自动化处理)
- mysql 报ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUT
- 详解 0xff 的作用
- 后羿 05 ‖ 九婴
- 修复我的世界ice服务器的指令,我的世界 基岩版:服务器清理命令
- php中关于冬夏时令切换引发的问题
- Differentially Private Learning with Adaptive Clipping
- 基于Matlab-采用张正友标定法对双目相机进行标定
- ftp工具下载,推荐5个流行的ftp工具下载软件