为了账号安全,请及时绑定邮箱和手机立即绑定

SQL连接与SQL子查询(性能)?

/ 猿问

SQL连接与SQL子查询(性能)?

繁星淼淼 2019-10-25 10:26:54

我想知道我是否有类似这样的联接查询-


Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id

和一个类似这样的子查询 -


Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)

当我考虑性能时,两个查询中哪个查询会更快,为什么?


还有一段时间我应该优先选择另一个吗?


抱歉,这太琐碎了,之前问过,但是对此我感到困惑。另外,如果你们能建议我一些我可以用来衡量两个查询性能的工具,那将是很棒的。非常感谢!


查看完整描述

3 回答

?
慕容4345310

我希望第一个查询更快,主要是因为您有一个等效项和一个显式的JOIN。以我的经验,IN运算符非常慢,因为SQL通常将其评估为一系列WHERE由“ OR”(WHERE x=Y OR x=Z OR...)分隔的子句。

与ALL THINGS SQL一样,您的里程可能会有所不同。速度很大程度上取决于索引(您是否在两个ID列上都有索引?这将有很大帮助...)。

唯一可以百分百确定哪个更快的真实方法是打开性能跟踪(IO Statistics特别有用)并同时运行它们。确保在两次运行之间清除缓存!


查看完整回答
反对 回复 2019-10-25
?
泛舟湖上清波郎朗

好吧,我相信这是一个“古老而又黄金”的问题。答案是:“取决于!”。表演是如此精致,以至于说:“从不使用子查询,总是加入”,这太愚蠢了。在以下链接中,您会发现一些我发现非常有帮助的基本最佳实践:


优化子查询

使用半联接转换优化子查询

将子查询重写为联接

我有一个包含50000个元素的表,我想要的结果是739个元素。


我最初的查询是这样的:


SELECT  p.id,

    p.fixedId,

    p.azienda_id,

    p.categoria_id,

    p.linea,

    p.tipo,

    p.nome

FROM prodotto p

WHERE p.azienda_id = 2699 AND p.anno = (

    SELECT MAX(p2.anno) 

    FROM prodotto p2 

    WHERE p2.fixedId = p.fixedId 

)

执行时间为7.9秒。


我的查询最后是这样的:


SELECT  p.id,

    p.fixedId,

    p.azienda_id,

    p.categoria_id,

    p.linea,

    p.tipo,

    p.nome

FROM prodotto p

WHERE p.azienda_id = 2699 AND (p.fixedId, p.anno) IN

(

    SELECT p2.fixedId, MAX(p2.anno)

    FROM prodotto p2

    WHERE p.azienda_id = p2.azienda_id

    GROUP BY p2.fixedId

)

花了0.0256秒


好的SQL,好的。


查看完整回答
反对 回复 2019-10-25
?
暮色呼如

开始查看执行计划,以了解SQl Server将如何解释它们的差异。您还可以使用Profiler实际多次运行查询并获得差异。


我不希望它们有如此可怕的区别,当您使用关联子查询时,使用连接而不是子查询可以真正获得较大的性能提升。


EXISTS通常比这两个中的任何一个都要好,并且当您要在左连接中要所有记录都不在左连接表中时,使用NOT EXISTS通常是更好的选择。


查看完整回答
反对 回复 2019-10-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信