我的
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
)
但我记得有人告诉我:
- 当
NULL
不是问题时(它们不在这里),IN
和EXISTS
之间几乎没有任何区别 - 当使用
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