除了算子计算成本高吗

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 INNULL 值有问题,并且仅适用于一列。当您拥有适当的索引时,NOT EXISTS 将发挥最佳作用。在某些情况下,EXCEPTNOT 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的答案做了很多假设。

以上是关于除了算子计算成本高吗的主要内容,如果未能解决你的问题,请参考以下文章

样式化组件补液成本高吗?

fil矿机在哪里买?fil币怎么挖矿?fil币挖矿成本高吗?

为啥这个执行计划中的 Sort 算子成本这么高?

Matlab:数模02-多属性决策模型

Koa答疑,你见过同步的Node.js代码么?

SAP如何计算标准成本