2026-03-12 20:23:15

This commit is contained in:
root
2026-03-12 21:23:47 +01:00
parent eab4b36eca
commit 93039b8489
3332 changed files with 699614 additions and 0 deletions

33
tpt/awr/awr_evh.sql Normal file
View File

@@ -0,0 +1,33 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
BREAK ON snap_begin SKIP 1 ON snap_end ON event_name
COL event_name FOR A40
SELECT
CAST(begin_interval_time AS DATE) snap_begin
, TO_CHAR(CAST(end_interval_time AS DATE), 'HH24:MI') snap_end
, event_name
, wait_time_milli
, CASE WHEN wait_count >= LAG(wait_count) OVER (PARTITION BY event_name,wait_time_milli ORDER BY CAST(begin_interval_time AS DATE)) THEN
wait_count - LAG(wait_count) OVER (PARTITION BY event_name,wait_time_milli ORDER BY CAST(begin_interval_time AS DATE))
ELSE
wait_count
END wait_count
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_event_histogram
WHERE
begin_interval_time > SYSDATE - 1/24
--AND event_name LIKE 'ASM file metadata operation'
--AND event_name LIKE 'flashback log switch'
-- AND event_name LIKE 'KSV master wait'
AND wait_class = 'User I/O'
ORDER BY
event_name
, snap_begin
, wait_time_milli
/

16
tpt/awr/awr_last.sql Normal file
View File

@@ -0,0 +1,16 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
VAR dbid NUMBER
VAR inst_num NUMBER
VAR eid NUMBER
VAR bid NUMBER
BEGIN
SELECT dbid, USERENV('instance') INTO :dbid, :inst_num FROM v$database;
SELECT MAX(snap_id) INTO :eid FROM dba_hist_snapshot WHERE dbid = :dbid AND instance_number = :inst_num;
SELECT MAX(snap_id) INTO :bid FROM dba_hist_snapshot WHERE dbid = :dbid AND instance_number = :inst_num AND snap_id < :eid;
END;
/
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(:dbid, :inst_num, :bid, :eid));

22
tpt/awr/awr_lasth.sql Normal file
View File

@@ -0,0 +1,22 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
VAR dbid NUMBER
VAR inst_num NUMBER
VAR eid NUMBER
VAR bid NUMBER
BEGIN
SELECT dbid, USERENV('instance') INTO :dbid, :inst_num FROM v$database;
SELECT MAX(snap_id) INTO :eid FROM dba_hist_snapshot WHERE dbid = :dbid AND instance_number = :inst_num;
SELECT MAX(snap_id) INTO :bid FROM dba_hist_snapshot WHERE dbid = :dbid AND instance_number = :inst_num AND snap_id < :eid;
END;
/
SET TERMOUT OFF PAGESIZE 0
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(:dbid, :inst_num, :bid, :eid))
.
SPOOL /tmp/awr_tmp.html
/
SPOOL OFF
SET TERMOUT ON PAGESIZE 5000

View File

@@ -0,0 +1,19 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SELECT
CAST(begin_interval_time AS DATE) begin_time
, AVG(CASE WHEN event_name = 'log file sync' THEN time_waited_micro/nullif(total_waits,0) END) avg_log_file_sync
, AVG(CASE WHEN event_name = 'log file parallel write' THEN time_waited_micro/nullif(total_waits,0) END) avg_log_file_parallel_write
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_system_event
WHERE
event_name IN ('log file sync', 'log file parallel write')
AND begin_interval_time > SYSDATE - 15
GROUP BY CAST(begin_interval_time AS DATE)
ORDER BY
begin_time
/

View File

@@ -0,0 +1,31 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
COL begin_interval_time FOR A30
COL end_interval_time FOR A30
COL stat_name FOR A50
SELECT
TO_CHAR(end_interval_time, 'YYYY-MM-DD HH24:MI:SS') snap_end_time
, component
, oper_type
, TO_CHAR(start_time, 'YYYY-MM-DD HH24:MI:SS') start_time
, TO_CHAR(end_time, 'YYYY-MM-DD HH24:MI:SS') end_time
, target_size
, oper_mode
, parameter
, initial_size
, final_size
, status
FROM
dba_hist_memory_resize_ops
NATURAL JOIN
dba_hist_snapshot
WHERE
begin_interval_time >= &1
AND end_interval_time <= &2
ORDER BY
snap_end_time
/

