Oracle 19c视图Parallel Hint失效问题求助(含管道函数场景)
Oracle 12c迁移至19c后并行Hint失效问题解决
一、视图查询并行Hint失效场景
问题现象
执行SELECT /*+ PARALLEL(8) */ 1 FROM View;时并行度正常生效,但查询具体字段SELECT /*+ PARALLEL(8) */ id,name FROM View时并行失效,该场景在12c中可正常运行。
解决方案
- 指定对象级并行Hint:将全局并行Hint改为针对视图的对象级Hint,明确指定并行度作用于目标视图。示例:
SELECT /*+ PARALLEL(View, 8) */ id, name FROM View; - 设置视图并行属性:直接给目标视图添加并行属性,让视图默认支持并行执行。示例:
ALTER VIEW View PARALLEL 8; - 关闭自适应并行优化:19c默认开启
OPTIMIZER_ADAPTIVE_PARALLELISM,优化器可能自动调整或关闭并行。可通过会话级参数关闭:ALTER SESSION SET OPTIMIZER_ADAPTIVE_PARALLELISM = FALSE; - 排查视图内部逻辑:检查视图定义中是否包含
DISTINCT、非并行聚合等无法并行的操作,这类逻辑在19c中可能更严格地阻止并行执行。
二、管道函数调用并行失效场景
问题现象
调用带有PARALLEL_ENABLE声明的管道函数时,游标内的并行Hint失效,函数包含PRAGMA AUTONOMOUS_TRANSACTION;声明,函数定义如下:
FUNCTION P_FILE ( P_SOURCE IN SYS_REFCURSOR, p_filename IN VARCHAR2, p_directory IN VARCHAR2 ) RETURN v_return_pipe PIPELINED DETERMINISTIC PARALLEL_ENABLE (PARTITION p_source BY ANY)AS PRAGMA AUTONOMOUS_TRANSACTION;
解决方案
- 移除自治事务声明:
PRAGMA AUTONOMOUS_TRANSACTION;与并行执行不兼容,自治事务无法在并行会话中运行,若业务允许需移除该声明。 - 优化游标内的Hint:将游标中的全局并行Hint改为针对视图的对象级Hint,确保Hint传递到目标视图。示例:
SELECT * FROM TABLE(PACKAGE1.P_FILE( CURSOR(SELECT /*+ PARALLEL(VIEW1, 8) */ C1,C2 FROM VIEW1 WHERE 1=1), 'Filename.txt', 'directroy' )) nt; - 校验并行函数声明:确保
PARALLEL_ENABLE (PARTITION p_source BY ANY)的声明符合业务逻辑,若游标数据无法按任意分区方式拆分,需调整分区策略。
内容的提问来源于stack exchange,提问作者Prabhakaran M
相关产品推荐
相关产品推荐

