我有一个包含 30 条记录的表,一个较小的表有 10 条记录,两个表具有相同的架构。我想要做的只是返回一个表,其记录在大表中,但不在小表中。我找到的解决方案是使用Except
运算符。但是,当我运行查询时,我花了大约 30 分钟。所以我只是想知道Except
计算是否昂贵并且花费了大量资源?
有什么功能可以代替Except
吗?感谢您的任何帮助!
EXCEPT
是一个集合运算符,应该合理优化。 它确实删除了重复值,因此开销比预期的要多一些。
它并非未经优化,以至于在如此小的表上需要 30 秒,除非您的列的大小以 MB 为单位。 可能正在发生其他事情 - 例如网络或服务器争用。
EXCEPT
是一种非常合理的方法。NOT IN
NULL
值有问题,仅适用于一列。 当您拥有适当的索引时,NOT EXISTS
将发挥最佳作用。 在某些情况下,EXCEPT
比NOT EXISTS
快。
在这种情况下,您应该使用EXISTS
.它是 SQL Server 中性能最高的操作之一
SELECT *
FROM big_table b
WHERE NOT EXISTS (
SELECT 1
FROM small_table s
WHERE s.id = b.id)
没有必要为了这么简单的事情而使事情变得复杂。
SELECT * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2)