oracle中通过存储过程定位sql的方法


       工作中遇到不少开发跑过来,急匆匆的说我的存储过程执行好慢帮忙看看是哪里慢的情况。

      抛开锁阻塞,存储过程执行缓慢大概率是其中的sql 语句执行缓慢,那么怎么样快速定位到是哪个sql 执行有问题呢,或者是找到了有问题的sql 需要调整,怎么告知开发有问题的sql 是属于哪一个存储过程,相信日常工作中dba 都会遇到这样的问题。主要有以下方式:

    1、通过v$active_session_history 结合 v$sql 视图定位存储过程与sql 语句之间的关系

        首先定位存储过程的sql_id,可以通过存储过程名称模糊查询,一般类似 BEGIN 存储过程名称 EDN,通过like 匹配查询v$sql 视图

      select sql_id,sql_text from v$sql t where t.SQL_TEXT like ‘%存储过程名称%’

     找到存储过程sql_id 后,通过v$active_session_history  视图查找存储过程包含的sql 语句的sql_id

select distinct  t.SQL_ID,t.TOP_LEVEL_SQL_ID from v$active_session_history t where t.TOP_LEVEL_SQL_ID='&存储过程sql_id'

   拿到sql 语句的sql_id 后 结合v$sql_monitor 、v$sql_plan_monitor、DBA_HIST_SQLSTATS、DBA_HIST_SNAPSHOT就能分析到哪些sql 语句执行时间最长、执行计划有无问题、执行计划有无发生变化准对具体的sql 语句进行优化、调整。

2、通过OEM 快速定位sql 语句与存储过程之间的联系

     打开OEM Top Activity Top SQL页面,一般执行速度慢的sql 都能看到,点击排在前面的sql_id 超链接

打开 sql details 页面,点击统计信息,就能看到sql 属于哪个存储过程在调用、sql 执行速度、资源消耗情况: