是Oracle中在外部语句之前计算的非相关子选择项



经过长时间的谷歌和SO搜索,我仍然没有在Oracle中找到任何关于非相关子选择的计算。

我有这样的情况,我需要找到差异,我正在考虑使用这样的查询,其中子选择独立于外部选择:

select pk
from A
where pk is not in 
  (select from complex_query_with_many_joins )   -- non related quite complex query with many joins

我读到,在高达5.5的MySQL中(它们随着5.6的变化而变化),即使没有重新计算,也会为外部的每一行计算子select。

oracle如何计算子选择?使用MINUS而不是subselect会更好吗?[我的表相当大,意味着100Ks行]

Oracle有一个非常好的优化器。它将决定是先选择子查询数据还是动态选择。在内部,它可以完全重写查询,并从多种方式中进行选择以获取数据。

有时,对我们来说,DBMS应该首先加载数据,然后使用此列表作为查找,这是我们在执行此任务时要做的。然而,对于DBMS来说,另一种方式可能要好得多。

你的IN条款很好。它可读性很强,我认为没有理由更改它。但如果你觉得MINUS更可读,那就用它吧。使查询尽可能简单易读。依靠Oracle的优化器来找到最佳执行计划。只有在遇到性能问题时,您才应该考虑重新编写查询-以便向优化器显示另一个选项:-)

显而易见的答案是-这取决于情况。

总是先看执行计划,然后看实际的游标(DBMS_XPLAN.DISPLAY_CURSOR),然后再看发生了什么以及按什么顺序进行。如果您想看到更多,请进行10053跟踪并查看优化器所做的所有考虑事项。Oracle在优化器方面有无数的优化。

这取决于子查询正在做什么以及优化器是否可以运行它

当子查询出现在父语句的WHERE子句中时,它们将嵌套。当Oracle数据库使用嵌套子查询评估语句时,它必须多次评估子查询部分,并且可能会忽略一些有效的访问路径或联接。

这表明它将多次执行子查询,但接着说:

子查询取消测试,并将子查询的主体合并到包含它的语句的主体中,使优化器在评估访问路径和联接时能够将它们考虑在一起。优化器可以运行大多数子查询,但也有一些例外

假设不存在任何限制,优化器会自动取消测试以下嵌套子查询中的一些(但不是全部):
-不相关的IN子查询

作为@ThorstenKettner,您的示例看起来不错,但您可以随时检查执行计划显示的内容,或者跟踪查询以了解它在后台执行的详细信息。

最新更新