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

作者: admin 分类: 公众号存档            3 次浏览 发布时间: 2014-07-18 07:24

公众号:杨建荣的学习笔记 · 作者:r2笔记37天 · 发布:2014-07-18 07:24:04 · 原文链接

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
.
90637

.

.

1632

.

.

11s

.

.

.

100%
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 . .
. .

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注