LEFT OUTER JOIN与NOT EXISTS的SQL性能

kef*_*hou 45 sql sql-server

如果我想在表A中找到一组条目而不是在表B中,我可以使用LEFT OUTER JOIN或NOT EXISTS.我听说过SQL Server适用于ANSI,在某些情况下,LEFT OUTER JOIN比NOT EXISTS效率更高.在这种情况下,ANSI JOIN会表现得更好吗?并且在SQL Server上加入运算符比一般的NOT EXISTS更有效吗?

JNK*_*JNK 60

Joe的链接是一个很好的起点. Quassnoi也涵盖了这一点.

通常,如果您的字段已正确编入索引,或者如果您希望过滤掉更多记录(即EXIST子查询中有大量行),NOT EXISTS则表现更好.

EXISTS并且NOT EXISTS两者都短路 - 一旦记录符合标准,它就会被包含或过滤掉,优化器会移动到下一条记录.

LEFT JOIN将加入所有记录,无论它们是否匹配,然后过滤掉所有不匹配的记录.如果您的表很大和/或您有多个JOIN条件,则这可能非常耗费资源.

我通常会尝试使用NOT EXISTSEXISTS尽可能使用.对于SQL Server,INNOT IN在语义上是等效的,可能更容易编写. 这些是SQL Server中唯一可以保证短路的运算符.

  • EXCEPT和INTERSECT也与(NOT)EXISTS相同.并且当然没有失败的NULL ... (2认同)
  • **这个答案不再正确**。在 SQL Server 2017(以及更高版本(甚至更早))中,两者都可能短路。在大多数情况下,查询优化器会正确地将“左连接,其中为空”转换为“反半连接”,就像它对“不存在”所做的那样。有时每个运营商都会制定不同的计划。有时一个比另一个更快。**这取决于。** (2认同)

Joe*_*lli 6

我在这里为SQL Server阅读的这个主题的最佳讨论就在这里.