Files
oracle/vg/coe_sqlarea_80.sql

500 lines
17 KiB
MySQL
Raw Permalink Normal View History

2026-03-12 21:23:47 +01:00
set echo off
SET term off ver off feed off trims on;
-- Seeded Parameters
define p_top = 10;
define p_factor_th = 0.0040;
variable v_count number;
variable v_buffer_gets number;
variable v_disk_reads number;
variable v_executions number;
variable v_bg_per_exec number;
variable v_dr_per_exec number;
variable v_istartup varchar2(15);
SET term on ver off feed off trims on;
PROMPT Calculating SQL Area totals per category...
SET term off;
BEGIN
SELECT COUNT(*),
TRUNC(SUM(ABS(BUFFER_GETS))),
TRUNC(SUM(ABS(DISK_READS))),
TRUNC(SUM(ABS(EXECUTIONS))),
TRUNC(SUM(ABS(BUFFER_GETS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS)))),
TRUNC(SUM(ABS(DISK_READS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS))))
INTO :v_count,
:v_buffer_gets,
:v_disk_reads,
:v_executions,
:v_bg_per_exec,
:v_dr_per_exec
FROM V$SQLAREA;
SELECT TO_CHAR(STARTUP_TIME,'DD-MON-YY HH24:MI')
INTO :v_istartup
FROM V$INSTANCE
WHERE ROWNUM = 1;
END;
/
SET term on;
PROMPT Creating COE_SQLAREA temp table...
SET term off;
DROP TABLE COE_SQLAREA;
CREATE TABLE COE_SQLAREA
(ROW_NUM NUMBER,HASH_VALUE NUMBER,ADDRESS RAW(4),BUFFER_GETS NUMBER,
DISK_READS NUMBER,EXECUTIONS NUMBER,BG_PER_EXEC NUMBER,DR_PER_EXEC NUMBER,
PARSING_USER_ID NUMBER,MODULE VARCHAR2(64),ACTION VARCHAR2(64),
SQL_TEXT VARCHAR2(64),P_BUFFER_GETS NUMBER,P_DISK_READS NUMBER,
P_EXECUTIONS NUMBER,P_BG_PER_EXEC NUMBER,P_DR_PER_EXEC NUMBER,
USERNAME VARCHAR2(30),T_BUFFER_GETS NUMBER,T_DISK_READS NUMBER,
T_EXECUTIONS NUMBER,T_BG_PER_EXEC NUMBER,T_DR_PER_EXEC NUMBER) NOLOGGING;
INSERT INTO COE_SQLAREA
SELECT ROWNUM,
HASH_VALUE,
ADDRESS,
ABS(BUFFER_GETS),
ABS(DISK_READS),
ABS(EXECUTIONS),
ROUND(ABS(BUFFER_GETS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS))),
ROUND(ABS(DISK_READS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS))),
PARSING_USER_ID,
MODULE,
ACTION,
SUBSTR(SQL_TEXT,1,64),
ROUND(ABS(BUFFER_GETS)*100/:v_buffer_gets,3),
ROUND(ABS(DISK_READS)*100/:v_disk_reads,3),
ROUND(ABS(EXECUTIONS)*100/:v_executions,3),
ROUND((ABS(BUFFER_GETS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS)))*100/
:v_bg_per_exec,3),
ROUND((ABS(DISK_READS)/
DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS)))*100/
:v_dr_per_exec,3),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
FROM V$SQLAREA
WHERE
-- PARSING_USER_ID <> 0 AND
(ABS(BUFFER_GETS)
> TO_NUMBER('&&p_factor_th')*:v_buffer_gets
OR ABS(DISK_READS)
> TO_NUMBER('&&p_factor_th')*:v_disk_reads
OR ABS(EXECUTIONS)
> TO_NUMBER('&&p_factor_th')*:v_executions
OR ABS(BUFFER_GETS)/DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS))
> TO_NUMBER('&&p_factor_th')*:v_bg_per_exec
OR ABS(DISK_READS)/DECODE(NVL(ABS(EXECUTIONS),0),0,1,ABS(EXECUTIONS))
> TO_NUMBER('&&p_factor_th')*:v_dr_per_exec);
UPDATE COE_SQLAREA CS
SET USERNAME = (SELECT USERNAME
FROM ALL_USERS
WHERE USER_ID=CS.PARSING_USER_ID);
SET term on;
PROMPT Calculating Top &&p_top SQL per category...
SET term off;
DECLARE
c_top NUMBER;
c_rownum NUMBER;
cursor C1 is
SELECT ROW_NUM
FROM COE_SQLAREA
ORDER BY BUFFER_GETS DESC;
cursor C2 is
SELECT ROW_NUM
FROM COE_SQLAREA
ORDER BY DISK_READS DESC;
cursor C3 is
SELECT ROW_NUM
FROM COE_SQLAREA
ORDER BY EXECUTIONS DESC;
cursor C4 is
SELECT ROW_NUM
FROM COE_SQLAREA
ORDER BY BG_PER_EXEC DESC;
cursor C5 is
SELECT ROW_NUM
FROM COE_SQLAREA
ORDER BY DR_PER_EXEC DESC;
BEGIN
c_top := 1;
OPEN C1;
LOOP
FETCH C1 into c_rownum;
EXIT when C1%NOTFOUND;
EXIT when c_top = TO_NUMBER('&&p_top')+1;
UPDATE COE_SQLAREA
SET T_BUFFER_GETS = c_top
WHERE ROW_NUM = c_rownum
AND BUFFER_GETS > TO_NUMBER('&&p_factor_th')*:v_buffer_gets;
c_top := c_top+1;
END LOOP;
c_top := 1;
OPEN C2;
LOOP
FETCH C2 into c_rownum;
EXIT when C2%NOTFOUND;
EXIT when c_top = TO_NUMBER('&&p_top')+1;
UPDATE COE_SQLAREA
SET T_DISK_READS = c_top
WHERE ROW_NUM = c_rownum
AND DISK_READS > TO_NUMBER('&&p_factor_th')*:v_disk_reads;
c_top := c_top+1;
END LOOP;
c_top := 1;
OPEN C3;
LOOP
FETCH C3 into c_rownum;
EXIT when C3%NOTFOUND;
EXIT when c_top = TO_NUMBER('&&p_top')+1;
UPDATE COE_SQLAREA
SET T_EXECUTIONS = c_top
WHERE ROW_NUM = c_rownum
AND EXECUTIONS > TO_NUMBER('&&p_factor_th')*:v_executions;
c_top := c_top+1;
END LOOP;
c_top := 1;
OPEN C4;
LOOP
FETCH C4 into c_rownum;
EXIT when C4%NOTFOUND;
EXIT when c_top = TO_NUMBER('&&p_top')+1;
UPDATE COE_SQLAREA
SET T_BG_PER_EXEC = c_top
WHERE ROW_NUM = c_rownum
AND BUFFER_GETS/DECODE(NVL(EXECUTIONS,0),0,1,EXECUTIONS)
> TO_NUMBER('&&p_factor_th')*:v_bg_per_exec;
c_top := c_top+1;
END LOOP;
c_top := 1;
OPEN C5;
LOOP
FETCH C5 into c_rownum;
EXIT when C5%NOTFOUND;
EXIT when c_top = TO_NUMBER('&&p_top')+1;
UPDATE COE_SQLAREA
SET T_DR_PER_EXEC = c_top
WHERE ROW_NUM = c_rownum
AND DISK_READS/DECODE(NVL(EXECUTIONS,0),0,1,EXECUTIONS)
> TO_NUMBER('&&p_factor_th')*:v_dr_per_exec;
c_top := c_top+1;
END LOOP;
END;
/
UPDATE COE_SQLAREA CS
SET CS.ROW_NUM = ROWNUM
WHERE ( CS.T_BUFFER_GETS < TO_NUMBER('&&p_top')+1 OR
CS.T_DISK_READS < TO_NUMBER('&&p_top')+1 OR
CS.T_EXECUTIONS < TO_NUMBER('&&p_top')+1 OR
CS.T_BG_PER_EXEC < TO_NUMBER('&&p_top')+1 OR
CS.T_DR_PER_EXEC < TO_NUMBER('&&p_top')+1 );
COLUMN NAMESPACE FORMAT A15 HEADING 'Component';
COLUMN GETS FORMAT 999,999,999,999 HEADING 'Get Requests';
COLUMN GETHITRATIO FORMAT 999.9 HEADING 'Get|Hit|Ratio|Pct';
COLUMN PINS FORMAT 999,999,999,999 HEADING 'Pin Requests';
COLUMN PINHITRATIO FORMAT 999.9 HEADING 'Pin|Hit|Ratio|Pct';
COLUMN RELOADS FORMAT 999,999,999,999 HEADING 'Reloads'
COLUMN PINRELOADRATIO FORMAT 999.9 HEADING 'Pin|Reload|Ratio|Pct';
COLUMN INVALIDATIONS FORMAT 999,999,999,999 HEADING 'Invalidations';
COLUMN POOL_NAME FORMAT A20 HEADING 'SGA Structure';
COLUMN POOL_BYTES FORMAT 99,999,999,999 HEADING 'Size in Bytes';
COLUMN POOL_MBYTES FORMAT 99,999.9 HEADING 'Size in MB';
COLUMN SQL_COUNT FORMAT 999,999,999 HEADING 'SQL Count';
COLUMN S_BUFFER_GETS FORMAT 999,999,999,999 -
HEADING '(A)|SQL Area Sum of|Logical Reads|(Buffer Gets)';
COLUMN S_DISK_READS FORMAT 999,999,999,999 -
HEADING '(B)|SQL Area Sum of|Physical Reads|(Disk Reads)';
COLUMN S_EXECUTIONS FORMAT 999,999,999,999 -
HEADING '(C)|SQL Area Sum of|Number of|Executions';
COLUMN S_BG_PER_EXEC FORMAT 999,999,999,999 -
HEADING '(D)|SQL Area Sum of|Logical Reads|per Execution';
COLUMN S_DR_PER_EXEC FORMAT 999,999,999,999 -
HEADING '(E)|SQL Area Sum of|Physical Reads|per Execution';
COLUMN DATE_TIME FORMAT A15 HEADING 'Execution|Date and Time';
COLUMN ISTARTUP FORMAT A15 HEADING 'Instance|Startup';
COLUMN T_BUFFER_GETS FORMAT 9999 HEADING 'Top|LR';
COLUMN T_DISK_READS FORMAT 9999 HEADING 'Top|PR';
COLUMN T_EXECUTIONS FORMAT 9999 HEADING 'Top|Exec';
COLUMN T_BG_PER_EXEC FORMAT 9999 HEADING 'Top|LR|per|Exec';
COLUMN T_DR_PER_EXEC FORMAT 9999 HEADING 'Top|PR|per|Exec';
COLUMN BUFFER_GETS FORMAT 99,999,999,999 -
HEADING '(F)|Logical Reads|(Buffer Gets)';
COLUMN DISK_READS FORMAT 99,999,999,999 -
HEADING '(G)|Physical Reads|(Disk Reads)';
COLUMN EXECUTIONS FORMAT 99,999,999,999 -
HEADING '(H)|Number of|Executions';
COLUMN BG_PER_EXEC FORMAT 99,999,999,999 -
HEADING '(I)|Logical Reads|per Execution';
COLUMN DR_PER_EXEC FORMAT 99,999,999,999 -
HEADING '(J)|Physical Reads|per Execution';
COLUMN P_BUFFER_GETS FORMAT 999.999 -
HEADING 'LR(*)|percent|(F/A)';
COLUMN P_DISK_READS FORMAT 999.999 -
HEADING 'PR(*)|percent|(G/B)';
COLUMN P_EXECUTIONS FORMAT 999.999 -
HEADING 'Exec(*)|percent|(H/C)';
COLUMN P_BG_PER_EXEC FORMAT 999.999 -
HEADING 'LR(*)|per Exe|percent|(I/D)';
COLUMN P_DR_PER_EXEC FORMAT 999.999 -
HEADING 'PR(*)|per Exe|percent|(J/E)';
COLUMN ROW_NUM FORMAT 999999 HEADING 'SQL ID';
COLUMN USERNAME FORMAT A10 HEADING 'User';
COLUMN MODULE_ACTION FORMAT A40 HEADING 'Source (Module and Action)';
COLUMN SQL_TEXT_L1 FORMAT A64 HEADING 'SQL Text (first 64 bytes)';
COLUMN SQL_TEXT FORMAT A64 HEADING 'SQL Text';
COLUMN HASH_VALUE FORMAT 999999999999999 HEADING 'Hash Value';
COLUMN PIECE NOPRINT;
COLUMN DUMMY NOPRINT;
SET term on;
PROMPT Generating SPOOL file...
PROMPT
PROMPT
SET term off;
SET term on pages 10000 lines 156;
SPOOL coe_sqlarea_80.txt;
PROMPT Library Cache statistics for SQL and PL/SQL
PROMPT ===========================================
SELECT NAMESPACE,
GETS,
ROUND(GETHITRATIO*100,1) GETHITRATIO,
PINS,
ROUND(PINHITRATIO*100,1) PINHITRATIO,
RELOADS,
ROUND((PINS-RELOADS)*100/DECODE(NVL(PINS,0),0,1,PINS),1) PINRELOADRATIO,
INVALIDATIONS
FROM V$LIBRARYCACHE
WHERE NAMESPACE IN ('SQL AREA',
'TABLE/PROCEDURE',
'BODY',
'TRIGGER');
PROMPT
PROMPT
PROMPT Related Shared Pool SGA Structures
PROMPT ==================================
SELECT NAME POOL_NAME,
BYTES POOL_BYTES,
ROUND(BYTES/1048576,1) POOL_MBYTES
FROM V$SGASTAT
WHERE POOL = 'shared pool'
AND NAME IN ('free memory',
'sessions',
'dictionary cache',
'library cache',
'sql area')
UNION ALL
SELECT 'Shared Pool Reserved',
TO_NUMBER(VALUE),
ROUND(TO_NUMBER(VALUE)/1048576,1)
FROM V$PARAMETER
WHERE NAME = 'shared_pool_reserved_size'
UNION ALL
SELECT 'Total Shared Pool',
TO_NUMBER(VALUE),
ROUND(TO_NUMBER(VALUE)/1048576,1)
FROM V$PARAMETER
WHERE NAME = 'shared_pool_size';
PROMPT
PROMPT
PROMPT SQL Area grand totals per category
PROMPT ==================================
SELECT :v_count SQL_COUNT,
:v_buffer_gets S_BUFFER_GETS,
:v_disk_reads S_DISK_READS,
:v_executions S_EXECUTIONS,
:v_bg_per_exec S_BG_PER_EXEC,
:v_dr_per_exec S_DR_PER_EXEC,
TO_CHAR(SYSDATE,'DD-MON-YY HH24:MI') DATE_TIME,
:v_istartup ISTARTUP
FROM DUAL;
PROMPT
PROMPT
PROMPT Top &&p_top most expensive SQL Statements per category
PROMPT =================================================
BREAK ON DUMMY;
COMPUTE SUM OF BUFFER_GETS P_BUFFER_GETS ON DUMMY;
SELECT NULL DUMMY,
T_BUFFER_GETS,
ROW_NUM,
BUFFER_GETS,
P_BUFFER_GETS,
SUBSTR(USERNAME,1,10) USERNAME,
SUBSTR(MODULE||' '||ACTION,1,40) MODULE_ACTION,
SQL_TEXT SQL_TEXT_L1
FROM COE_SQLAREA
WHERE T_BUFFER_GETS < TO_NUMBER('&&p_top')+1
ORDER BY T_BUFFER_GETS;
COMPUTE SUM OF DISK_READS P_DISK_READS ON DUMMY;
SELECT NULL DUMMY,
T_DISK_READS,
ROW_NUM,
DISK_READS,
P_DISK_READS,
SUBSTR(USERNAME,1,10) USERNAME,
SUBSTR(MODULE||' '||ACTION,1,40) MODULE_ACTION,
SQL_TEXT SQL_TEXT_L1
FROM COE_SQLAREA
WHERE T_DISK_READS < TO_NUMBER('&&p_top')+1
ORDER BY T_DISK_READS;
COMPUTE SUM OF EXECUTIONS P_EXECUTIONS ON DUMMY;
SELECT NULL DUMMY,
T_EXECUTIONS,
ROW_NUM,
EXECUTIONS,
P_EXECUTIONS,
SUBSTR(USERNAME,1,10) USERNAME,
SUBSTR(MODULE||' '||ACTION,1,40) MODULE_ACTION,
SQL_TEXT SQL_TEXT_L1
FROM COE_SQLAREA
WHERE T_EXECUTIONS < TO_NUMBER('&&p_top')+1
ORDER BY T_EXECUTIONS;
COMPUTE SUM OF BG_PER_EXEC P_BG_PER_EXEC ON DUMMY;
SELECT NULL DUMMY,
T_BG_PER_EXEC,
ROW_NUM,
BG_PER_EXEC,
P_BG_PER_EXEC,
SUBSTR(USERNAME,1,10) USERNAME,
SUBSTR(MODULE||' '||ACTION,1,40) MODULE_ACTION,
SQL_TEXT SQL_TEXT_L1
FROM COE_SQLAREA
WHERE T_BG_PER_EXEC < TO_NUMBER('&&p_top')+1
ORDER BY T_BG_PER_EXEC;
COMPUTE SUM OF DR_PER_EXEC P_DR_PER_EXEC ON DUMMY;
SELECT NULL DUMMY,
T_DR_PER_EXEC,
ROW_NUM,
DR_PER_EXEC,
P_DR_PER_EXEC,
SUBSTR(USERNAME,1,10) USERNAME,
SUBSTR(MODULE||' '||ACTION,1,40) MODULE_ACTION,
SQL_TEXT SQL_TEXT_L1
FROM COE_SQLAREA
WHERE T_DR_PER_EXEC < TO_NUMBER('&&p_top')+1
ORDER BY T_DR_PER_EXEC;
PROMPT
PROMPT Note(*): Percentage of grand total for SQL Area, per resource category
PROMPT
PROMPT
PROMPT Summary of SQL Statements on the 5 Top &&p_top lists
PROMPT ===============================================
BREAK ON DUMMY;
COMPUTE SUM OF BUFFER_GETS P_BUFFER_GETS DISK_READS P_DISK_READS -
EXECUTIONS P_EXECUTIONS BG_PER_EXEC P_BG_PER_EXEC -
DR_PER_EXEC P_DR_PER_EXEC ON DUMMY;
SELECT NULL DUMMY,
CS.ROW_NUM,
CS.BUFFER_GETS,
CS.P_BUFFER_GETS,
CS.DISK_READS,
CS.P_DISK_READS,
CS.EXECUTIONS,
CS.P_EXECUTIONS,
CS.BG_PER_EXEC,
CS.P_BG_PER_EXEC,
CS.DR_PER_EXEC,
CS.P_DR_PER_EXEC
FROM COE_SQLAREA CS
WHERE ( CS.T_BUFFER_GETS < TO_NUMBER('&&p_top')+1 OR
CS.T_DISK_READS < TO_NUMBER('&&p_top')+1 OR
CS.T_EXECUTIONS < TO_NUMBER('&&p_top')+1 OR
CS.T_BG_PER_EXEC < TO_NUMBER('&&p_top')+1 OR
CS.T_DR_PER_EXEC < TO_NUMBER('&&p_top')+1 )
ORDER BY CS.ROW_NUM;
PROMPT
PROMPT Note(*): Percentage of grand total for SQL Area, per resource category
PROMPT
SELECT CS.ROW_NUM,
CS.T_BUFFER_GETS,
CS.T_DISK_READS,
CS.T_EXECUTIONS,
CS.T_BG_PER_EXEC,
CS.T_DR_PER_EXEC,
CS.HASH_VALUE,
SUBSTR(CS.USERNAME,1,10) USERNAME,
SUBSTR(CS.MODULE||' '||CS.ACTION,1,40) MODULE_ACTION
FROM COE_SQLAREA CS
WHERE ( CS.T_BUFFER_GETS < TO_NUMBER('&&p_top')+1 OR
CS.T_DISK_READS < TO_NUMBER('&&p_top')+1 OR
CS.T_EXECUTIONS < TO_NUMBER('&&p_top')+1 OR
CS.T_BG_PER_EXEC < TO_NUMBER('&&p_top')+1 OR
CS.T_DR_PER_EXEC < TO_NUMBER('&&p_top')+1 )
ORDER BY CS.ROW_NUM;
PROMPT
PROMPT
PROMPT Full text of identified expensive SQL Statements ordered by SQL ID
PROMPT ==================================================================
BREAK ON ROW_NUM SKIP 1 ON T_BUFFER_GETS ON T_DISK_READS -
ON T_EXECUTIONS ON T_BG_PER_EXEC ON T_DR_PER_EXEC -
ON USERNAME ON MODULE_ACTION;
SELECT CS.ROW_NUM,
ST.PIECE,
ST.SQL_TEXT,
CS.T_BUFFER_GETS,
CS.T_DISK_READS,
CS.T_EXECUTIONS,
CS.T_BG_PER_EXEC,
CS.T_DR_PER_EXEC,
SUBSTR(CS.USERNAME,1,10) USERNAME,
SUBSTR(CS.MODULE||' '||CS.ACTION,1,40) MODULE_ACTION
FROM COE_SQLAREA CS,
V$SQLTEXT ST
WHERE
CS.HASH_VALUE = ST.HASH_VALUE
AND CS.ADDRESS = ST.ADDRESS
AND ( CS.T_BUFFER_GETS < TO_NUMBER('&&p_top')+1 OR
CS.T_DISK_READS < TO_NUMBER('&&p_top')+1 OR
CS.T_EXECUTIONS < TO_NUMBER('&&p_top')+1 OR
CS.T_BG_PER_EXEC < TO_NUMBER('&&p_top')+1 OR
CS.T_DR_PER_EXEC < TO_NUMBER('&&p_top')+1 )
ORDER BY CS.ROW_NUM, ST.PIECE;
PROMPT coe_sqlarea_80.txt has been generated.
PROMPT
PROMPT Recover the coe_sqlarea_80.txt spool file, compress into file
PROMPT coesqlarea.zip and send/upload the resulting coesqlarea.zip file for
PROMPT further analysis.
PROMPT
PROMPT If you wish to print the spool file nicely, open it in Wordpad or Word.
PROMPT Use File -> Page Setup (menu option) to change Orientation to Landscape.
PROMPT Using same menu option make all 4 Margins 0.2". Exit this menu option.
PROMPT Do a 'Select All' (Ctrl+A) and change Font to 'Courier New' Size 8.
PROMPT
SPOOL off;
UNDEFINE p_top,p_factor_th;
SET ver on feed on trims off long 80 pages 24 lin 80 feed on;
SET sqlp SQL> sqln on;