`

SQL in 和 exists区别(转)(数据量大,效率区别特别明显)

 
阅读更多

 

来源: 薛波的日志

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 from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的
2:
select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。

带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如:
select staff_name from staff_member where staff_id in
 (select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);

为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如:
select staff_name from staff_member where staff_id
exists (select staff_id from staff_func);

not in 和not exists


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

尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询:
select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where 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'

的结果是相同的。

分享到:
评论
1 楼 相约的旋律 2015-11-20  
最后一个结论有疑问。
我们在生产服务器上面一开始是使用 in 查询,数据半天出不来。后来改成 or 查询 结果一下子就出来了(数据库是 MySQL)

相关推荐

    sql in,exists,not in,not exists区别

    IN 适合用于内外表数据量都很大的情况,而 EXISTS 适合用于外表数据量小的情况。 例如,在一个有百万级数据的表中,使用 IN 可能会导致性能问题,而使用 EXISTS 则可以提高查询效率。 结论 IN、EXISTS、NOT IN、...

    in和exists的区别与执行效率问题解析

    标题和描述均聚焦于SQL查询语句中"IN"与"EXISTS"的区别及执行效率问题,这是一个在数据库操作中非常关键的话题,尤其对于优化查询性能有着不可忽视的作用。下面,我们将深入探讨这两种语句的不同之处及其对执行效率...

    SQL里的EXISTS与IN

    因此,进行SQL优化是一项非常重要的工作,尤其是在高并发或大数据量的应用场景下尤为重要。 ### `IN` 与 `EXISTS` 的基本概念 #### `IN` `IN` 是一个用于比较的运算符,它用于检查某个值是否存在于指定的列表或者...

    in和exists的区别

    然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看"EXISTS"的用法。"EXISTS"子句通常与一个子查询一起使用,它并不关心子查询返回的具体值,而是...

    SQL中IN和EXISTS用法的区别

    如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 SQL中IN和EXISTS用法的区别 NOT IN sql in与exists区别

    “exists”和“in”的效率问题

    - 当内层查询的数据量较大时,使用“Exists”可以显著提高查询速度。 - 特别是在外层表T1远小于内层表T2的情况下,即T1 ,此时使用“Exists”可以避免不必要的数据扫描。 ### 成员资格检查:“In” ### “In”的...

    SQL中EXISTS与IN

    因此,在处理大数据量的情况下,`IN`可能会比`EXISTS`慢。 **示例应用** 1. **查找特定出版社出版的书籍**: ```sql SELECT title FROM titles WHERE pub_id IN ( SELECT pub_id FROM publishers WHERE ...

    exists SQL用法详解、exists和not exists的常用示例

    `EXISTS`和`IN`的区别在于,`IN`通常用于比较单个字段值,而`EXISTS`可以处理更复杂的查询,它关心的是子查询是否返回行,而不关心返回的具体值。`IN`通常用于获取特定值列表内的记录,而`EXISTS`则可以用于检查记录...

    sql大数据量查询的优化技巧

    SQL查询优化是数据库管理的关键环节,特别是在处理大数据量时,优化查询性能至关重要。以下是对标题和描述中提及的SQL优化技巧的详细说明: 1. **建立索引**:索引可以显著提高查询速度,尤其是在WHERE子句和ORDER ...

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

    然而,它们在处理大数据量时的效率和性能有着显著的区别。 首先,`IN` 操作符的工作原理是先从子查询中获取一组值,然后将这些值与主查询中的字段进行比较。例如,`SELECT * FROM A WHERE id IN (SELECT id FROM B)...

    SQL复习-EXISTS谓词

    本文将深入探讨EXISTS谓词的工作原理、用法以及其与IN和JOIN操作符的区别。 一、EXISTS谓词的基本概念 EXISTS谓词用于测试一个子查询是否至少返回一行数据,而不是关心返回的具体数据内容。其基本语法结构如下: ...

    详解SQL EXISTS 运算符

    理解`EXISTS`和`NOT EXISTS`的用法对于优化SQL查询非常重要,因为它们通常比使用`IN`或`JOIN`操作符更有效率,特别是在处理大量数据时。`EXISTS`主要关注记录是否存在,而不需要返回具体的值,这使得它在处理复杂...

    SQL中in参数化的用法

    在 SQL 中,对于 IN 操作符的使用是非常常见的,特别是在 WHERE 子句中规定多个值时。如:select * from A where ID in (1,2,3,4)。但是在实际开发中,我们不可避免地需要处理大量的数据,传统的方法是直接将参数...

    PostgreSQL IN vs EXISTS vs ANYALL vs JOIN性能分析

    PostgreSQL作为一种强大的开源关系数据库系统,它支持多种SQL操作,其中包括IN、EXISTS、ANY/ALL和JOIN等操作符。这些操作符在不同的业务场景下有着不同的表现和性能影响。在实际的数据库操作中,选择合适的操作符是...

    基于.net_的大数据量SQL_SERVER_系统_数据库和代码_优化方案

    ### 基于.NET的大数据量SQL SERVER系统数据库和代码优化方案 #### 一、引言 在.NET框架下开发的应用程序,特别是那些涉及到大量数据处理的系统,往往需要面对性能优化的问题。其中,数据库查询优化是提升整体系统...

    SQL SERVER中关于exists 和 in的简单分析

    但当 `IN` 的右侧是常量列表时,或者子查询返回的数据量相对较小,`IN` 可能会比 `EXISTS` 更快,因为它可以使用索引合并算法。 3. **性能对比** - 对于查找“存在”的情况(即 `EXISTS`),如果子查询返回大量...

    mysql多表查询和EXISTS查询性能对比

    然而,它的执行效率通常不如使用NOT EXISTS或NOT IN,特别是在右表记录较少的情况下。 #### 总结 从以上分析可以看出,每种查询方式都有其适用场景,并不存在绝对的“好”或“坏”。选择哪种方式取决于具体的应用...

    一次SQL Tuning引出来的not in , not exists 语句的N种写法2

    【描述】:文章并未直接提供描述,但从标题推测,该内容可能涉及数据库查询优化,特别是关于`not in`和`not exists`两种SQL查询子句的不同使用方式和性能比较。 【标签】:SQL优化,查询性能,数据库管理 【正文】...

    ORACLE和SQL Server的语法区别

    ### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...

Global site tag (gtag.js) - Google Analytics