请教3条sql的效率问题

wyzchn 2006-01-17 05:50:30

1:select a.cc from a,b where a.dd='1' and a.aa=b.aa and a.bb = b.bb
2:select a.cc from a where a.dd='1' and a.aa in (select b.aa from b where a.bb=b.bb)
3:select a.cc from a where a.dd='1' and exists (select * from b where a.aa=b.aa and a.bb=b.bb)
请问在不同的情况下(比如,小数据量,大数据量等情况),他们的效率有什么不同,谁能比较详细的说明一下嘛?谢谢!!!!
...全文
233 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rouqu 2006-01-18
  • 打赏
  • 举报
回复
2:select a.cc from a where a.dd='1' and a.aa in (select b.aa from b where a.bb=b.bb)
3:select a.cc from a where a.dd='1' and exists (select * from b where a.aa=b.aa and a.bb=b.bb)
---------------------
虽然揭帖了 再废话两句~
这两句的效率是相同的 从查询计划可以很清楚地看到这一点
wyzchn 2006-01-18
  • 打赏
  • 举报
回复
第一个忘给分了,很不好意思啊!下次补上!!
wyzchn 2006-01-18
  • 打赏
  • 举报
回复
谢谢各位!学到不少东西,揭帖!
wfliu 2006-01-18
  • 打赏
  • 举报
回复
好贴,学习
tian790317 2006-01-18
  • 打赏
  • 举报
回复
我最喜欢这种贴子了
ReViSion 2006-01-17
  • 打赏
  • 举报
回复
听课
zlp321002 2006-01-17
  • 打赏
  • 举报
回复
--系统也会根据索引情况,自动选择最优方案!数据量的的情况下,有时候,子查询效率比连接效率高!
zjcxc 2006-01-17
  • 打赏
  • 举报
回复
就这三个语句本身而言, 没有效率的比较性.
2,3的查询结果是一致的, 而对于1来说, 可能形成1对多或者多对多的查询, 在这种情况下, 结果与2,3是不一致的, 这样更没有可比性.

就2,3而言, 一般来说, 扫描的数据只从a表取, 查询优化器会把两个语句优化成一样的处理方式.
lsqkeke 2006-01-17
  • 打赏
  • 举报
回复
学习 学习 :)
子陌红尘 2006-01-17
  • 打赏
  • 举报
回复
BTW:正常情况下,连接的效率高过相关子查询,而exists()的效率高过in()。
子陌红尘 2006-01-17
  • 打赏
  • 举报
回复
第一个查询和后两个查询是不等价的,不具备完全的可比性,楼主不信的话试试这个:
---------------------------------------------------------------------------------------------------------------------
create table a(aa int,bb int,cc int,dd char(1))
create table b(aa int,bb int,cc int,dd char(1))
insert into a select 1,1,1,'1'
insert into a select 1,1,2,'1'
insert into a select 1,1,3,'1'
insert into a select 1,1,4,'1'
insert into b select 1,1,1,'1'
insert into b select 1,1,2,'1'
insert into b select 1,1,3,'1'
insert into b select 1,1,4,'1'

select a.cc from a,b where a.dd='1' and a.aa=b.aa and a.bb = b.bb
select a.cc from a where a.dd='1' and a.aa in (select b.aa from b where a.bb=b.bb)
select a.cc from a where a.dd='1' and exists (select * from b where a.aa=b.aa and a.bb=b.bb)

drop table a,b
samfeng_2003 2006-01-17
  • 打赏
  • 举报
回复
1:select a.cc from a,b where a.dd='1' and a.aa=b.aa and a.bb = b.bb

这个不用全表扫描,我想应该算高的把,如果改成inner join 那么效率会更高

2:select a.cc from a where a.dd='1' and a.aa in (select b.aa from b where a.bb=b.bb)
3:select a.cc from a where a.dd='1' and exists (select * from b where a.aa=b.aa and a.bb=b.bb)
这两句都涉及了子查询,在子查询中in 和exists的效率是差不多的,但是都要引起扫描b的全表进行连接,因此效率可能要低于第一句吧

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