26
tpt/awr/awr_procmem.sql Normal file
View File

@@ -0,0 +1,26 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
BREAK ON snap_begin SKIP 1 ON snap_end ON event_name
COL event_name FOR A40
SELECT
CAST(begin_interval_time AS DATE) snap_begin
, TO_CHAR(CAST(end_interval_time AS DATE), 'HH24:MI') snap_end
, category
, num_processes
, ROUND(allocated_max/1048576) max_mb
, ROUND(max_allocated_max/1048576) max_max_mb
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_process_mem_summary
WHERE
begin_interval_time > SYSDATE - 3
--AND category = 'SQL'
ORDER BY
snap_begin
, category
/

12
tpt/awr/awr_sqlid.sql Normal file
View File

@@ -0,0 +1,12 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
COL sql_text FOR A200 WORD_WRAP
SELECT
*
FROM
dba_hist_sqltext
WHERE
sql_id = '&1'
/

View File

@@ -0,0 +1,47 @@
-- Copyright 2023 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
-- awr_sqlid_binds.sql v0.1
COL binds_begin_time FOR A25
COL binds_instance_number HEAD INST FOR 9999
COL binds_name HEAD NAME FOR A15
COL binds_value_string HEAD VALUE_STRING FOR A100 WRAP
COL binds_position HEAD POS FOR 9999
COL binds_dup_position HEAD DPOS FOR 9999
SELECT
sn.begin_interval_time binds_begin_time
, sn.dbid
, sn.instance_number binds_instance_number
, sb.sql_id
, sb.name binds_name
, sb.position binds_position
, sb.dup_position binds_dup_position
, sb.datatype_string
-- , sb.character_sid
-- , sb.precision
-- , sb.scale
, sb.was_captured
, sb.last_captured
, sb.value_string binds_value_string
FROM
dba_hist_snapshot sn
, dba_hist_sqlbind sb
WHERE
sn.snap_id = sb.snap_id
AND sn.dbid = sb.dbid
AND sn.instance_number = sb.instance_number
AND sb.sql_id = '&1'
AND &2
AND begin_interval_time >= &3
AND end_interval_time <= &4
ORDER BY
sn.begin_interval_time
, sn.dbid
, sn.instance_number
, sb.sql_id
, sb.name
, sb.position
/

55
tpt/awr/awr_sqlstats.sql Normal file
View File

