You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle EM执行计划数据获取与排序逻辑及SQL查询疑问

Oracle EM执行计划查询与排序问题解答

一、多子游标(CHILD_ADDRESS)的选择逻辑

当存在多个CHILD_ADDRESS条目时,Oracle EM默认会选取最新生成的子游标,也就是V$SQL视图中TIMESTAMP字段值最大的条目。

子游标产生的原因包括绑定变量类型不匹配、优化器参数变更、统计信息更新等,最新的子游标通常对应当前正在执行或最近执行的SQL计划,最能反映实际运行情况。如果需要更贴合实际执行频率,也可以优先选择V$SQL中EXECUTIONS字段值最高的子游标,这类游标是实际执行次数最多的。

获取目标子游标的SQL示例:

SELECT CHILD_ADDRESS
FROM V$SQL
WHERE SQL_ID = 'cgaryqcan3bh4'
  AND PLAN_HASH_VALUE = 1099020371
ORDER BY TIMESTAMP DESC
FETCH FIRST 1 ROW ONLY;

二、复现EM的执行计划排序逻辑

你之前使用ORDER BY ID, DEPTH, PARENT_ID无法匹配EM的展示顺序,原因是这三个字段无法准确还原Oracle内部定义的执行顺序。EM的执行计划排序依赖V$SQL_PLAN中的SEQUENCE字段,该字段直接标识了计划行的执行顺序。

如果要完全复现EM的树形层级展示效果,建议使用CONNECT BY构建层级关系,再结合ORDER SIBLINGS BY SEQUENCE保证同层级节点的执行顺序正确。完整查询示例:

SELECT LPAD(' ', 2*(LEVEL-1)) || OPERATION || ' ' || OPTIONS AS 执行计划行,
       OBJECT_NAME,
       ID,
       PARENT_ID,
       DEPTH,
       SEQUENCE
FROM V$SQL_PLAN
WHERE SQL_ID = 'cgaryqcan3bh4'
  AND PLAN_HASH_VALUE = 1099020371
  AND CHILD_ADDRESS = (SELECT CHILD_ADDRESS
                       FROM V$SQL
                       WHERE SQL_ID = 'cgaryqcan3bh4'
                         AND PLAN_HASH_VALUE = 1099020371
                       ORDER BY TIMESTAMP DESC
                       FETCH FIRST 1 ROW ONLY)
START WITH PARENT_ID IS NULL
CONNECT BY PRIOR ID = PARENT_ID
ORDER SIBLINGS BY SEQUENCE;

如果仅需要匹配EM的排序顺序,直接使用ORDER BY SEQUENCE即可:

SELECT *
FROM V$SQL_PLAN
WHERE SQL_ID = 'cgaryqcan3bh4'
  AND PLAN_HASH_VALUE = 1099020371
  AND CHILD_ADDRESS = (SELECT CHILD_ADDRESS
                       FROM V$SQL
                       WHERE SQL_ID = 'cgaryqcan3bh4'
                         AND PLAN_HASH_VALUE = 1099020371
                       ORDER BY TIMESTAMP DESC
                       FETCH FIRST 1 ROW ONLY)
ORDER BY SEQUENCE;

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:05:02