工作中遇到一个问题,某报表运行时间特别长,通过操作系统可以看到一个oracle进程消耗资源比较大,如何能够通过该操作系统进程找到具体SQL呢。记录如下:
1、查看Linux系统进程号
可以通过top动态查看某进程的资源使用情况,也可以通过ps aux查看某进程的相关信息。
2、通过v$process查看oracle中对应的进程
SQL> select * from v$process where spid = '25802'; ADDR PID SPID PNAME USERNAME SERIAL# TERMINAL PROGRAM TRACEID ....... ---------------- ---------- ------------------------ ----- --------------- ---------- ------------------------------ ------------------------------------------------ -------------------------------------------------------------------------------- ....... 0000000358BE4CD0 78 25802 oracle 158 UNKNOWN .......
3、通过v$session查看具体的会话
SQL> select sql_id,status from v$session where paddr = '0000000358BE4CD0'; SQL_ID STATUS ------------- -------- akjssv2gwa7jf ACTIVE
4、通过dbms_xplan.display_cursor查看执行计划
SQL> select * from table(dbms_xplan.display_cursor('akjssv2gwa7jf')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID akjssv2gwa7jf, child number 0 ------------------------------------- .....有删减......
通过以上步骤就可以通过操作系统的某个进程ID确定到某个sql,然后查看执行计划,进行优化了。其中dbms_xplan.display_cursor这个包还有很多地方需要学习。另起一篇吧。官方文档在这里。