Oracle 26中流水线函数的一致性读计数疑问
分析Oracle顶层SQL Fetch阶段额外一致性读的思路
1. 排查自定义函数内部的隐式字典访问
- 检查
split_to_array函数是否用到字符串处理内置函数(如REGEXP_SUBSTR、SUBSTR循环),这类操作可能触发对SQLT$、NLS_VALID_VALUES等字符集/正则元数据表的隐式查询,这些递归SQL可能因执行速度快被忽略,需仔细过滤追踪文件里的所有递归条目。 - 若函数使用数组类型(VARRAY/嵌套表),Oracle在数组初始化、扩容时会访问
SYS.OBJ$、SYS.TYPE$等类型字典表,需核对追踪文件中是否存在这些表的访问记录。
2. 验证会话环境与参数影响
- 切换到
10046 level 12追踪(包含绑定变量+等待事件),查看Fetch阶段db file sequential read等待对应的文件/块号,通过以下SQL定位所属对象:SELECT owner, segment_name, segment_type FROM dba_extents WHERE file_id = <目标文件ID> AND <目标块ID> BETWEEN block_id AND block_id + blocks - 1; - 确认是否开启
RESULT_CACHE,函数或顶层SQL的结果缓存逻辑会触发对SYS.RESULT_CACHE$等表的访问,产生额外一致性读。
3. 检查PL/SQL函数的属性与上下文
- 若函数带有
DETERMINISTIC或PARALLEL_ENABLE属性,Oracle会进行元数据校验,访问SYS.PLSQL_OBJECT_SETTINGS$等表,可暂时移除属性后重新追踪对比读次数变化。 - 排查函数是否引用包变量,首次访问包时会触发初始化逻辑,可能涉及
SYS.PLSQL_UNIT$等字典表的读取。
4. 考虑Oracle 26版本新特性的影响
- Oracle 26的字符串处理优化可能触发底层隐式逻辑,需搜索追踪文件中
KOP开头的其他内部表(如KOPD$、KOPC$),这类表属于PL/SQL管理的内部对象,可能产生额外读。 - 检查是否开启
AUTOMATIC SQL TUNING或SQL TRANSLATION等新特性,这类功能会在执行过程中插入隐式字典查询。
5. 拆解函数逻辑逐步验证
- 将
split_to_array的逻辑拆分为纯SQL语句逐行执行并追踪,对比每一步的一致性读数量,定位产生额外读的具体操作。 - 使用
DBMS_PROFILER或DBMS_TRACE追踪PL/SQL执行流程,捕获SQL_TRACE未覆盖的内部操作细节。
内容的提问来源于stack exchange,提问作者Nick T
相关产品推荐
相关产品推荐