@@ -0,0 +1,55 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SET TERMOUT OFF pagesize 5000 tab off verify off linesize 999 trimspool on trimout on null ""
SET TERMOUT ON
COL exec_per_sec FOR 99999990
COL ela_ms_per_sec FOR 99999990
COL rows_per_sec FOR 99999990
COL lios_per_sec FOR 99999990
COL blkrd_per_sec FOR 99999990
COL cpu_ms_per_sec FOR 99999990
COL iow_ms_per_sec FOR 99999990
COL clw_ms_per_sec FOR 99999990
COL apw_ms_per_sec FOR 99999990
COL ccw_ms_per_sec FOR 99999990
SELECT
CAST(begin_interval_time AS DATE) begin_interval_time
, sql_id
, plan_hash_value
, ROUND(SUM(executions_delta ) / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) exec_per_sec
, ROUND(SUM(elapsed_time_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) ela_ms_per_sec
, ROUND(SUM(rows_processed_delta) / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) rows_per_sec
, ROUND(SUM(buffer_gets_delta ) / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) lios_per_sec
, ROUND(SUM(disk_reads_delta ) / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) blkrd_per_sec
, ROUND(SUM(cpu_time_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) cpu_ms_per_sec
, ROUND(SUM(iowait_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) iow_ms_per_sec
, ROUND(SUM(clwait_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) clw_ms_per_sec
, ROUND(SUM(apwait_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) apw_ms_per_sec
, ROUND(SUM(ccwait_delta ) / 1000 / ((CAST(end_interval_time AS DATE) - CAST(begin_interval_time AS DATE)) * 86400), 1) ccw_ms_per_sec
FROM
dba_hist_snapshot sn
, dba_hist_sqlstat st
WHERE
sn.snap_id = st.snap_id
AND sn.dbid = st.dbid
AND sn.instance_number = st.instance_number
AND sql_id = '&1'
AND plan_hash_value LIKE '&2'
AND begin_interval_time >= &3
AND end_interval_time <= &4
GROUP BY
CAST(begin_interval_time AS DATE)
, CAST(end_interval_time AS DATE)
, sql_id
, plan_hash_value
ORDER BY
begin_interval_time
, sql_id
, plan_hash_value
/

View File

@@ -0,0 +1,73 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
-- awr_sqlstats_per_exec v1.01
SET TERMOUT OFF pagesize 5000 tab off verify off linesize 999 trimspool on trimout on null ""
SET TERMOUT ON
COL executions FOR 99999990
COL ela_ms_per_exec FOR 99999990
COL rows_per_exec FOR 99999990.0
COL lios_per_exec FOR 99999990
COL blkrd_per_exec FOR 99999990
COL cpu_ms_per_exec FOR 99999990
COL iow_ms_per_exec FOR 99999990
COL avg_iow_ms FOR 99999990.0
COL clw_ms_per_exec FOR 99999990
COL apw_ms_per_exec FOR 99999990
COL ccw_ms_per_exec FOR 99999990
-- You can configure output column precision here
-- COL executions FOR 99999990.0
-- COL ela_ms_per_exec FOR 99999990.0
-- COL rows_per_exec FOR 99999990.0
-- COL lios_per_exec FOR 99999990.0
-- COL blkrd_per_exec FOR 99999990.0
-- COL cpu_ms_per_exec FOR 99999990.0
-- COL iow_ms_per_exec FOR 99999990.0
-- COL avg_iow_ms FOR 99999990.0
-- COL clw_ms_per_exec FOR 99999990.0
-- COL apw_ms_per_exec FOR 99999990.0
-- COL ccw_ms_per_exec FOR 99999990.0
SELECT
CAST(begin_interval_time AS DATE) begin_interval_time
, sql_id
, plan_hash_value
, SUM(executions_delta) executions
, ROUND(SUM(elapsed_time_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) ela_ms_per_exec
, ROUND(SUM(cpu_time_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) cpu_ms_per_exec
, ROUND(SUM(rows_processed_delta) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta)),1) rows_per_exec
, ROUND(SUM(buffer_gets_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta)),1) lios_per_exec
, ROUND(SUM(disk_reads_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta)),1) blkrd_per_exec
, ROUND(SUM(iowait_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) iow_ms_per_exec
, ROUND(SUM(iowait_delta ) / DECODE(SUM(physical_read_requests_delta)+SUM(physical_write_requests_delta),0,1
,SUM(physical_read_requests_delta)+SUM(physical_write_requests_delta))/1000,1) avg_iow_ms
, ROUND(SUM(clwait_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) clw_ms_per_exec
, ROUND(SUM(apwait_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) apw_ms_per_exec
, ROUND(SUM(ccwait_delta ) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta))/1000) ccw_ms_per_exec
-- , ROUND(SUM(elapsed_time_delta - cpu_time_delta - iowait_delta - clwait_delta - apwait_delta - ccwait_delta) / DECODE(SUM(executions_delta),0,1,SUM(executions_delta)) / 1000, 1) oth_ms_per_exec
FROM
dba_hist_snapshot sn
, dba_hist_sqlstat st
WHERE
sn.snap_id = st.snap_id
AND sn.dbid = st.dbid
AND sn.instance_number = st.instance_number
AND sql_id = '&1'
AND plan_hash_value LIKE '&2'
AND begin_interval_time >= &3
AND end_interval_time <= &4
AND (elapsed_time_delta != 0 AND cpu_time_delta != 0)
GROUP BY
CAST(begin_interval_time AS DATE)
, sql_id
, plan_hash_value
ORDER BY
begin_interval_time
, sql_id
, plan_hash_value
/

View File

@@ -0,0 +1,102 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
-- @awr/awr_sqlstats_unstable.sql version 0.1 BETA by Tanel Poder
--
-- detect sql_id that use a varying amount of *elapsed time per execution* across different plan hash values
-- or across AWR time ranges
--
-- usage examples:
-- a) typical use - show SQL_IDs from last 2 weeks that have different plans with different
-- elapsed time per execution (per plan)
--
-- @awr/awr_sqlstats_unstable sql_id plan_hash_value sysdate-14 sysdate
--
-- b) special case use with SQL using literals (note that AWR may not persist many of these queries)
-- as due to literals these tend to be executed only once
--
-- @awr/awr_sqlstats_unstable force_matching_signature plan_hash_value sysdate-14 sysdate
--
-- c) advanced use - show cases where *the same plan* (same plan hash value) uses different amounts
-- of elapsed time per execution over time. so it's not a *plan* flipping problem
--
-- @awr/awr_sqlstats_unstable sql_id,plan_hash_value begin_interval_time sysdate-14 sysdate
--
-- Once you have found a SQL_ID of interest, you can drill down into its actual plans and elapsed times using:
--
-- @awr/awr_sqlstats_per_exec &sqlid % sysdate-14 sysdate
--
--
-- other:
-- Inspired by Kerry Osborne's unstable_plans.sql script - http://kerryosborne.oracle-guy.com/2008/10/unstable-plans/
--
SET TERMOUT OFF pagesize 5000 tab off verify off linesize 999 trimspool on trimout on null ""
SET TERMOUT ON
COL force_matching_signature FOR 99999999999999999999
WITH metrics AS(
SELECT
&1
, MIN(CAST(begin_interval_time AS DATE)) first_seen
, MAX(CAST(end_interval_time AS DATE)) last_seen
, SUM(executions_delta) executions
, ROUND(SUM(elapsed_time_delta ) / CASE WHEN SUM(executions_delta) = 0 THEN 1 ELSE SUM(executions_delta) END) ela_us_per_exec
, ROUND(SUM(cpu_time_delta ) / NULLIF(SUM(executions_delta),0)) cpu_us_per_exec
, ROUND(SUM(rows_processed_delta) / NULLIF(SUM(executions_delta),0),1) rows_per_exec
, ROUND(SUM(buffer_gets_delta ) / NULLIF(SUM(executions_delta),0),1) lios_per_exec
, ROUND(SUM(disk_reads_delta ) / NULLIF(SUM(executions_delta),0),1) blkrd_per_exec
, ROUND(SUM(iowait_delta ) / NULLIF(SUM(executions_delta),0)) iow_us_per_exec
, ROUND(SUM(iowait_delta ) / NULLIF(SUM(physical_read_requests_delta)+SUM(physical_write_requests_delta),0),1) avg_iow_us
, ROUND(SUM(clwait_delta ) / NULLIF(SUM(executions_delta),0)) clw_us_per_exec
, ROUND(SUM(apwait_delta ) / NULLIF(SUM(executions_delta),0)) apw_us_per_exec
, ROUND(SUM(ccwait_delta ) / NULLIF(SUM(executions_delta),0)) ccw_us_per_exec
FROM
dba_hist_snapshot sn
, dba_hist_sqlstat st
WHERE
-- join conditions
sn.snap_id = st.snap_id
AND sn.dbid = st.dbid
AND sn.instance_number = st.instance_number
-- filter conditions
AND executions_delta > 0
AND begin_interval_time >= &3
AND end_interval_time <= &4
GROUP BY
&1, &2
)
, sq AS (
SELECT
&1
, executions
, ela_us_per_exec
, STDDEV(ela_us_per_exec) OVER (PARTITION BY &1) ela_us_stddev
FROM
metrics
), norm AS (
SELECT
&1
, SUM(executions) total_executions
, MIN(ela_us_per_exec) / 1000000 min_s_per_exec
, MAX(ela_us_per_exec) / 1000000 max_s_per_exec
, ela_us_stddev / MIN(ela_us_per_exec) ela_norm_stddev
, ela_us_stddev / 1000000 seconds_stddev
FROM
sq
GROUP BY
&1
, ela_us_stddev
)
SELECT
*
FROM
norm
WHERE
ela_norm_stddev > 3
AND max_s_per_exec > 1 -- avoid reporting very short queries
ORDER BY
ela_norm_stddev DESC
/

View File

@@ -0,0 +1,24 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SELECT
-- CAST(begin_interval_time AS DATE) begin_time
begin_time
, metric_name
, metric_unit
, value
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_sysmetric_history
WHERE
metric_name LIKE '&1'
-- metric_name IN ('Physical Reads Per Sec')
-- metric_name IN ('Host CPU Utilization (%)')
-- metric_name IN ('Logons Per Sec')
AND begin_interval_time > SYSDATE - 1
ORDER BY
metric_name
, begin_time
/

View File

@@ -0,0 +1,25 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SELECT
-- CAST(begin_interval_time AS DATE) begin_time
begin_time
, metric_name
, metric_unit
, average / 100
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_sysmetric_summary
WHERE
-- metric_name IN ('User Commits Per Sec', 'User Transaction Per Sec')
-- metric_name IN ('Physical Read IO Requests Per Sec', 'Physical Write IO Requests Per Sec')
-- metric_name IN ('Host CPU Utilization (%)')
-- metric_name IN ('Logons Per Sec')
REGEXP_LIKE(metric_name, '&1','i')
AND begin_interval_time > SYSDATE - 1
ORDER BY
metric_name
, begin_time
/

26
tpt/awr/awr_sysstat.sql Normal file
View File

@@ -0,0 +1,26 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
COL begin_interval_time FOR A30
COL end_interval_time FOR A30
COL stat_name FOR A50
SELECT * FROM (
SELECT
TO_CHAR(end_interval_time, 'YYYY-MM-DD HH24:MI:SS') snap_end_time
, stat_name
, CASE WHEN value - LAG(value) OVER (PARTITION BY stat_name ORDER BY begin_interval_time) < 0 THEN value ELSE value - LAG(value) OVER (PARTITION BY stat_name ORDER BY begin_interval_time) END value
FROM
dba_hist_sysstat
NATURAL JOIN
dba_hist_snapshot
WHERE
REGEXP_LIKE(stat_name, '&1', 'i')
AND begin_interval_time >= &2
AND end_interval_time <= &3
ORDER BY
begin_interval_time, stat_name
)
WHERE value > 0
/

View File

@@ -0,0 +1,23 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SELECT
CAST(begin_interval_time AS DATE) begin_time
, event_name
, time_waited_micro
, total_waits
, total_timeouts
, time_waited_micro/nullif(total_waits,0) avg_wait_micro
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_system_event
WHERE
-- event_name IN ('log file sync', 'log file parallel write', 'ksfd: async disk IO')
event_name LIKE 'SQL*Net vector data%'
AND begin_interval_time > SYSDATE - 5
ORDER BY
event_name
, begin_time
/

View File

@@ -0,0 +1,32 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
CREATE OR REPLACE VIEW sys.t_hist_event_histogram AS
SELECT
SNAP_ID -- NOT NULL NUMBER
, DBID -- NOT NULL NUMBER
, INSTANCE_NUMBER -- NOT NULL NUMBER
, EVENT_ID -- NOT NULL NUMBER
, EVENT_NAME -- NOT NULL VARCHAR2(64)
, WAIT_CLASS_ID -- NUMBER
, WAIT_CLASS -- VARCHAR2(64)
, WAIT_TIME_MILLI -- NOT NULL NUMBER
, WAIT_COUNT -- NUMBER
, CAST(BEGIN_INTERVAL_TIME AS DATE) snapshot_begin_time -- NOT NULL TIMESTAMP(3)
, CAST(END_INTERVAL_TIME AS DATE) snapshot_end_time -- NOT NULL TIMESTAMP(3)
, TO_CHAR(begin_interval_time, 'YYYY') snapshot_begin_year
, TO_CHAR(begin_interval_time, 'MM') snapshot_begin_month_num
, TO_CHAR(begin_interval_time, 'MON') snapshot_begin_mon
, TO_CHAR(begin_interval_time, 'Month') snapshot_begin_month
, TO_CHAR(begin_interval_time, 'DD') snapshot_begin_day
, TO_CHAR(begin_interval_time, 'HH24') snapshot_begin_hour
, TO_CHAR(begin_interval_time, 'MI') snapshot_begin_minute
FROM
dba_hist_snapshot
NATURAL JOIN
dba_hist_event_histogram
/
GRANT SELECT ON sys.t_hist_event_histogram TO PUBLIC;
CREATE PUBLIC SYNONYM t_hist_event_histogram FOR sys.t_hist_event_histogram;

45
tpt/awr/dbload.sql Normal file
View File

@@ -0,0 +1,45 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SET LINES 999 PAGES 5000 TRIMSPOOL ON TRIMOUT ON TAB OFF
COL snap_time FOR A30
SELECT
sn.begin_interval_time snap_time
, ROUND(SUM(CASE WHEN metric_name = 'Average Active Sessions' THEN value END)) aas
, ROUND(AVG(CASE WHEN metric_name = 'Average Synchronous Single-Block Read Latency' THEN value END)) iolat
, ROUND(SUM(CASE WHEN metric_name = 'CPU Usage Per Sec' THEN value END)) cpusec
, ROUND(SUM(CASE WHEN metric_name = 'Background CPU Usage Per Sec' THEN value END)) bgcpusec
, ROUND(AVG(CASE WHEN metric_name = 'DB Block Changes Per Txn' THEN value END)) blkchgtxn
, ROUND(SUM(CASE WHEN metric_name = 'Executions Per Sec' THEN value END)) execsec
, ROUND(SUM(CASE WHEN metric_name = 'Host CPU Usage Per Sec' THEN value END)) oscpusec
, ROUND(SUM(CASE WHEN metric_name = 'I/O Megabytes per Second' THEN value END)) iombsec
, ROUND(SUM(CASE WHEN metric_name = 'I/O Requests per Second' THEN value END)) ioreqsec
, ROUND(AVG(CASE WHEN metric_name = 'Logical Reads Per Txn' THEN value END)) liotxn
, ROUND(SUM(CASE WHEN metric_name = 'Logons Per Sec' THEN value END)) logsec
, ROUND(SUM(CASE WHEN metric_name = 'Network Traffic Volume Per Sec' THEN value END)/1048576) netmbsec
, ROUND(SUM(CASE WHEN metric_name = 'Physical Reads Per Sec' THEN value END)) phyrdsec
, ROUND(AVG(CASE WHEN metric_name = 'Physical Reads Per Txn' THEN value END)) phyrdtxn
, ROUND(SUM(CASE WHEN metric_name = 'Physical Writes Per Sec' THEN value END)) phywrsec
, ROUND(SUM(CASE WHEN metric_name = 'Redo Generated Per Sec' THEN value END)/1024) redokbsec
, ROUND(AVG(CASE WHEN metric_name = 'Redo Generated Per Txn' THEN value END)/1024) redokbtxn
, ROUND(AVG(CASE WHEN metric_name = 'Response Time Per Txn' THEN value END)*10) timemsectxn
, ROUND(AVG(CASE WHEN metric_name = 'SQL Service Response Time' THEN value END)*10) timemseccall
, ROUND(AVG(CASE WHEN metric_name = 'Total Parse Count Per Txn' THEN value END)) prstxn
, ROUND(SUM(CASE WHEN metric_name = 'User Calls Per Sec' THEN value END)) ucallsec
, ROUND(SUM(CASE WHEN metric_name = 'User Transaction Per Sec' THEN value END)) utxnsec
FROM
dba_hist_snapshot sn
, dba_hist_sysmetric_history m
WHERE
sn.snap_id = m.snap_id
AND sn.dbid = m.dbid
AND sn.instance_number = m.instance_number
AND sn.begin_interval_time > SYSDATE - 7
GROUP BY
sn.begin_interval_time
ORDER BY
sn.begin_interval_time
/

72
tpt/awr/dstat.sql Normal file
View File

@@ -0,0 +1,72 @@
-- awr/dstat.sql by Tanel Poder v0.1
PROMPT This is a prototype script v0.2. It does not work correctly
PROMPT RAC and CDB databases yet and other things may change too...
COL AAS HEAD "(#ses)|AAS" FOR 9999.9
COL SBRLATms HEAD "(ms)|SBRLAT" FOR 99.90
COL DBCPU HEAD "(%aCPU)|DBCPU" FOR 99999.90
COL BGCPU HEAD "(%aCPU)|BGCPU" FOR 99999.90
COL OSCPU HEAD "(%aCPU)|OSCPU" FOR 99999.90
COL IOSIZE HEAD "(kB)|IOSIZE" FOR 99999
COL "BLKCHG/tx" HEAD "BLKCHG/tx" FOR 9999999.0
COL "REDOKB/s" HEAD "(kB/s)|REDOKB/s" FOR 9999999.0
COL "NETKB/s" HEAD "(kB/s)|NETKB/s" FOR 9999999.0
COL "IOMB/s" HEAD "(MB/s)|IOMB/s" FOR 999999.0
COL "IOPS" HEAD "IOPS" FOR 99999999
COL "LOGONS/s" HEAD "LOGONS/s" FOR 99999.0
COL "EXECS/s" HEAD "EXECS/s" FOR 999999.0
COL "PARSE/tx" HEAD "PARSE/tx" FOR 9999999.0
COL "UCALLS/s" HEAD "UCALLS/s" FOR 9999999.0
COL "BLKRD/s" HEAD "BLKRD/s" FOR 9999999.0
COL "BLKWR/s" HEAD "BLKWR/s" FOR 9999999.0
COL "REDO/tx" HEAD "(kB)|REDO/tx" FOR 9999999.0
COL "PARSE/tx" HEAD "PARSE/tx" FOR 9999999.0
COL "SQLMS/call" HEAD "(ms)|SQLms/call" FOR 9999999.0
COL "RESPMS/tx" HEAD "(ms)|RESPms/tx" FOR 9999999.0
COL "ENQRQ/tx" HEAD "ENQRQ/tx" FOR 9999999.0
SELECT
begin_time
-- , MAX(ROUND(intsize / 100)) seconds
, ROUND(MAX(CASE WHEN metric_name = 'Average Active Sessions' THEN value END),2) "AAS"
, ROUND(MAX(CASE WHEN metric_name = 'Average Synchronous Single-Block Read Latency' THEN value END),2) "SBRLATms"
, ROUND(MAX(CASE WHEN metric_name = 'CPU Usage Per Sec' THEN value END),2) "DBCPU"
, ROUND(MAX(CASE WHEN metric_name = 'Background CPU Usage Per Sec' THEN value END),2) "BGCPU"
, ROUND(MAX(CASE WHEN metric_name = 'Host CPU Usage Per Sec' THEN value END),2) "OSCPU"
, ROUND(MAX(CASE WHEN metric_name = 'Logons Per Sec' THEN value END),2) "LOGONS/s"
, ROUND(MAX(CASE WHEN metric_name = 'Executions Per Sec' THEN value END),2) "EXECS/s"
, ROUND(MAX(CASE WHEN metric_name = 'I/O Megabytes per Second' THEN value END),2) "IOMB/s"
, ROUND(MAX(CASE WHEN metric_name = 'I/O Requests per Second' THEN value END),2) "IOPS"
, ROUND(SUM(CASE WHEN metric_name = 'I/O Megabytes per Second' THEN value END) * 1024 /
SUM(CASE WHEN metric_name = 'I/O Requests per Second' THEN value END),2) "IOSIZE"
, ROUND(MAX(CASE WHEN metric_name = 'Logical Reads Per Txn' THEN value END)) "LIOs/tx"
, ROUND(MAX(CASE WHEN metric_name = 'DB Block Changes Per Txn' THEN value END),1) "BLKCHG/tx"
, ROUND(MAX(CASE WHEN metric_name = 'User Transaction Per Sec' THEN value END),2) "UTRANS/s"
, ROUND(MAX(CASE WHEN metric_name = 'Redo Generated Per Sec' THEN value END)/1024,2) "REDOKB/s"
, ROUND(MAX(CASE WHEN metric_name = 'Physical Reads Per Sec' THEN value END),2) "BLKRD/s"
, ROUND(MAX(CASE WHEN metric_name = 'Physical Writes Per Sec' THEN value END),2) "BLKWR/s"
, ROUND(MAX(CASE WHEN metric_name = 'Physical Reads Per Txn' THEN value END),2) "BLKRD/tx"
, ROUND(MAX(CASE WHEN metric_name = 'Network Traffic Volume Per Sec' THEN value END)/1024,2) "NETKB/s"
, ROUND(MAX(CASE WHEN metric_name = 'Total Parse Count Per Txn' THEN value END),2) "PARSE/tx"
, ROUND(MAX(CASE WHEN metric_name = 'User Calls Per Sec' THEN value END),2) "UCALLS/s"
, ROUND(MAX(CASE WHEN metric_name = 'SQL Service Response Time' THEN value END) * 10,2) "SQLms/call"
, ROUND(MAX(CASE WHEN metric_name = 'Response Time Per Txn' THEN value END) * 10,2) "RESPms/tx"
, ROUND(MAX(CASE WHEN metric_name = 'Redo Generated Per Txn' THEN value END)/1024,2) "REDO/tx"
, ROUND(MAX(CASE WHEN metric_name = 'Enqueue Requests Per Txn' THEN value END),2) "ENQRQ/tx"
--, metric_name
--, value
--, metric_unit
FROM
dba_hist_sysmetric_history h
WHERE
dbid = SYS_CONTEXT('userenv', 'dbid')
AND begin_time >= &1 AND end_time <= &2
GROUP BY
begin_time
ORDER BY
begin_time
/

View File

@@ -0,0 +1,37 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
VAR dbid NUMBER
PROMPT Listing latest AWR snapshots ...
SELECT snap_id, end_interval_time
FROM dba_hist_snapshot
--WHERE begin_interval_time > TO_DATE('2011-06-07 07:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE end_interval_time > SYSDATE - 1
ORDER BY end_interval_time;
ACCEPT bid NUMBER PROMPT "Enter begin snapshot id: "
ACCEPT eid NUMBER PROMPT "Enter end snapshot id: "
BEGIN
SELECT dbid INTO :dbid FROM v$database;
END;
/
SET TERMOUT OFF PAGESIZE 0 HEADING OFF LINESIZE 1000 TRIMSPOOL ON TRIMOUT ON TAB OFF
SPOOL awr_local_inst_1.html
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(:dbid, 1, &bid, &eid));
-- SPOOL awr_local_inst_2.html
-- SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(:dbid, 2, &bid, &eid));
--
-- SPOOL awr_local_inst_3.html
-- SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(:dbid, 3, &bid, &eid));
-- SPOOL awr_global.html
-- SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_GLOBAL_REPORT_HTML(:dbid, CAST(null AS VARCHAR2(10)), &bid, &eid));
SPOOL OFF
SET TERMOUT ON PAGESIZE 5000 HEADING ON

