什么是更快,加入和/或在哪里?

时间:2014-08-07 17:53:32

标签: sql

这两个中哪一个更快?有差异还是可以互换?

使用WHERE子句加入:

delete PersonInfo from PersonInfo pi 
  join Person p on pi.PersonId = p.Id where p.Name = 'Smith'

使用AND加入:

delete PersonInfo from PersonInfo pi 
  join Person p on pi.PersonId = p.Id and p.Name = 'Smith'

使用SQL Server 2012。

2 个答案:

答案 0 :(得分:4)

由于默认情况下连接是内部的,因此这些查询之间没有逻辑差异。

任何有价值的查询优化器都会为这两个查询生成相同的执行计划。以下是我在两种情况下看到的执行计划:

Execution Plan

(您看到的计划会有所不同,因为我创建的示例表没有编入索引,而您的表很可能有合适的索引)。

如果连接是外部的,那么两个查询之间会有区别:第二个查询将删除PersonInfo表中没有相应行的所有Person行,此外还会删除所有'Smith'的信息。

答案 1 :(得分:1)

我认为更快的方式是......

DELETE FROM PersonInfo
WHERE EXISTS (SELECT 1 
              FROM Person 
              WHERE PersonInfo.PersonId = Person.Id 
              AND Person.Name = 'Smith')