EXISTS 和 INNER JOIN的效率比较

echoxue 2008-11-15 05:14:34

1,一个exists和inner的语句,那个效率高呢,大家给指点一下,大家一般用的是那个啊?

--1, EXISTS sql sentence
SELECT Routing.Departure_GUID, Routing.FeederGateway_GUID
FROM Routing
WHERE EXISTS(select 1 from #DesMRoutingIDTable AddOnRouting where Routing.RoutingID = AddOnRouting.MID)
AND EXISTS(select 1 from #airpotIDTable where #airpotIDTable.aID=Routing.Departure_GUID OR #airpotIDTable.aID=Routing.FeederGateway_GUID)

--1, INNER join sql sentence
SELECT Routing.Departure_GUID, Routing.FeederGateway_GUID
FROM Routing
INNER JOIN
#DesMRoutingIDTable AddOnRouting ON Routing.RoutingID = AddOnRouting.MID
INNER JOIN #airpotIDTable ON #airpotIDTable.aID=Departure_GUID OR #airpotIDTable.aID=FeederGateway_GUID

2,还有如果我要去exists表中的数据,如何写,我想取#DesMRoutingIDTable 的ID1和#airpotIDTable的 ID2字段

SELECT Routing.Departure_GUID, Routing.FeederGateway_GUID,取(ID1,ID2)
FROM Routing
WHERE EXISTS(select 1 from #DesMRoutingIDTable AddOnRouting where Routing.RoutingID = AddOnRouting.MID)
AND EXISTS(select 1 from #airpotIDTable where #airpotIDTable.aID=Routing.Departure_GUID OR #airpotIDTable.aID=Routing.FeederGateway_GUID)
谢谢大家!

...全文
2341 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
echoxue 2008-11-18
  • 打赏
  • 举报
回复
to:ChinaJiaBing
set statistics io on
--语句
set statistics io off

这个是什么意思?





ChinaJiaBing 2008-11-17
  • 打赏
  • 举报
回复
set statistics io on
--语句
set statistics io off
claro 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hanjoe109 的回复:]
引用 11 楼 qizhengsheng 的回复:
又学到了


恩,我也學到了
[/Quote]
再学
hanjoe109 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qizhengsheng 的回复:]
又学到了
[/Quote]

恩,我也學到了
fcuandy 2008-11-17
  • 打赏
  • 举报
回复
要取几个表中的列,必须用连接。当然 from ta,tb 这也属于连接。
echoxue 2008-11-17
  • 打赏
  • 举报
回复
to:fcuandy

还有一个问题,如果是

2,还有如果我要去exists表中的数据,如何写,我想取#DesMRoutingIDTable 的ID1和#airpotIDTable的 ID2字段

SELECT Routing.Departure_GUID, Routing.FeederGateway_GUID,取(ID1,ID2)
FROM Routing
WHERE EXISTS(select 1 from #DesMRoutingIDTable AddOnRouting where Routing.RoutingID = AddOnRouting.MID)
AND EXISTS(select 1 from #airpotIDTable where #airpotIDTable.aID=Routing.Departure_GUID OR #airpotIDTable.aID=Routing.FeederGateway_GUID)

谢谢

echoxue 2008-11-17
  • 打赏
  • 举报
回复
to:fcuandy
谢谢,这个市真正的答案阿
百年树人 2008-11-16
  • 打赏
  • 举报
回复
GZ~
qizhengsheng 2008-11-16
  • 打赏
  • 举报
回复
又学到了
  • 打赏
  • 举报
回复
同意9楼的
fcuandy 2008-11-15
  • 打赏
  • 举报
回复
没有绝对的。

exists的效率依赖于匹配度。
inner join效率比较稳定。

select * from ta a where exists(select 1 from tb where a.id=b.id)
每扫ta一行,都扫tb,遇到匹配即返回ture,对tb的扫描在ta当前行不再继续下去,如果一直没找到,就会扫完tb (索引,或表扫)

即是说,匹配度很低,效率就很差。

举个极端, tb中每行的id都与ta中每行id相同
即 ta
id
1
1
1
1
1
,,,
tb
id
1
1
1
1
1
1
一扫就有返回,效率极高

反之
ta
id
1
1
1
1
1
1
1
...
tb
id
0
0
0
0
0
0
..
每扫ta一行,都要扫完tb,效率极差。


内连接效率则稳定。 在不很清楚实际数据分布情况下,最好用内连接。
wwooo 2008-11-15
  • 打赏
  • 举报
回复
效率高低,选中两条查询语句ctrl+L就能看出来了
jikuiyu 2008-11-15
  • 打赏
  • 举报
回复
join inner 效率比较高
echoxue 2008-11-15
  • 打赏
  • 举报
回复
我是这样想的,
1,sql在inner join的时候如果join 2张表(表1和表2)这样要做2次的扫描表,就是先扫描
表1(join)然后再扫描表2,这样就多了一层的循环

for(int)
{
跟表表1比对
}
for(int)
{
跟表表2比对
}

sql要做2次

2,如果exists是不是就是一层循环啊,因为都是在exists条件下,同时去表1和表2做比对数据,如果有就返回1啊。

for(int)
{
跟表表1比对;
跟表表2比对

就是在一个循环的条件下,这样效率不是高吗?
}


个人乱想的,不知道是否理解有误差,说的不对,大家指正


echoxue 2008-11-15
  • 打赏
  • 举报
回复
我是这样想的,
1,sql在inner join的时候如果join 2张表(表1和表2)这样要做2次的扫描表,就是先扫描
表1(join)然后再扫描表2,这样就多了一层的循环
2,如果exists是不是就是一层循环啊,因为都是在exists条件下,同时去表1和表2做比对数据,如果有就返回1啊。

个人乱想的,不知道是否理解有误差,说的不对,大家指正
echoxue 2008-11-15
  • 打赏
  • 举报
回复
to:ws_hgo
a 啊,刚刚一个人跟我说exists效率高些,我不知道了,大家继续讨论一下啊

lihuanmei 2008-11-15
  • 打赏
  • 举报
回复
支持inner join
ws_hgo 2008-11-15
  • 打赏
  • 举报
回复
表连接的效率要高些
所以是inner join

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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