做记录:

今天有一个有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 效率的更多相关文章

  1. mysql索引提高查询速度

    使用索引提高查询速度 1.前言 在web开发中,业务模版,业务逻辑(包括缓存.连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈.本文主要针对My ...

  2. mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  3. sqlite优化记录:建立索引加快查询速度

    凡是数据库中,索引的存在就是为了提高查询速度的,数据库的索引有点类似于书本上面的目录的概念,因为在英文中都是index,事实上也就是目录. 其算法应该叫做“倒排索引”,这个其实也类似于搜索引擎里面的基 ...

  4. 利用SQL索引提高查询速度

    1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...

  5. 在SQLite中使用索引优化查询速度

    在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用SQLite做了一下测试. 建立三个表: create table t1 (id integer primary key,num inte ...

  6. Oracle索引状态查询&索引重建

    --检查损坏索引 SELECT status, COUNT(*)   FROM dba_indexes  GROUP BY status UNION SELECT status, COUNT(*)   ...

  7. ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度

    (一)索引失效的原因分析: <>或者单独的>,<,(有时会用到,有时不会) 有时间范围查询:oracle 时间条件值范围越大就不走索引 like "%_" ...

  8. MySQL 千万 级数据量根据(索引)优化 查询 速度

    一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让 ...

  9. oracle索引2

    问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...

随机推荐

  1. apue第九章之孤儿进程组

    1. 为什么会有孤儿进程组的概念,APUE没直接写,但是GNU有规定: 孤儿进程组不可以获得终端,这是为了保证控制进程死掉后他的终端可以安全分配给新session.posix要求向新孤儿进程组中停止状 ...

  2. azkaban架构介绍

    转自:https://blog.csdn.net/huoji1990/article/details/81911904 官网:https://azkaban.readthedocs.io/en/lat ...

  3. python1.返回一个字符串中出现次数第二多的单词 2.字符串中可能有英文单词、标点、空格 3.字符串中的英文字符全部是小写

    import re from collections import Counter def second_count_word(s): # # 利用正则按标点和空格切割,有其他标点可以添加到[]内 # ...

  4. 爬虫之scrapy扩展

    针对pipelines的扩展 from scrapy.exceptions import DropItem class CustomPipeline(object): def __init__(sel ...

  5. (十)操作数据库、xlrd、xlwt补充

    一.补充操作数据库: 1.建立游标时,指定返回的类型是字典 cur = coon.cursor(cursor=pymysql.cursors.DictCursor) 2.cur.fetchall()  ...

  6. ArrayList 加强版的数组

    ArrayList 泛型类. 描述:可以自动扩容的数组. 特点:插入和删除慢,查找快. 现在来创建一个 要放String的ArrayList ArrayList list = new ArrayLis ...

  7. 吐血Eclipse Maven Selenium TestNG的各种坑

    刚入坑不久,有些是自己知识储备不够造成的,有些...那就是坑 在eclipse里面新建maven项目,然后添加testgn依赖,不多说,这个简单. 第一个坑: 然后在src/test/java这个文件 ...

  8. Commit can not be set while enrolled in a transaction

    [java] Exception: java.sql.SQLException [java] Message: Commit can not be set while enrolled in a tr ...

  9. mysql修改联合主键

    参考 https://blog.csdn.net/BockSong/article/details/80933477 alter table TABNAME drop primary key; alt ...

  10. RFID概述

    自动识别技术的本质在于利用被识别物理对象的一些具有辨识度的特征来对物理对象进行区分和识别.因此,这些具有辨识度的特征可以是物理对象自带的特征,如指纹,人脸,语言,视网膜,心跳等,也可以是通过第三方赋予 ...