使用exists子句加入或关联子查询,哪个更好

hri*_*shi 6 sql

select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId )

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id  
Run Code Online (Sandbox Code Playgroud)

两个查询都给出相同的输出,这在性能明智的连接或与exists子句的相关子查询中是好的,哪一个更好.

编辑: - 有连接的alternet方式,以提高性能: - 在上面的2个查询中,我想要来自dept以及contactinformation表的信息

mar*_*c_s 5

您需要衡量和比较 - 没有哪一个更好的黄金法则 - 它取决于系统中太多的变量和事物。

在 SQL Server Management Studio 中,您可以将两个查询放在一个窗口中,Include actual execution plan从“查询”菜单中进行选择,然后一起运行它们。

所有文字

您应该比较它们的执行计划以及在一个或另一个查询上花费的时间的百分比。在这种情况下,两者最有可能接近 50%。如果没有 - 那么您就知道这两个查询中哪一个执行得更好。

您可以从Simple-Talk了解有关 SQL Server 执行计划的更多信息(甚至可以下载免费电子书)——强烈推荐。


gbn*_*gbn 5

通常,EXISTS子句因为您可能需要DISTINCT来为JOIN提供预期输出.例如,如果一行有多DepartmentContactInformation.

在上面的示例中,SELECT *:

  • 也意味着不同的输出,所以它们实际上并不等同
  • 索引被使用的可能性较小,因为您将所有列拉出来

这么说,即使列表列表有限,他们也会给出相同的计划:直到你需要DISTINCT ...这就是为什么我说"EXISTS"