View File

@@ -0,0 +1,20 @@
SELECT DBMS_PERF.REPORT_PERFHUB (
is_realtime => 0 -- 0 = dba_hist, 1 = v$ash
, outer_start_time => sysdate-1
, outer_end_time => sysdate
, selected_start_time => TIMESTAMP'2023-05-15 20:15:00'
, selected_end_time => TIMESTAMP'2023-05-15 20:45:00'
, type=>'ACTIVE'
)
FROM dual
.
SET HEADING OFF LINESIZE 32767 PAGESIZE 0 TRIMSPOOL ON TRIMOUT ON LONG 9999999 VERIFY OFF LONGCHUNKSIZE 100000 FEEDBACK OFF
SET TERMOUT OFF
spool perfhub.html
/
spool off
SET TERMOUT ON HEADING ON PAGESIZE 5000 LINESIZE 999 FEEDBACK ON

5
tpt/awr/get_settings.sql Normal file
View File

@@ -0,0 +1,5 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
SELECT * FROM dba_hist_wr_control
@pr

21
tpt/awr/other_xml.sql Normal file
View File

@@ -0,0 +1,21 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
select
-- sql_id
-- , child_number
-- , plan_hash_value
substr(extractvalue(value(d), '/hint'), 1, 100) as outline_hints
from
xmltable('/*/outline_data/hint'
passing (
select
xmltype(other_xml) as xmlval
from
dba_hist_sql_plan
where
sql_id = '&1'
and other_xml is not null
)
) d
/

11252
tpt/awr/perfhub.html Normal file

File diff suppressed because it is too large Load Diff

16
tpt/awr/settings.sql Normal file
View File

@@ -0,0 +1,16 @@
-- Copyright 2018 Tanel Poder. All rights reserved. More info at https://blog.tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
PROMPT AWR Data Retention (Includes DBA_HIST ASH):
PROMPT
SELECT * FROM dba_hist_wr_control
@pr
PROMPT Optimizer Statistics History retention:
SELECT dbms_stats.get_stats_history_retention retention_days FROM dual;
PROMPT Use syntax like this to change AWR settings:
PROMPT -- EXEC SYS.DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval=>15, retention=>60*24*375);
PROMPT Statistics retention (days):
PROMPT -- EXEC DBMS_STATS.ALTER_STATS_HISTORY_RETENTION(90);
PROMPT