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

Oracle中的非相关子选择是否在外部语句之前计算?,oracle,subquery,query-performance,Oracle,Subquery,Query Performance,在谷歌搜索了很长一段时间后,我仍然没有在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 我读到在MySQL 5.5之前的版本中(它们

在谷歌搜索了很长一段时间后,我仍然没有在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
我读到在MySQL 5.5之前的版本中(它们随5.6的变化而变化),为外层的每一行计算subselect,即使它们是非实数的


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

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

有时,DBMS应该首先加载数据,然后使用此列表作为查找,这对于我们来说是显而易见的,这就是给定此任务所要做的。然而,对于DBMS,另一种方法可能更好


你的保险条款很好。这是非常可读的,我认为没有理由改变它。但是如果你发现负更具可读性,就用它代替。使您的查询尽可能简单易读。依靠Oracle的优化器找到最佳执行计划。只有在遇到性能问题时,才应该考虑重新编写查询,以便向优化器显示另一个选项:-)

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

有时,DBMS应该首先加载数据,然后使用此列表作为查找,这对于我们来说是显而易见的,这就是给定此任务所要做的。然而,对于DBMS,另一种方法可能更好


你的保险条款很好。这是非常可读的,我认为没有理由改变它。但是如果你发现负更具可读性,就用它代替。使您的查询尽可能简单易读。依靠Oracle的优化器找到最佳执行计划。只有在遇到性能问题时,才应该考虑重新编写查询-以便向优化器显示另一个选项:-)

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


始终查看执行计划,然后查看实际光标(
DBMS\u XPLAN.DISPLAY\u cursor
),然后查看发生的情况以及顺序。如果您想查看更多make 10053跟踪,并查看优化器的所有注意事项。Oracle在优化器方面有无数的优化。

显而易见的答案是——这要看情况而定


始终查看执行计划,然后查看实际光标(
DBMS\u XPLAN.DISPLAY\u cursor
),然后查看发生的情况以及顺序。如果您想查看更多make 10053跟踪,并查看优化器的所有注意事项。Oracle在优化器方面有无数的优化。

这取决于子查询正在做什么,以及优化器是否可以取消它的测试:

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

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

子查询非嵌套unNEST,并将子查询的正文合并到包含它的语句的正文中,从而允许优化器在访问路径和联接时评估它们。优化器可以取消大多数子查询的测试,但也有一些例外。

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


作为@ThorstenKettner,您的示例看起来不错,但您始终可以检查执行计划显示的内容,或跟踪查询以了解其在引擎盖下执行的操作的详细信息。

这取决于子查询正在执行的操作以及优化者是否可以取消检测

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

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

子查询非嵌套unNEST,并将子查询的正文合并到包含它的语句的正文中,从而允许优化器在访问路径和联接时评估它们。优化器可以取消大多数子查询的测试,但也有一些例外。

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

正如@ThorstenKettner一样,您的示例看起来不错,但您始终可以检查执行计划显示的内容,或者跟踪查询以了解它在幕后做什么的细节