oracle 索引提升查询速度, in 和 exist 效率
做记录:
今天有一个有153万条数据的表,发现查询很慢:
select count(y) as transfereeNum,x
from t_ast_subject_invest_order
where x= '' and ORDER_STATUS!=1
GROUP BY x;
执行时间大概2-3s 。。
给字段x 加上索引后,时间为0.007s . 查询速度明显提升。
2. 关于in 和 exist 效率问题
#外表内表同量级 select o.*
from x o
WHERE o.ORDER_STATUS!=1 and o.trans_from_order IN (select t1.ORDER_NO from x t1 )
61.123s select o.*
from x o
WHERE o.ORDER_STATUS!=1 andEXISTS (select 1 from x t1 where t1.ORDER_NO=o.trans_from_order)
65.162s
本人实测 x表数据量是 153万条, 使用in 和 exists 查询 , 耗时差不多,甚至in 还快一点。所以网上说的 in 比 exists 快。。显然是没有测试考虑。就算加上索引,时间也是差不多的。
网上查到如下说法:
1. EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
2.IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
# 外表小(2000) 内表大(150万)
select o.*
from loan.x o
WHERE EXISTS (select 1 from loan.y t1 where t1.TRANS_FROM_ORDER=o.project_no); #1s
select o.*
from loan.x o
WHERE project_no in (select TRANS_FROM_ORDER from loan.y t1 ); # 1s
# 外表大(150万) 内表小(2000)
select t1.*
from loan.y t1
WHERE EXISTS (select 1 from loan.x o where t1.TRANS_FROM_ORDER=o.project_no);
执行计划
select t1.*
from loan.y t1
WHERE TRANS_FROM_ORDER in (select project_no from loan.x);

使用navicat oracle 测试 发现并没有较大区别,不管外大内小,还是外小外大。 郁闷。。但是可以肯定的是加上索引,in 和 exist 的影响可以忽略。
总结:
测试下来in 和 exists 好像差别不大。。和网上描述的并不一致,可能是我的工具问题,我使用的navicat premium ,可能有查询缓存。 而且我使用该工具的 Explain selected 或者 oracle的 explain plan for 命令 ,
发现in 和 exists 的执行计划是一样的(看上图)。 真不知道该信谁的了。
oracle 索引提升查询速度, in 和 exist 效率的更多相关文章
- mysql索引提高查询速度
使用索引提高查询速度 1.前言 在web开发中,业务模版,业务逻辑(包括缓存.连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈.本文主要针对My ...
- mysql千万级数据量根据索引优化查询速度
(一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...
- sqlite优化记录:建立索引加快查询速度
凡是数据库中,索引的存在就是为了提高查询速度的,数据库的索引有点类似于书本上面的目录的概念,因为在英文中都是index,事实上也就是目录. 其算法应该叫做“倒排索引”,这个其实也类似于搜索引擎里面的基 ...
- 利用SQL索引提高查询速度
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...
- 在SQLite中使用索引优化查询速度
在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用SQLite做了一下测试. 建立三个表: create table t1 (id integer primary key,num inte ...
- Oracle索引状态查询&索引重建
--检查损坏索引 SELECT status, COUNT(*) FROM dba_indexes GROUP BY status UNION SELECT status, COUNT(*) ...
- ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度
(一)索引失效的原因分析: <>或者单独的>,<,(有时会用到,有时不会) 有时间范围查询:oracle 时间条件值范围越大就不走索引 like "%_" ...
- MySQL 千万 级数据量根据(索引)优化 查询 速度
一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让 ...
- oracle索引2
问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...
随机推荐
- Entity Framework 支持 DataTable
转载:http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html https://www.cnblogs.com/hanjun0612 ...
- Django中manger/QuerySet类与mysql数据库的查询
Django中的单表操作 1.精确查询 #查询的结果返回是容器Query Set的函数(Query Set模型类)# 1. all() 查询的所有的符合条件的结果,支持正向索引,支持索引切片,不 ...
- spring注解-“@Scope”
@Scope可用来指定Spring创建bean的方式 默认为单实例,即@Scope("singleton").IOC容器启动的时候会调用方法创建对象并放到IOC容器中,以后每次获取 ...
- 一个linux 驱动升级的小问题记录
重复踩了两次坑,所以简单记录下. 内核 3.10. 在修改了驱动的gro实现之后,进行驱动版本的升级,make && make install 之后,发现tg3的驱动,没有生效. 相同 ...
- SHA-256算法和区块链原理初探
组内技术分享的内容,目前网上相关资料很多,但读起来都不太合自己的习惯,于是自己整理并编写一篇简洁并便于(自己)理解和分享的文章. 因为之前对密码学没有专门研究,自己的体会或理解会特别标注为" ...
- UE4AI行为树笔记
- python 命令行颜色
#coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -1 ...
- https://github.com/gaoyangxiaozhu/DockerVI
[更新]分享一个开源项目DockerVI,一个基于NodeJS实现的Docker Swarm可视化解决方案
- CSS 图像左右对齐
左右对齐图像使用的技术是浮动div元素. float:left 左对齐 float:right右对齐 示例 <!DOCTYPE html> <html> <hea ...
- scrapy 断点续爬
第一步:安装berkeleydb数据库 第二部:pip install bsddb3 第三部:pip install scrapy-deltafetch 第四部: settings.py设置 SPID ...
