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)
|
Instance ID
|
:
|
1
|
|
Buffer Gets
|
IO Requests
|
Database Time
|
Wait Activity
|
|
|
|
|
|
|
|
Session
|
:
|
xxxxxxxx (4940:57969)
|
|
SQL ID
|
:
|
cjqdgd14xjwjm
|
|
SQL Execution ID
|
:
|
16783859
|
|
Execution Started
|
:
|
07/17/2014 14:48:09
|
|
First Refresh Time
|
:
|
07/17/2014 14:48:15
|
|
Last Refresh Time
|
:
|
07/17/2014 14:48:20
|
|
Duration
|
:
|
11s
|
|
Module/Action
|
:
|
JDBC Thin Client/-
|
|
Service
|
:
|
SYS$USERS
|
|
Program
|
:
|
JDBC Thin Client
|
|
PL/SQL Entry Ids
|
:
|
2455820,1
|
|
PL/SQL Ids (Obj/Sub)
|
:
|
2455820,1
|
|
Fetch Calls
|
:
|
2
|
Binds
|
Name
|
Position
|
Type
|
Value
|
|
:B2
|
1
|
NUMBER
|
10308170
|
|
:B1
|
2
|
NUMBER
|
6
|
SQL Plan Monitoring Details (Plan Hash Value=1125972187)
|
Id
|
Operation
|
Name
|
Estimated
Rows
|
Cost
|
Active Period
(11s)
|
Execs
|
Rows
|
Memory
(Max)
|
Temp
(Max)
|
IO Requests
|
CPU Activity
|
Wait Activity
|
|
.
|
0
|
SELECT STATEMENT
|
.
|
.
|
.
|
|
1
|
1
|
.
|
.
|
|
.
|
.
|
|
.
|
1
|
. SORT ORDER BY
|
.
|
6
|
67758
|
|
1
|
1
|
2.0KB
|
.
|
|
.
|
.
|
|
.
|
2
|
.. COUNT STOPKEY
|
.
|
.
|
.
|
|
1
|
1
|
.
|
.
|
|
.
|
.
|
|
.
|
3
|
... VIEW
|
xxxxxxxxxxxxx
|
577K
|
59898
|
|
1
|
1
|
.
|
.
|
|
.
|
.
|
|
.
|
4
|
.... SORT UNIQUE STOPKEY
|
.
|
577K
|
59898
|
|
1
|
1
|
2.0KB
|
.
|
|
.
|
.
|
|
.
|
5
|
..... UNION-ALL
|
.
|
.
|
.
|
|
1
|
1
|
.
|
.
|
|
.
|
.
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25444422/viewspace-2092009/
,如需转载,请注明出处,否则将追究法律责任。