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
相关产品推荐
相关产品推荐

