如何获取当前正在跑程序的执行计划
1获取当前程序执行SQL 的SQL_ID, 这有两种途径:
a .
SELECT T. SQL_ID FROM GV$SESSION T WHERE T. STATUS 'BACKGROUND'
AND T. STATUS ='ACTIVE' AND T. MODULE LIKE '%MCA_APD_CHECK_PUBLIC_PKG%';
b .
根据日志记录,定位到程序目前执行到哪一步,再提取这一步的SQL , 根据SQL 文本获取: SELECT *FROM GV$SQL T WHERE T. SQL_TEXT LIKE '%INSERT INTO
OWR_AP_BALANCE_F%';
根据SQL_ID, 在PLSQL DEVELOPER 中执行下面的脚本,获得CLOB 格式的执行计划,建议打开后粘贴到文本编辑器查看;
SELECT DBMS_SQLTUNE. REPORT_SQL_MONITOR(SQL_ID =>'3mf9uj08kxj30' ) FROM DUAL ;
1.ORACLE 中所有的V$打头的视图都是动态视图,在运行时随时变化的,因此一个存储过程程序执行一段时间,SQL_ID可能在不断变化;
2. 每个V$视图都有对应的GV$视图,多节点的环境(如目前我们使用的exadata 平台)下需要使用GV$,如果查看V$视图只能获取当前连接节点
(数据库实例)的信息。
3. 调用了DBMS_SQLTUNE.REPORT_SQL_MONITOR获取的执行计划报告,最大的特点是包含了SQL 当前执行状态的信息,即计划估算值和实际执行状态有个明显对比;
SQL MONITOR生成执行计划报告的阅读要点:
1. 从头到尾,依次是SQL 文本信息,SQL 总体执行信息(包含执行时间),并行相关信息,执行计划;
2. 执行计划中,ROW (Estim ) 列是计划估算值(就是前面介绍的基数
Cardinality ), rows (Actual ) 是实际执行值,两者差异太大就说明执行计划有严重偏差,可能需要优化;
3. 执行计划的Activity Detail(#samples), 详细说明了每个步骤操作具体消耗,因为都是通过系统等待事件表示的,所以需要对等待事件有一定基础。
如何获取当前正在跑程序的执行计划
1获取当前程序执行SQL 的SQL_ID, 这有两种途径:
a .
SELECT T. SQL_ID FROM GV$SESSION T WHERE T. STATUS 'BACKGROUND'
AND T. STATUS ='ACTIVE' AND T. MODULE LIKE '%MCA_APD_CHECK_PUBLIC_PKG%';
b .
根据日志记录,定位到程序目前执行到哪一步,再提取这一步的SQL , 根据SQL 文本获取: SELECT *FROM GV$SQL T WHERE T. SQL_TEXT LIKE '%INSERT INTO
OWR_AP_BALANCE_F%';
根据SQL_ID, 在PLSQL DEVELOPER 中执行下面的脚本,获得CLOB 格式的执行计划,建议打开后粘贴到文本编辑器查看;
SELECT DBMS_SQLTUNE. REPORT_SQL_MONITOR(SQL_ID =>'3mf9uj08kxj30' ) FROM DUAL ;
1.ORACLE 中所有的V$打头的视图都是动态视图,在运行时随时变化的,因此一个存储过程程序执行一段时间,SQL_ID可能在不断变化;
2. 每个V$视图都有对应的GV$视图,多节点的环境(如目前我们使用的exadata 平台)下需要使用GV$,如果查看V$视图只能获取当前连接节点
(数据库实例)的信息。
3. 调用了DBMS_SQLTUNE.REPORT_SQL_MONITOR获取的执行计划报告,最大的特点是包含了SQL 当前执行状态的信息,即计划估算值和实际执行状态有个明显对比;
SQL MONITOR生成执行计划报告的阅读要点:
1. 从头到尾,依次是SQL 文本信息,SQL 总体执行信息(包含执行时间),并行相关信息,执行计划;
2. 执行计划中,ROW (Estim ) 列是计划估算值(就是前面介绍的基数
Cardinality ), rows (Actual ) 是实际执行值,两者差异太大就说明执行计划有严重偏差,可能需要优化;
3. 执行计划的Activity Detail(#samples), 详细说明了每个步骤操作具体消耗,因为都是通过系统等待事件表示的,所以需要对等待事件有一定基础。