`
heavenslv
  • 浏览: 81329 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL优化 ----- IN 和 EXISTS

阅读更多

有时候会将一列和一系列值相比较。最简单的办法就是在where 子句中使用子查询。在

where 子句中可以使用两种格式的子查询。

第一种格式是使用IN 操作符:

... where column in(select * from ... where ...);

第二种格式是使用EXIST 操作符:

... where exists (select 'X' from ...where ...);

绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第

一种格式的效率高。在Oracle 中可以几乎将所有的IN 操作符子查询改写为使用EXISTS 的子查询。

第二种格式中,子查询以‘select 'X'开始。运用EXISTS 子句不管子查询从表中抽取什么数

据它只查看where 子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where 语句中使用的列存在索引)。相对于IN 子句来说,EXISTS 使用相连子查询,构造起来要比IN 子查询困难一些。

通过使用EXIST,Oracle 系统会首先检查主查询,然后运行子查询直到它找到第一个匹配

项,这就节省了时间。Oracle 系统在执行IN 子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS 比使用IN 通常查询速度快的原因。同时应尽可能使用NOT EXISTS 来代替NOT IN,尽管二者都使用了NOT(不能使用索引

而降低速度),NOT EXISTS 要比 NOT IN 查询效率更高。

分享到:
评论

相关推荐

    收获,不止SQL优化--抓住SQL的本质

    第1章 全局在胸——用工具对...17.1.3 IN与EXISTS之争 455 17.1.4 总结探讨 457 17.2 误区背后的话题扩展 457 17.2.1 话题扩展之等价与否优先 457 17.2.2 话题扩展之颠覆误区观点 458 17.3 全书完,致读者 461

    sql优化sql优化sql优化sql优化sql优化

    sql优化sql优化sql优化sql优化

    SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt

    SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句.txt欢迎下载!

    SQL里的EXISTS与IN

    系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    收获不止SQL优化

    第1章 全局在胸——用工具对...17.1.3 IN与EXISTS之争 455 17.1.4 总结探讨 457 17.2 误区背后的话题扩展 457 17.2.1 话题扩展之等价与否优先 457 17.2.2 话题扩展之颠覆误区观点 458 17.3 全书完,致读者 461

    SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句2.txt

    SQL语句优化——in,not in,exists,not exists, left join...on博客所需SQL语句2.txt,欢迎下载!

    LECCO SQL Expert (智能自动SQL优化)

    图1 人工智能自动SQL优化示意图 其核心模块之一“SQL语法优化器”的工作原理大致如下(如图1): 一条源SQL语句输入→“人工智能反馈式搜索引擎”对输入的SQL语句结合检测到的数据库结构和索引进行重写,产生N条等效...

    lecco sql export pro(SQL优化器)

    当然,你也可以从 源语句和重写后的SQL语句中任选两条进行比较 <br> 从比较的结果可以看到,重写得到的SQL124把第一个Exists改写成了In;在字段DPT_ID上进行了合并空字符串的操作以诱导数据库先执行子查询中的...

    oracle的sql优化

    oracle的sql优化方法 1.全表扫描和索引扫描  大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于>100万数据表影响很大。  Oracle中通过RowID访问数据是最快的方式  对字段进行函数转换,或者前...

    SQL查询中in和exists的区别分析

    对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in。 1、select * from A where id in (select id from B); in()只执行一次,它查出B表中的所有id字段并...

    MySQL中exists关键字和in的区别有那些? SQL语句优化有那些方法? 查询速度很慢应该怎么办?

    一、exists和in有何区别如下?  exists使用循环的方式,由outer表的记录数决定循环的次数,对于exists的影响最大,所以,外表的记录越小,子查询结果集较大时适用于exists; in 先执行子查询,子查询的结果返回去重...

    SQL性能优化

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  NOT IN  此操作是强列推荐不使用的,因为不能应用表的索引。  推荐方案:用NOT EXISTS 或...

    微软内部资料-SQL性能优化2

    In this module we will discuss Microsoft® SQL Server™ interaction with the operating system and methodology of troubleshooting server-based problems. At the end of this module, you will be able to:...

    数据库_性能优化篇-2(1).docx

    1.对sql语句优化:就是能分开写的语句就分开写,不要一次性就解决,这样对效率来说是很大的开销的。 2.避免使用不兼容的数据类型:如float和int,char和varchar等都是不兼容的。 3.尽量避免在where子句中对字段进行...

    微软内部资料-SQL性能优化5

    In a nonclustered index, the leaf level contains each index key, plus a bookmark that tells SQL Server where to find the data row corresponding to the key in the index. A bookmark can take one of two ...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的...

    ORACLE SQL性能优化系列(全)

    非常全面的ORACLE SQL性能优化介绍及实例:优化器的选择、共享SQL语句、访问Table的方式、减少访问数据库的次数、使用DECODE函数、减少对表的查询、通过内部函数提高SQL效率、用NOT EXISTS替代NOT IN、使用EXPLAIN ...

    MYSQL IN 与 EXISTS 的优化示例介绍

    优化原则:小表驱动大表,即小的数据集驱动大的数据集。 ############# 原理 (RBO) ##################### select * from A where id in (select id from B) 等价于: for select id from B for select * from A ...

Global site tag (gtag.js) - Google Analytics