当使用NOT IN子句时,SELECT DISTINCT与SELECT不同吗



我的

DELETE FROM FOO
WHERE [FOO_KEY] NOT IN
(
SELECT [FOO_KEY] FROM BAR
)

查询运行速度慢得惊人。我知道BAR是一张很大的桌子,所以我很想写

DELETE FROM FOO
WHERE [FOO_KEY] NOT IN
(
SELECT DISTINCT [FOO_KEY] FROM BAR
)

但我记得有人告诉我:

  1. NULL不是问题时(它们不在这里),INEXISTS之间几乎没有任何区别
  2. 当使用EXISTS时,您不需要使用SELECT DISTINCT,而且这样做没有任何性能原因

这让我有充分的理由相信绝对保证在这里添加DISTINCT不会有什么不同。这是正确的吗?

从功能的角度来看,带有或不带有DISTINCT的查询是相同的(它们会删除相同的行集)。

从性能的角度来看,我确信SQL Server将始终为两个查询生成相同的执行计划(但我无法证明这一点)。

对于其他数据库引擎,这可能有所不同。参见:

  • https://mariadb.com/kb/en/optimizing-group-by/
  • https://www.quora.com/Should-I-use-DISTINCT-in-a-subquery-when-using-IN
  • https://docs.oracle.com/javadb/10.8.3.0/tuning/ctuntransform867165.html

相关内容

  • 没有找到相关文章

最新更新