sql - 哪个更快 - NOT IN 或 NOT EXISTS?

标签 sql performance tsql

我有一个插入选择语句,它只需要插入行的特定标识符不存在于其他两个表中的任何一个的行。以下哪个会更快?

INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
   AND NOT EXISTS (SELECT 'Y' from Table3 t3 where t2.SomeFK = t3.RefToSameFK)
   AND NOT EXISTS (SELECT 'Y' from Table4 t4 where t2.SomeFK = t4.RefToSameFK AND ...)

... 或者...
INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
   AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table3)
   AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table4 WHERE ...)

......或者他们的表现大致相同?此外,有没有其他更好的方法来构造这个查询?我通常不喜欢子查询,因为它们向查询添加了另一个“维度”,通过多项式因子增加了运行时间。

最佳答案

如果NOT IN通常没有关系比 NOT EXISTS 慢/快,因为它们是 不是 等效于 NULL .读:

NOT IN vs NOT EXISTS

在这些情况下,您几乎总是想要 NOT EXISTS ,因为它具有通常预期的行为。

如果它们是等价的,则您的数据库很可能已经弄清楚了这一点,并且将为两者生成相同的执行计划。

在少数情况下,这两个选项是等效的,而您的数据库无法弄清楚,最好分析两个执行计划并为您的特定情况选择最佳选项。

关于sql - 哪个更快 - NOT IN 或 NOT EXISTS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500646/

相关文章:

sql - 舍入,上限 2 位小数

sql - 使用 OleDB 范围错误从 Excel 2013 文件中读取非常大的数据

java - 何时丢弃 hashmap 内容以避免性能下降?

sql - 无法使我的存储过程 IF 语句工作

sql - TSQL - 字符更改为 INT

mysql - 具有多个 JOIN 和比较的 SQL 查询

sql - 从 sql ce 数据库中删除所有表

字符串操作的Sql查询性能?

performance - 如何衡量Excel计算速度?

sql - 两列数据的所有可能组合