我正在优化其中一个SQL Job。
在这里,我有几个地方使用了<>运营商。可以使用NOT EXISTS运算符替换相同的查询。我只是想知道哪种方式更好。
示例查询
If(@Email <> (select Email from Members WHERE MemberId = @MemberId))
--Do Something.
--Same thing can be written as
If(NOT EXISTS (SELECT Email FROM Members WHERE MemberId = @MemberId AND Email = @EmailId))
哪个更好?
我完成了两者的执行计划(因为所有图片托管都在办公室被封锁所以不能附加)。 我可以看到&lt;&gt;运算符具有Assert和Stream Aggregate操作,而不是NOT EXISTS。不确定它们是好是坏还是没有影响。
答案 0 :(得分:3)
NOT EXISTS通常更好(尽管在您的情况下,如果表格很小和/或索引正确,可能不是这种情况)。
几乎总是你应该使用EXISTS / NOT EXISTS查询你试图找出某条记录是否存在(或不存在)的查询!
背后的原因是EXISTS(和NOT EXISTS)查询将在条件满足后立即停止(或者在NOT EXISTS被证明为false的情况下),而不是使用将继续扫描记录的子查询全桌。
答案 1 :(得分:1)
你的两个陈述之间的区别在于“在纯SQL中做了多少,以及运行程序/脚本的引擎做了多少等等。(我想说的是数据库做了什么)什么是数据库之外,但在存储过程中,这两个部分都由数据库处理。)
在您的示例中,第一个语句使用SQL来获取一个成员的电子邮件。 Table访问使用我假设的主键及其关联的唯一索引,因此即使对于大表也应该非常快。将电子邮件传递到SQL外部,然后在脚本中完成比较。
在第二个陈述中,几乎相同。 MemberID再次用于访问唯一记录,然后比较电子邮件并将布尔结果传递回SQL之外。
因此,您的示例的性能应该非常相似。
当需要将多个值传输到SQL之外并且必须进行更复杂的比较时(例如,使用SQL选择大量电子邮件然后执行),会有不同的注意事项(例如MikyD已注意到)脚本中的比较与Email IN (Select ..)
)之类的。然后,通常最好在SQL中尽可能多地完成工作,在SQL和非SQL之间传输最少量的数据,让数据库找出获取数据的最有效方法。