除了算子计算成本高吗
Posted
技术标签:
【中文标题】除了算子计算成本高吗【英文标题】:Is Except operator computational expensive 【发布时间】:2018-05-09 20:03:10 【问题描述】:我有一个包含 30 条记录的表,一个较小的表有 10 条记录,两个表具有相同的架构。我要做的就是返回一个表,其记录在大表中,但不在小表中。我找到的解决方案是使用Except
运算符。但是,当我运行查询时,我花了大约 30 分钟。所以我只是想知道Except
是否计算成本很高并且占用了大量资源?
有没有什么函数可以代替Except
?感谢您的帮助!
【问题讨论】:
30 分钟在 30 条记录表上?出现严重错误或表被锁定。 您至少应该包含查询和 include the actual Execution Plan,您可以使用Paste the Plan 并在您的问题中分享链接。另外try to read it yourself,也许您可以通过查询找出性能问题。最后包括 schema DDL 以及您正在执行的查询。 相关:***.com/questions/1662902/… 【参考方案1】:EXCEPT
是一个集合运算符,应该合理优化。它确实会删除重复值,因此开销比预期的要多。
在如此小的表上花费 30 秒并不是没有优化的,除非您的列的大小以兆字节为单位。可能发生了其他事情——例如网络或服务器争用。
EXCEPT
是一个非常合理的方法。 NOT IN
与 NULL
值有问题,并且仅适用于一列。当您拥有适当的索引时,NOT EXISTS
将发挥最佳作用。在某些情况下,EXCEPT
比 NOT EXISTS
更快。
【讨论】:
【参考方案2】:在这种情况下,您应该使用EXISTS
。它是 SQL Server 中性能最高的操作之一
SELECT *
FROM big_table b
WHERE NOT EXISTS (
SELECT 1
FROM small_table s
WHERE s.id = b.id)
【讨论】:
我试过了,但它与 Miscrosoft SQL 不兼容,对吧? @AkiraKaneshiro 在 SQL Server 中绝对可用。 docs.microsoft.com/en-us/sql/t-sql/language-elements/…【参考方案3】:没有必要为了这么简单的事情把事情复杂化。
SELECT * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2)
【讨论】:
1.你怎么知道它很简单? 2.NOT IN
/IN
可能会损害性能,并且基于问题性能已经是一个问题。更好的解决方案是使用NOT EXISTS
(或在 where 子句中创建一个外连接并对其进行过滤)。
如果有适当的主键字段,NOT IN
很容易成为最佳执行者。 NOT EXISTS
测试整个记录,而 NOT IN
测试单个字段。
那篇文章讨论了 NULL 的可能性,这与主键字段无关。您没有像那里讨论的那样的子表情况,其中比较是主键与外键。比较是主键与主键。
@SunKnight0 "NOT EXISTS tests the entire record" 我不认为这是真的,但我可能是错的。
这让我回到第 1 点,您(我们实际上)不知道模式中是否指定了主键或者两个表之间的关系是什么。这个问题写得很糟糕,这个使用not in
的答案做了很多假设。以上是关于除了算子计算成本高吗的主要内容,如果未能解决你的问题,请参考以下文章