通过shell脚本定位性能sql和生成报告(r2笔记37天)

时间:2022-05-04
本文章向大家介绍通过shell脚本定位性能sql和生成报告(r2笔记37天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

oracle的sql monitor是一个很有用的工具集。但是通过sql命令和反复去调用dbms_tune来传入参数等等操作感觉挺费事的。 可以通过如下的脚本来定位sql monitor中的性能sql,发现一些潜在的性能问题。 这个脚本可以定位正在sql monitor监控范围内的sql语句。 MONITOR_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID <<END set pages 100 set linesize 200 col status format a20 col username format a15 col module format a20 col program format a25 col sql_id format a20 col sql_text format a20 select sql_id,STATUS , USERNAME , MODULE , PROGRAM, substr(SQL_TEXT,0,20) sql_text from v\$sql_monitor where username =upper('$1') group by sql_id,STATUS , USERNAME , MODULE , PROGRAM, substr(SQL_TEXT,0,20); exit; END` if [ -z "$MONITOR_OWNER" ]; then echo "no object exists, please check again" exit 0 else echo '*******************************************' echo " $MONITOR_OWNER " echo '*******************************************' fi 脚本运行结果如下,可以显示sql_id和状态,还有简单的sql语句。 尤其可以重点关注那些正在执行的语句。 SQL_ID STATUS USERNAME MODULE PROGRAM SQL_TEXT -------------------- -------------------- --------------- -------------------- ------------------------- -------------------- 7u9gsk798bvrp DONE (ALL ROWS) TEST_USER JDBC Thin Client JDBC Thin Client SELECT AA.DATA_GRO cjqdgd14xjwjm DONE (ALL ROWS) TEST_USER JDBC Thin Client JDBC Thin Client SELECT TO_CHAR (SUBS 2zymmn3s4xn1k DONE (ALL ROWS) TEST_USER JDBC Thin Client JDBC Thin Client SELECT nrg."Cyc 1hg2wcuapy3y3 EXECUTING TEST_USER JDBC Thin Client JDBC Thin Client select d1_run_reque 如果要生成sql monitor报告。 可以采用如下的脚本 MONITOR_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID <<END set pages 100 set linesize 200 col status format a20 col username format a15 col module format a20 col program format a25 col sql_id format a20 col sql_text format a20 select sql_id,STATUS , USERNAME , MODULE , PROGRAM, substr(SQL_TEXT,0,20) sql_text from v\$sql_monitor where sql_id='$1' group by sql_id,STATUS , USERNAME , MODULE , PROGRAM, substr(SQL_TEXT,0,20) ; exit; END` if [ -z "$MONITOR_OWNER" ]; then echo "no object exists, please check again" exit 0 else echo '*******************************************' echo " $MONITOR_OWNER " echo '*******************************************' fi sqlplus -silent $DB_CONN_STR@$SH_DB_SID <<EOF set long 99999 set pages 0 set linesize 200 col status format a20 col username format a30 col module format a20 col program format a20 col sql_id format a20 col sql_text format a50 col comm format a200 set long 999999 SELECT dbms_sqltune.report_sql_monitor( sql_id => '$1', report_level => 'ALL', type=>'TEXT' ) comm FROM dual; EOF 如果要查看html格式的,直接替换上述标黄的部分为HTML即可。 生成的报告可读性很好,可以很容易看到瓶颈倒底在哪儿

SQL Monitoring Report

SQL Text


xxxxxxxxxxxxxx

Global Information: DONE (ALL ROWS)

Binds


Name

Position

Type

Value

:B2

1

NUMBER

10308170

:B1

2

NUMBER

6

SQL Plan Monitoring Details (Plan Hash Value=1125972187)