java - 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 数据库。
解决方案
推荐阅读
- django - 如何在 Django 模型中正确使用验证消息
- javascript - 为什么缓存优先策略并不比没有服务工作者更快?
- module - 特色类别 PrestaShop 1.7
- angular - ./node_modules/ngx-cookie-service/fesm2015/ngx-cookie-service.js 147:132-140 中的警告“在 '@angular/core' 中找不到导出 'ɵɵinject'
- kotlin - 如何在没有 NoSuchMethodError 的 Kotlin 1.4 的 Gradle 构建中使用新定义的委托属性?
- wordpress - 如何在 WordPress 上检索我的停用插件?
- gradle - 如何告诉gradle等到命令行进程被执行?
- c# - 使用带有 C# 的 or-tools 的车辆技能
- anaconda3 - Anaconda-navigator 在 Tumbleweed 上安装后无法启动
- c# - 如何在 C# 中在定义的时间段内保持整个进程执行,包括所有正在运行的线程