Oracle SQL 数据库是否删除 where-in 子句中的重复条目?
Do Oracle SQL DBs Remove duplicate entries in a where-in clause?
如果这是一个重复的问题,我深表歉意:我搜索过但发现很多不相关的 topics/questions。
例如
select *
from table_of_things
where id in (1, 2, 3, 4, 5, 6, 1, 2, 1)
Oracle 预处理会在执行查询之前删除重复项吗?我怎样才能知道?我想在大型列表中性能损失可能会很大,如果没有,最好在查询之前自己删除重复项。
有点。或者,更相关的是,这是一个完全不重要的问题如何实现逻辑。
IN
遵循简单的逻辑。当左操作数在 IN
之后的列表中时,它的计算结果为真。当操作数多次出现在列表中时,它的计算结果同样为真。
实际上,我猜测 Oracle 确实会在编译阶段删除重复项。但是,无论是否存在重复项,IN
的定义都是相同的。
和您一样,我找不到任何特定的文档条目来指定是否出于性能原因简化了表达式列表。它必须被视为一个实现细节。但是根据观察,它确实看起来像是优化器执行了优化。
在 Oracle 12c 上,我 运行 一个示例查询很像你的 autotrace
打开,它列出了它使用的过滤器谓词。正如预期的那样,谓词列表被简化以消除重复项。
如果您想自己检查一下,请在您的查询中使用 autotrace
。
如果这是一个重复的问题,我深表歉意:我搜索过但发现很多不相关的 topics/questions。
例如
select *
from table_of_things
where id in (1, 2, 3, 4, 5, 6, 1, 2, 1)
Oracle 预处理会在执行查询之前删除重复项吗?我怎样才能知道?我想在大型列表中性能损失可能会很大,如果没有,最好在查询之前自己删除重复项。
有点。或者,更相关的是,这是一个完全不重要的问题如何实现逻辑。
IN
遵循简单的逻辑。当左操作数在 IN
之后的列表中时,它的计算结果为真。当操作数多次出现在列表中时,它的计算结果同样为真。
实际上,我猜测 Oracle 确实会在编译阶段删除重复项。但是,无论是否存在重复项,IN
的定义都是相同的。
和您一样,我找不到任何特定的文档条目来指定是否出于性能原因简化了表达式列表。它必须被视为一个实现细节。但是根据观察,它确实看起来像是优化器执行了优化。
在 Oracle 12c 上,我 运行 一个示例查询很像你的 autotrace
打开,它列出了它使用的过滤器谓词。正如预期的那样,谓词列表被简化以消除重复项。
如果您想自己检查一下,请在您的查询中使用 autotrace
。