这两个中哪一个更快?有差异还是可以互换?
使用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。
答案 0 :(得分:4)
由于默认情况下连接是内部的,因此这些查询之间没有逻辑差异。
任何有价值的查询优化器都会为这两个查询生成相同的执行计划。以下是我在两种情况下看到的执行计划:
(您看到的计划会有所不同,因为我创建的示例表没有编入索引,而您的表很可能有合适的索引)。
如果连接是外部的,那么两个查询之间会有区别:第二个查询将删除PersonInfo
表中没有相应行的所有Person
行,此外还会删除所有'Smith'
的信息。
答案 1 :(得分:1)
我认为更快的方式是......
DELETE FROM PersonInfo
WHERE EXISTS (SELECT 1
FROM Person
WHERE PersonInfo.PersonId = Person.Id
AND Person.Name = 'Smith')