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

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


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)

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


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


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


繁星淼淼
浏览 1507回答 3
3回答

子衿沉夜

我希望第一个查询更快,主要是因为您有一个等效项和一个显式的JOIN。以我的经验,IN运算符非常慢,因为SQL通常将其评估为一系列WHERE由“ OR”(WHERE x=Y OR x=Z OR...)分隔的子句。与ALL THINGS SQL一样,您的里程可能会有所不同。速度很大程度上取决于索引(您是否在两个ID列上都有索引?这将有很大帮助...)。唯一可以百分百确定哪个更快的真实方法是打开性能跟踪(IO Statistics特别有用)并同时运行它们。确保在两次运行之间清除缓存!

泛舟湖上清波郎朗

好吧,我相信这是一个“古老而又黄金”的问题。答案是:“取决于!”。表演是如此精致,以至于说:“从不使用子查询,总是加入”,这太愚蠢了。在以下链接中,您会发现一些我发现非常有帮助的基本最佳实践:优化子查询使用半联接转换优化子查询将子查询重写为联接我有一个包含50000个元素的表,我想要的结果是739个元素。我最初的查询是这样的:SELECT  p.id,    p.fixedId,    p.azienda_id,    p.categoria_id,    p.linea,    p.tipo,    p.nomeFROM prodotto pWHERE 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.nomeFROM prodotto pWHERE 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,好的。

暮色呼如

开始查看执行计划,以了解SQl Server将如何解释它们的差异。您还可以使用Profiler实际多次运行查询并获得差异。我不希望它们有如此可怕的区别,当您使用关联子查询时,使用连接而不是子查询可以真正获得较大的性能提升。EXISTS通常比这两个中的任何一个都要好,并且当您要在左连接中要所有记录都不在左连接表中时,使用NOT EXISTS通常是更好的选择。
打开App,查看更多内容
随时随地看视频慕课网APP