如何更快地执行SQ​​L"NOT IN"查询?

How*_*amp 14 sql database sql-server

我有一个电子邮件地址表(EMAIL):

EmailAddress
------------
jack@aol.com
jill@aol.com
tom@aol.com
bill@aol.lcom
Run Code Online (Sandbox Code Playgroud)

和黑名单电子邮件地址的表格(黑名单):

EmailAddress
------------
jack@aol.com
jill@aol.com
Run Code Online (Sandbox Code Playgroud)

我想选择EMAIL表中但不在BLACKLIST表中的那些电子邮件地址.我正在做:

SELECT EmailAddress
FROM EMAIL
WHERE EmailAddress NOT IN
   (
      SELECT EmailAddress
      FROM BLACKLIST
   )
Run Code Online (Sandbox Code Playgroud)

但是当行数非常高时,性能非常糟糕.

我怎么能更好地做到这一点? (如果可能,请假设通用SQL.如果不是,请假设使用T-SQL.)

Pab*_*ruz 30

您可以使用左外连接或not exists子句.

左外连接:

select E.EmailAddress
  from EMAIL E left outer join BLACKLIST B on (E.EmailAddress = B.EmailAddress)
 where B.EmailAddress is null;
Run Code Online (Sandbox Code Playgroud)

不存在:

select E.EmailAddress
  from EMAIL E where not exists
         (select EmailAddress from BLACKLIST B where B.EmailAddress = E.EmailAddress)
Run Code Online (Sandbox Code Playgroud)

两者都是非常通用的SQL解决方案(不依赖于特定的数据库引擎).我会说后者的性能更高一些(尽管不是很多).但绝对比那个更有效not in.

正如评论者所述,您还可以尝试创建索引BLACKLIST(EmailAddress),这有助于加快查询的执行速度.