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