--查看SQL語句信息(腳本sqlstat.sql)
SYS@PROD1> @sqlstats.sql 0hwwkmuancxmm 15
SYS@PROD1> SET ECHO OFF
PROD1 / 2017-03-08
------------------------------------------------------------------------------------------
Interval (seconds) 15
Period 2017-03-08 20:15:46 - 2017-03-08 20:16:01
------------------------------------------------------------------------------------------
Identification
------------------------------------------------------------------------------------------
SQL Id 0hwwkmuancxmm
Execution Plan Hash Value 903671040
------------------------------------------------------------------------------------------
Shared Cursors Statistics
------------------------------------------------------------------------------------------
Total Parses 0
Loads / Hard Parses 0
Invalidations 0
Cursor Size / Shared (bytes) 0
------------------------------------------------------------------------------------------
Activity by Time
------------------------------------------------------------------------------------------
Elapsed Time (seconds) 0.000
CPU Time (seconds) 0.000
Wait Time (seconds) 0.000
------------------------------------------------------------------------------------------
Activity by Waits
------------------------------------------------------------------------------------------
Application Waits (%)
Concurrency Waits (%)
Cluster Waits (%)
User I/O Waits (%)
Remaining Waits (%)
CPU (%)
------------------------------------------------------------------------------------------
Elapsed Time Breakdown
------------------------------------------------------------------------------------------
SQL Time (seconds) 0.000
PL/SQL Time (seconds) 0.000
Java Time (seconds) 0.000
------------------------------------------------------------------------------------------
Execution Statistics Total Per Execution Per Row
------------------------------------------------------------------------------------------
Elapsed Time (milliseconds) 0
CPU Time (milliseconds) 0
Executions 0
Buffer Gets 0
Disk Reads 0
Direct Writes 0
Rows 0
Fetches 0
Average Fetch Size
------------------------------------------------------------------------------------------
Other Statistics
------------------------------------------------------------------------------------------
Executions that Fetched All Rows (%)
Serializable Aborts 0
------------------------------------------------------------------------------------------
@sqlstats.sql
SET ECHO OFF
REM ***************************************************************************
REM ******************* Troubleshooting Oracle Performance ********************
REM ************************* http://top.antognini.ch *************************
REM ***************************************************************************
REM
REM File name...: sqlstats.sql
REM Author......: Christian Antognini
REM Date........: February 2014
REM Description.: This script shows the performance statistics associated to a
REM cursor. It can show:
REM - The statistics since the cursor was loaded
REM - The statistics about the last n seconds
REM When the second parameter is set to a value greater than 0,
REM the latter are shown. Otherwise, the former are shown.
REM Notes.......: The data is based on the v$sqlstats dynamic performance view
REM Parameters..: &1: SQL id of the cursor
REM &2: length of the interval in seconds
REM
REM You can send feedbacks or questions about this script to [email protected].
REM
REM Changes:
REM DD.MM.YYYY Description
REM ---------------------------------------------------------------------------
REM 30.06.2014 Added header to the output
REM 26.05.2016 Fixed a "division by zero" bug
REM ***************************************************************************
SET TERMOUT OFF SERVEROUT ON LONG 1000000 LONGCHUNKSIZE 1000000 LINESIZE 90 VERIFY OFF FEEDBACK OFF HEADING OFF
COLUMN "Text" FORMAT A90 WRAP
COLUMN global_name NEW_VALUE global_name
COLUMN day NEW_VALUE day
VARIABLE sql_id VARCHAR2(13)
VARIABLE interval NUMBER
BEGIN
:sql_id := '&1';
:interval := to_number('&2');
IF :interval < 0
THEN
:interval := 0;
END IF;
EXCEPTION
WHEN value_error THEN
:interval := 0;
END;
/
UNDEFINE 1
UNDEFINE 2
SELECT global_name, decode(:interval, 0, to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),
to_char(sysdate,'YYYY-MM-DD')) AS day
FROM global_name;
TTITLE CENTER '&global_name / &day' SKIP 1
SET TERMOUT ON
SELECT NULL FROM dual;
DECLARE
c_line CONSTANT INTEGER := 90;
c_col1 CONSTANT INTEGER := 36;
c_col2 CONSTANT INTEGER := 54;
t1 DATE;
t2 DATE;
s1 v$sqlstats%ROWTYPE;
s2 v$sqlstats%ROWTYPE;
w1 NUMBER;
w2 NUMBER;
r NUMBER;
e NUMBER;
PROCEDURE o(p_name IN VARCHAR2, p_value IN VARCHAR2) AS
BEGIN
IF p_value IS NULL
THEN
dbms_output.put_line(p_name);
ELSE
dbms_output.put_line(rpad(p_name, c_col1) || lpad(p_value, c_col2));
END IF;
END;
PROCEDURE o(p_name IN VARCHAR2, p_value1 IN VARCHAR2, p_value2 IN VARCHAR2, p_value3 IN VARCHAR2) AS
BEGIN
dbms_output.put_line(rpad(p_name, c_col1) || lpad(p_value1, c_col2/3) || lpad(p_value2, c_col2/3) || lpad(p_value3, c_col2/3));
END;
PROCEDURE o(p_text IN VARCHAR2) AS
BEGIN
o(p_text, cast(NULL AS VARCHAR2));
END;
PROCEDURE o(p_linesize IN INTEGER DEFAULT c_line) AS
BEGIN
dbms_output.put_line(rpad('-', p_linesize, '-'));
END;
PROCEDURE o(p_name IN VARCHAR2, p_value IN NUMBER, p_integer IN BOOLEAN DEFAULT TRUE) AS
BEGIN
IF p_integer
THEN
o(p_name, to_char(round(p_value, 0), '9,999,999,999,999'));
ELSE
o(p_name, to_char(round(p_value, 3), '9,999,999,990.999'));
END IF;
END;
PROCEDURE o(p_name IN VARCHAR2, p_value IN NUMBER, p_executions IN NUMBER, p_rows IN NUMBER, p_integer IN BOOLEAN DEFAULT TRUE) AS
BEGIN
IF p_integer
THEN
o(p_name,
to_char(round(p_value, 0), '9,999,999,999,999'),
to_char(round(p_value/nullif(p_executions, 0), 0), '9,999,999,999,999'),
to_char(round(p_value/nullif(p_rows, 0), 3), '9,999,999,990.999'));
ELSE
o(p_name,
to_char(round(p_value, 3), '9,999,999,990.999'),
to_char(round(p_value/nullif(p_executions, 0), 3), '9,999,999,990.999'),
to_char(round(p_value/nullif(p_rows, 0), 3), '9,999,999,990.999'));
END IF;
END;
BEGIN
t1 := sysdate;
IF :interval > 0
THEN
SELECT * INTO s1
FROM v$sqlstats
WHERE sql_id = :sql_id;
dbms_lock.sleep(:interval);
END IF;
t2 := sysdate;
SELECT * INTO s2
FROM v$sqlstats
WHERE sql_id = :sql_id;
IF :interval > 0
THEN
o();
o('Interval (seconds)', :interval);
o('Period', to_char(t1, 'YYYY-MM-DD HH24:MI:SS') || ' - ' || to_char(t2, 'YYYY-MM-DD HH24:MI:SS'));
END IF;
o();
o('Identification');
o();
$IF dbms_db_version.version >= 12
$THEN
o('Container Id', s2.con_id);
$END
o('SQL Id', s2.sql_id);
o('Execution Plan Hash Value', to_char(s2.plan_hash_value));
o();
o('Shared Cursors Statistics');
o();
o('Total Parses', s2.parse_calls - nvl(s1.parse_calls,0));
o('Loads / Hard Parses', s2.loads - nvl(s1.loads,0));
o('Invalidations', s2.invalidations - nvl(s1.invalidations,0));
o('Cursor Size / Shared (bytes)', s2.sharable_mem - nvl(s1.sharable_mem,0));
o();
o('Activity by Time');
o();
o('Elapsed Time (seconds)', (s2.elapsed_time - nvl(s1.elapsed_time,0)) / 1E6, FALSE);
o('CPU Time (seconds)', (s2.cpu_time - nvl(s1.cpu_time,0)) / 1E6, FALSE);
w1 := s1.elapsed_time - s1.cpu_time;
w2 := s2.elapsed_time - s2.cpu_time;
o('Wait Time (seconds)', (w2 - nvl(w1,0)) / 1E6, FALSE);
o();
o('Activity by Waits');
o();
o('Application Waits (%)', (s2.application_wait_time - nvl(s1.application_wait_time, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time,0), 0) * 100, FALSE);
o('Concurrency Waits (%)', (s2.concurrency_wait_time - nvl(s1.concurrency_wait_time, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time,0), 0) * 100, FALSE);
o('Cluster Waits (%)', (s2.cluster_wait_time - nvl(s1.cluster_wait_time, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time, 0), 0) * 100, FALSE);
o('User I/O Waits (%)', (s2.user_io_wait_time - nvl(s1.user_io_wait_time, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time, 0), 0) * 100, FALSE);
w1 := s1.elapsed_time - s1.cpu_time - s1.application_wait_time - s1.concurrency_wait_time - s1.cluster_wait_time - s1.user_io_wait_time;
w2 := s2.elapsed_time - s2.cpu_time - s2.application_wait_time - s2.concurrency_wait_time - s2.cluster_wait_time - s2.user_io_wait_time;
o('Remaining Waits (%)', (w2 - nvl(w1, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time, 0), 0) * 100, FALSE);
o('CPU (%)', (s2.cpu_time - nvl(s1.cpu_time, 0)) / nullif(s2.elapsed_time - nvl(s1.elapsed_time, 0), 0) * 100, FALSE);
o();
o('Elapsed Time Breakdown');
o();
w1 := s1.elapsed_time - s1.plsql_exec_time - s1.java_exec_time;
w2 := s2.elapsed_time - s2.plsql_exec_time - s2.java_exec_time;
o('SQL Time (seconds)', (w2 - nvl(w1, 0)) / 1E6, FALSE);
o('PL/SQL Time (seconds)', (s2.plsql_exec_time - nvl(s1.plsql_exec_time, 0)) / 1E6, FALSE);
o('Java Time (seconds)', (s2.java_exec_time - nvl(s1.java_exec_time, 0)) / 1E6, FALSE);
o();
o('Execution Statistics', ' Total Per Execution Per Row');
o();
e := s2.executions - nvl(s1.executions, 0);
r := s2.rows_processed - nvl(s1.rows_processed, 0);
o('Elapsed Time (milliseconds)', (s2.elapsed_time - nvl(s1.elapsed_time, 0)) / 1E3, e, r);
o('CPU Time (milliseconds)', (s2.cpu_time - nvl(s1.cpu_time, 0)) / 1E3, e, r);
o('Executions', s2.executions - nvl(s1.executions, 0), e, r);
o('Buffer Gets', s2.buffer_gets - nvl(s1.buffer_gets, 0), e, r);
o('Disk Reads', s2.disk_reads - nvl(s1.disk_reads, 0), e, r);
o('Direct Writes', s2.direct_writes - nvl(s1.direct_writes, 0), e, r);
o('Rows', s2.rows_processed - nvl(s1.rows_processed, 0), e, r);
o('Fetches', s2.fetches - nvl(s1.fetches, 0), e, r);
o('Average Fetch Size', nullif(r, 0) / nullif(s2.fetches - nvl(s1.fetches, 0), 0), NULL, NULL);
o();
o('Other Statistics');
o();
o('Executions that Fetched All Rows (%)', floor((s2.end_of_fetch_count - nvl(s1.end_of_fetch_count, 0)) / nullif(s2.executions - nvl(s1.executions, 0), 0) * 100));
o('Serializable Aborts', s2.serializable_aborts - nvl(s1.serializable_aborts, 0));
o();
END;
/
TTITLE OFF
CLEAR COLUMNS
查看SQL語句信息(腳本sqlstat.sql)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.