首页 > 解决方案 > Oracle WITH 子句 - 强制执行未使用的语句(禁用优化)

问题描述

问题:Oracle DB 使用了一些优化并且不执行WITH最终查询中未使用的组件。因此不执行未使用的查询。

问题:

是否可以禁用Oracle的优化并在WITH子句中执行所有查询?有什么特别的提示吗?

细节:

我想在从 Java 程序执行的查询中使用Oracle 数据库上下文机制。我决定使用Database session-based application context initialized locally上下文类型。因此,在一个数据库会话中,我可以设置一些上下文变量,并且只有在该会话中它才会可见。

我有一个想法在真正的 SQL 查询之前执行函数(设置必要的上下文变量)。所以最好的地方是将两者结合在一起。这对我来说将是最好的选择。

最小的例子:

如果我们执行(或查看解释计划)这个查询,我们注意到EXEC_CTX子查询没有被执行。只有最终查询 fromreal_table是由 Oracle 实际执行的。我们能否以某种方式强制 Oracle 执行它们(整个WITH查询)?

WITH EXEC_CTX AS (
  select set_my_ctx(42) from dual
)
SELECT *
  FROM real_table rt
 WHERE rt.col_x = SYS_CONTEXT('CTX_NAME', 'PARAM_ID')
;

我正在使用 Oracle 12c 数据库。

标签: javaoraclecommon-table-expressionoracle12c

解决方案


推荐阅读