in 和 exists性能研究

标签: in exists 性能 | 发表时间:2011-07-15 01:58 | 作者:nsj820 zhengyun
出处:http://blog.csdn.net

in 和exists

从sql编程角度来说,in直观,exists不直观多一个select;in可以用于各种子查询,而exists好像只适宜于关联子查询。

in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。

一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc fromB)

效率低,用到了A表上cc列的索引;

select * from A where exists(select cc fromB where cc=A.cc)

效率高,用到了B表上cc列的索引。

相反的

2:

select * from B where cc in (select cc fromA)

效率高,用到了B表上cc列的索引;

select * from B where exists(select cc fromA where cc=B.cc)

效率低,用到了A表上cc列的索引。

带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样如:

select staff_name from staff_member wherestaff_id in

 (select staff_id from staff_func wherestaff_member.staff_id=staff_func.staff_id);

为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如:

select staff_name from staff_member wherestaff_id

exists (select staff_id from staff_func);

not in 和notexists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in要快。

尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询:

select staff_name from staff_member wherestaff_id in (select staff_id from staff_member minus select staff_id from staff_funcwhere func_id like '81%');

in 与 "=" 的区别

select name from student where name in('zhang','wang','li','zhao');

select name from student where name='zhang'or name='li' or name='wang' or name='zhao'

的结果是相同的。

总结

因此,在oracle中有一条比较通用的规则

1> in适合于外表大而内表小的情况;exists适合于外表小而内表大的情况

2> 如果两个表相当则in/exists差别不大

3> 用not exists比not in执行的效率要高的多

4> 使用in时不对null进行处理

另外,我们可以这样理解oracle中exists可能会比in的效率会好的原因:

1> exists检查是否有结果,判断是否有记录,返回的是一个布尔型(TRUE/FALSE),in是对结果值进行比较,判断一个字段是否存在于几个值的范围中。

2> exists主要用于片面的,有满足一个条件的即可,in主要用于具体的集合操作,有多少满足条件。

3> exists是判断是否存在这样的记录,in是判断某个字段是否在指定的某个范围内。

 

作者:nsj820 发表于2011-7-14 18:58:53 原文链接
阅读:35 评论:0 查看评论

相关 [in exists 性能] 推荐:

in 和 exists性能研究

- zhengyun - CSDN博客推荐文章
从sql编程角度来说,in直观,exists不直观多一个select;in可以用于各种子查询,而exists好像只适宜于关联子查询. in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询. 一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用in和exists差别不大.

in 和 exists性能研究

- - SQL - 编程语言 - ITeye博客
从sql编程角度来说,in直观,exists不直观多一个select;in可以用于各种子查询,而exists好像只适宜于关联子查询. in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询. 一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用in和exists差别不大.

[转]sql优化--in和exists效率

- - 小鸥的博客
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists. 修改为exists的SQL语句. 分析一下exists真的就比in的效率高吗.     我们先讨论IN和EXISTS.     事实上可以理解为:.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).

性能监控

- - 互联网 - ITeye博客
一旦你的服务器是在控制台模式下运行,你就可以开始我们接下来的内容. iostat  iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况. 要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下. meminfo 和 free  Meminfo 可让你获取内存的详细信息,你可以使用 cat 和 grep 命令来显示 meminfo 信息: 1 cat /proc/meminfo  另外你可以使用 free 命令来显示动态的内存使用信息,free 只是给你大概的内存信息,而 meminfo 提供的信息更加详细.

高性能mysql 之 性能剖析

- - 数据库 - ITeye博客
1 定义性能优化 mysql服务器性能,此处定义为 响应时间. 在解释性能优化之前,先来消除一个误解,很多人认为,性能优化就是降低cpu的利用率或者减少对资源的使用. 资源时用来消耗并用来工作的,所以有时候消耗更多的资源能够加快查询速度,保持cpu忙绿,这是必要的. 很多时候发现 编译进了新版本的InnoDB之后,cpu利用率上升的很厉害,这并不代表性能出现了问题.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

HBase性能调优

- - 学着站在巨人的肩膀上
我们经常看到一些文章吹嘘某产品如何如何快,如何如何强,而自己测试时却不如描述的一些数据. 其实原因可能在于你还不是真正理解其内部结构,对于其性能调优方法不够了解. 本文转自TaoBao的Ken Wu同学的博客,是目前看到比较完整的HBase调优文章. 原文链接:HBase性能调优. 因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.

mongodb性能测试

- - 数据库 - ITeye博客
1) Mongodb的非安全插入方式,在一开始插入性能是非常高的,但是在达到了两千万条数据之后性能骤减,这个时候恰巧是服务器24G内存基本占满的时候(随着测试的进行mongodb不断占据内存,一直到操作系统的内存全部占满),也就是说Mongodb的内存映射方式,使得数据全部在内存中的时候速度飞快,当部分数据需要换出到磁盘上之后,性能下降很厉害.

JDBC性能小贴

- - 开源软件 - ITeye博客
本文收集了一些用于提升JDBC性能的方法. Java应用或者JavaEE Web应用的性能是很重要的,尤其是数据库后端对应用的性能影响. 不知你是否经历过Java、JavaEE web应用非常慢的案例没有(处理一个简单的请求都要花上好几秒的时间用于数据库访问,分页、排序等). 下面这些贴士也许能提升Java应用的性能.