exists和INNER JOIN 区别

今天帮开发人员优化SQL,发现一个以前不怎么在意的问题

             SELECT
               bond.store_no
             FROM  
               bill_order_num_dtl bond 
             WHERE EXISTS
               ( select 1
                 from meetorder_staff_dtl b , 
                   meetorder_staff a 
                 where b.operate_area = bond.store_no
                   and a.seq_no = b.seq_no 
                   and  a.user_code = ‘lym‘  
                ) ;

查询需要2S,bill_order_num_dtl 数据量大概2W多条,meetorder_staff_dtl 50条左右,将EXISTS换为INNER JOIN后只需0.02S,差了100倍,EXISTS在命中率高的情况下查询速度较快,像这种需要判断的表的数据量较大,而条件表的数据量较少时不宜使用。INNER JOIN相对较稳定一些,不会随命中率的变化而影响性能。改成下面后,只需0.02S

             SELECT  bond.store_no
             FROM   bill_order_num_dtl bond 
               INNER JOIN meetorder_staff_dtl b on b.operate_area = bond.store_no
               INNER JOIN  meetorder_staff a on a.seq_no = b.seq_no
             WHERE   
               a.user_code = ‘lym‘
时间: 2024-12-23 23:17:11

exists和INNER JOIN 区别的相关文章

SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. NOT IN.NOT EXISTS.LEFT JOIN...IS NULL性能分析 我们首先创建测试表 USE TSQL2012 GO CREATE SCHEMA [compare] CREATE TABLE [compare].t_left ( id INT NOT NULL PRIMARY KE

Hive中join, outer join, semi join区别

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 最常用的就是多表关联查询,主要讲解下join.outer join和semi join的具体使用. join是最简单的关联操作,两边关联只取交集. outer join分为left outer join.right outer join和full outer join. left outer join是以左表驱动,右表不存在的

List<T>中Exists 和Contains的区别

.net编码中,使用泛型List<>时,经常遇到这样的需求:新来一个Model对象,如果已有的List中没有这条数据,则把新对象Add到List中,否则不处理 判断已有的List中是否包含这个新的model,方法有几种,最直白的foreach遍历原有List并逐个判断 另外就是使用List自带的方法Exists 和Contains了 这两个方法有什么区别呢?通过MSDN描述和实际测试,很容易发现: Contains方法,判断结果表示对象T的内存地址,是否在List中: Exists方法,通过委

left join ,right join ,inner join ,cross join 区别

left join ,right join ,inner join ,cross join 区别(参考:http://zhidao.baidu.com/link?url=gpOl9HXZR0OrQuys04oH3f8guGQFZBUNs7kd4JWbUcDVbflB4qe1LJnLbfWXa7-CjfDWhzgK5T26-FZpZwVqLq) 举个简单的例子吧,从结果来理解比较具体些.a表name sex张三 男李四 女 b表name age李四 30王五 23 1\全外连接select a.n

sql Exists与in 的区别

由于要使用 in,后来在网上找找了,发现有如下文章,大家共享一下.一起进步啦. 使用in的话,如果存在索引,和使用 join 性能差别不大. 转载自http://blog.chinaunix.net/u/4929/showart_1075412.html IN 确定给定的值是否与子查询或列表中的值相匹配. EXISTS 指定一个子查询,检测行的存在. 比较使用 EXISTS 和 IN 的查询 这个例子比较了两个语义类似的查询.第一个查询使用 EXISTS 而第二个查询使用 IN.注意两个查询返回

数据库sql语句的exists和in的区别

性能变化的关键: #1 执行的先后顺序 谁是驱动表,谁先执行查询,谁后执行查询 #2 执行过程 exists的优点是:只要存在就返回了,这样的话很有可能不需要扫描整个表. in需要扫描完整个表,并返回结果. 所以,在字表比较小的情况下,扫描全表和部分表基本没有差别:但在大表情况下,exists就会有优势. 看这两个语句: --子查询会执行完全关联,并返回所有符合条件的city_id select * from areas where id in   (select city_id from de

数据库中的左连接(left join)和右连接(right join)区别

Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID 左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据. 简言之 Left Join影响到的是右边的表 Right Join select * from tbl1 Rig

SQL: LEFT JOIN , RIGHT JOIN , INNER JOIN 区别 , on 和 where条件的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 例如如下两张表: A(aid int , aname char(10) ) B(aid int , aname char(10) ) 对应数据: 执行语句: select * from a LEFT JOIN  b on aid=bid  我的理解是, A左连接B , 先取A中的一条记录 , 根据on中的条件去匹配B表 ,  如果能匹配就连接为一条新的记录 , 如截图中的第3行 ; 如果不能匹配

SQL语句中exists和in的区别

转自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/article/details/4476333 表展示 查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 一.确定给定的值是否与子查询或列表中的值相匹配.in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.所以相对内表