2026-03-12 20:23:15
This commit is contained in:
176
tpt/ash/ash_index_helper.sql
Normal file
176
tpt/ash/ash_index_helper.sql
Normal file
@@ -0,0 +1,176 @@
|
||||
-- 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 LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL accessed_table HEAD Accessed_Table FOR a40
|
||||
COL aindex_operation HEAD Plan_Operation FOR a70
|
||||
COL aindex_predicates HEAD PREDICATES FOR a100 truncate
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL AAS FOR 9999.9
|
||||
COL cpu_pct HEAD CPU FOR A5
|
||||
COL wait_pct HEAD WAIT FOR A5
|
||||
|
||||
COL ela_sec_exec HEAD "ELA_SEC/EXEC" FOR 9999990.999
|
||||
|
||||
COL aindex_plan_hash_value HEAD PLAN_HASH_VALUE PRINT
|
||||
COL aindex_sql_id HEAD SQL_ID NOPRINT
|
||||
COL aindex_sql_child HEAD "CHILD" PRINT
|
||||
COL aindex_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL aindex_id HEAD "ID" FOR 9999
|
||||
COL aindex_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
|
||||
PROMPT
|
||||
PROMPT -- Santa's Little (Index) Helper BETA v0.5 - by Tanel Poder ( https://tanelpoder.com )
|
||||
|
||||
WITH
|
||||
tab AS (SELECT /*+ NO_MERGE */ owner, table_name, num_rows
|
||||
FROM dba_tables
|
||||
WHERE UPPER(table_name) LIKE
|
||||
UPPER(CASE
|
||||
WHEN INSTR('&2','.') > 0 THEN
|
||||
SUBSTR('&2',INSTR('&2','.')+1)
|
||||
ELSE
|
||||
'&2'
|
||||
END
|
||||
) ESCAPE '\'
|
||||
AND owner LIKE
|
||||
CASE WHEN INSTR('&2','.') > 0 THEN
|
||||
UPPER(SUBSTR('&2',1,INSTR('&2','.')-1))
|
||||
ELSE
|
||||
user
|
||||
END ESCAPE '\'
|
||||
),
|
||||
ind AS (SELECT /*+ NO_MERGE */ owner, index_name, table_owner, table_name
|
||||
FROM dba_indexes
|
||||
WHERE (table_owner, table_name) IN (SELECT owner, table_name FROM tab)),
|
||||
sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.wait_class
|
||||
, ash.event
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_plan_operation IN ('TABLE ACCESS', 'INDEX')
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.wait_class
|
||||
, ash.event
|
||||
),
|
||||
ash_and_plan AS (
|
||||
SELECT
|
||||
plan.sql_id
|
||||
, plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) aindex_plan_id
|
||||
, plan.id aindex_id
|
||||
, plan.parent_id aindex_parent_id
|
||||
, plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_owner||'.'||plan.object_name ||']', null) aindex_operation
|
||||
, plan.object_owner
|
||||
, plan.object_name
|
||||
, plan.object_type
|
||||
, plan.cardinality
|
||||
, stat.executions
|
||||
, stat.elapsed_time
|
||||
, sq.session_state
|
||||
, sq.wait_class
|
||||
, sq.event
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1994) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1994) END aindex_predicates
|
||||
-- , plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, v$sqlstats_plan_hash stat
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
--
|
||||
AND sq.sql_id(+) = stat.sql_id
|
||||
AND sq.sql_plan_hash_value(+) = stat.plan_hash_value
|
||||
AND stat.sql_id = plan.sql_id
|
||||
AND stat.plan_hash_value = plan.plan_hash_value
|
||||
--
|
||||
AND plan.sql_id LIKE '&1'
|
||||
----
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
SUM(ap.seconds) seconds
|
||||
, ROUND(SUM(ap.seconds) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(TO_CHAR(ROUND(SUM(CASE WHEN ap.session_state = 'ON CPU' THEN ap.seconds ELSE 0 END) / SUM(ap.seconds) * 100))||'%',4) cpu_pct
|
||||
, LPAD(TO_CHAR(ROUND(SUM(CASE WHEN ap.session_state = 'WAITING' THEN ap.seconds ELSE 0 END) / SUM(ap.seconds) * 100))||'%',4) wait_pct
|
||||
--, SUM(CASE WHEN ap.wait_class = 'User I/O' THEN ap.seconds ELSE 0 END) iowait_sec
|
||||
, t.owner||'.'||table_name accessed_table
|
||||
, ap.aindex_operation
|
||||
, ap.cardinality plan_card
|
||||
, t.num_rows table_rows
|
||||
, ap.cardinality / NULLIF(t.num_rows,0) * 100 filter_pct
|
||||
, ap.executions sql_execs
|
||||
, ROUND(ap.elapsed_time / NULLIF(ap.executions,0) / 1000000,3) ela_sec_exec
|
||||
, ap.aindex_predicates
|
||||
, COUNT(DISTINCT ap.sql_id) dist_sqlids
|
||||
, COUNT(DISTINCT ap.plan_hash_value) dist_plans
|
||||
, MIN(ap.sql_id)
|
||||
, MAX(ap.sql_id)
|
||||
-- , ap.projection
|
||||
FROM
|
||||
ash_and_plan ap
|
||||
, (SELECT tab.*, 'TABLE' object_type, tab.owner object_owner, tab.table_name object_name FROM tab
|
||||
UNION ALL
|
||||
SELECT tab.*, 'INDEX', ind.owner object_owner, ind.index_name object_name
|
||||
FROM tab, ind
|
||||
WHERE tab.owner = ind.table_owner AND tab.table_name = ind.table_name
|
||||
) t
|
||||
WHERE
|
||||
ap.object_owner = t.object_owner AND ap.object_name = t.object_name AND SUBSTR(ap.object_type,1,5) = t.object_type
|
||||
AND ap.seconds > 0
|
||||
GROUP BY
|
||||
t.owner
|
||||
, t.table_name
|
||||
, ap.aindex_operation
|
||||
, t.num_rows
|
||||
, ap.cardinality
|
||||
, ap.executions
|
||||
, ap.elapsed_time
|
||||
, ap.aindex_predicates
|
||||
-- , ap.projection
|
||||
ORDER BY
|
||||
seconds DESC
|
||||
)
|
||||
WHERE rownum <= 30
|
||||
/
|
||||
176
tpt/ash/ash_index_helperx.sql
Normal file
176
tpt/ash/ash_index_helperx.sql
Normal file
@@ -0,0 +1,176 @@
|
||||
-- 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 LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL accessed_table HEAD Accessed_Table FOR a40
|
||||
COL aindex_operation HEAD Plan_Operation FOR a70
|
||||
COL aindex_predicates HEAD PREDICATES FOR a100 truncate
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL AAS FOR 9999.9
|
||||
COL cpu_pct HEAD CPU FOR A5
|
||||
COL wait_pct HEAD WAIT FOR A5
|
||||
|
||||
COL ela_sec_exec HEAD "ELA_SEC/EXEC" FOR 9999990.999
|
||||
|
||||
COL aindex_plan_hash_value HEAD PLAN_HASH_VALUE PRINT
|
||||
COL aindex_sql_id HEAD SQL_ID NOPRINT
|
||||
COL aindex_sql_child HEAD "CHILD" PRINT
|
||||
COL aindex_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL aindex_id HEAD "ID" FOR 9999
|
||||
COL aindex_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
|
||||
PROMPT
|
||||
PROMPT -- Santa's Little (Index) Helper BETA v0.5 - by Tanel Poder ( https://tanelpoder.com )
|
||||
|
||||
WITH
|
||||
tab AS (SELECT /*+ NO_MERGE */ owner, table_name, num_rows
|
||||
FROM dba_tables
|
||||
WHERE UPPER(table_name) LIKE
|
||||
UPPER(CASE
|
||||
WHEN INSTR('&2','.') > 0 THEN
|
||||
SUBSTR('&2',INSTR('&2','.')+1)
|
||||
ELSE
|
||||
'&2'
|
||||
END
|
||||
) ESCAPE '\'
|
||||
AND owner LIKE
|
||||
CASE WHEN INSTR('&2','.') > 0 THEN
|
||||
UPPER(SUBSTR('&2',1,INSTR('&2','.')-1))
|
||||
ELSE
|
||||
user
|
||||
END ESCAPE '\'
|
||||
),
|
||||
ind AS (SELECT /*+ NO_MERGE */ owner, index_name, table_owner, table_name
|
||||
FROM dba_indexes
|
||||
WHERE (table_owner, table_name) IN (SELECT owner, table_name FROM tab)),
|
||||
sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.wait_class
|
||||
, ash.event
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_plan_operation IN ('TABLE ACCESS', 'INDEX')
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.wait_class
|
||||
, ash.event
|
||||
),
|
||||
ash_and_plan AS (
|
||||
SELECT
|
||||
plan.sql_id
|
||||
, plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) aindex_plan_id
|
||||
, plan.id aindex_id
|
||||
, plan.parent_id aindex_parent_id
|
||||
, plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_owner||'.'||plan.object_name ||']', null) aindex_operation
|
||||
, plan.object_owner
|
||||
, plan.object_name
|
||||
, plan.object_type
|
||||
, plan.cardinality
|
||||
, stat.executions
|
||||
, stat.elapsed_time
|
||||
, sq.session_state
|
||||
, sq.wait_class
|
||||
, sq.event
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1994) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1994) END aindex_predicates
|
||||
, plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, v$sqlstats_plan_hash stat
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
--
|
||||
AND sq.sql_id(+) = stat.sql_id
|
||||
AND sq.sql_plan_hash_value(+) = stat.plan_hash_value
|
||||
AND stat.sql_id = plan.sql_id
|
||||
AND stat.plan_hash_value = plan.plan_hash_value
|
||||
--
|
||||
AND plan.sql_id LIKE '&1'
|
||||
----
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
SUM(ap.seconds) seconds
|
||||
, ROUND(SUM(ap.seconds) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(TO_CHAR(ROUND(SUM(CASE WHEN ap.session_state = 'ON CPU' THEN ap.seconds ELSE 0 END) / SUM(ap.seconds) * 100))||'%',4) cpu_pct
|
||||
, LPAD(TO_CHAR(ROUND(SUM(CASE WHEN ap.session_state = 'WAITING' THEN ap.seconds ELSE 0 END) / SUM(ap.seconds) * 100))||'%',4) wait_pct
|
||||
--, SUM(CASE WHEN ap.wait_class = 'User I/O' THEN ap.seconds ELSE 0 END) iowait_sec
|
||||
, t.owner||'.'||table_name accessed_table
|
||||
, ap.aindex_operation
|
||||
, ap.cardinality plan_card
|
||||
, t.num_rows table_rows
|
||||
, ap.cardinality / NULLIF(t.num_rows,0) * 100 filter_pct
|
||||
, ap.executions sql_execs
|
||||
, ROUND(ap.elapsed_time / NULLIF(ap.executions,0) / 1000000,3) ela_sec_exec
|
||||
, ap.aindex_predicates
|
||||
, COUNT(DISTINCT ap.sql_id) dist_sqlids
|
||||
, COUNT(DISTINCT ap.plan_hash_value) dist_plans
|
||||
, MIN(ap.sql_id)
|
||||
, MAX(ap.sql_id)
|
||||
, ap.projection
|
||||
FROM
|
||||
ash_and_plan ap
|
||||
, (SELECT tab.*, 'TABLE' object_type, tab.owner object_owner, tab.table_name object_name FROM tab
|
||||
UNION ALL
|
||||
SELECT tab.*, 'INDEX', ind.owner object_owner, ind.index_name object_name
|
||||
FROM tab, ind
|
||||
WHERE tab.owner = ind.table_owner AND tab.table_name = ind.table_name
|
||||
) t
|
||||
WHERE
|
||||
ap.object_owner = t.object_owner AND ap.object_name = t.object_name AND SUBSTR(ap.object_type,1,5) = t.object_type
|
||||
AND ap.seconds > 0
|
||||
GROUP BY
|
||||
t.owner
|
||||
, t.table_name
|
||||
, ap.aindex_operation
|
||||
, t.num_rows
|
||||
, ap.cardinality
|
||||
, ap.executions
|
||||
, ap.elapsed_time
|
||||
, ap.aindex_predicates
|
||||
, ap.projection
|
||||
ORDER BY
|
||||
seconds DESC
|
||||
)
|
||||
WHERE rownum <= 30
|
||||
/
|
||||
18
tpt/ash/ash_log_file_sync.sql
Normal file
18
tpt/ash/ash_log_file_sync.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
-- 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
|
||||
POWER(2, TRUNC(LOG(2,NULLIF(time_waited,0)))) up_to_microsec
|
||||
, COUNT(*)
|
||||
, SUM(time_waited)
|
||||
, MAX(time_waited)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
WHERE
|
||||
a.event = 'log file sync'
|
||||
GROUP BY
|
||||
POWER(2, TRUNC(LOG(2,NULLIF(time_waited,0))))
|
||||
ORDER BY
|
||||
up_to_microsec
|
||||
/
|
||||
|
||||
118
tpt/ash/ash_object_predicates.sql
Normal file
118
tpt/ash/ash_object_predicates.sql
Normal file
@@ -0,0 +1,118 @@
|
||||
-- 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 LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEAD Plan_Operation FOR a72
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE PRINT
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD "CHILD" PRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
|
||||
BREAK ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon v1.1 - by Tanel Poder ( http://blog.tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_plan_operation IN ('TABLE ACCESS', 'INDEX')
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_child_number LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
),
|
||||
ash_and_plan AS (
|
||||
SELECT
|
||||
plan.sql_id
|
||||
, plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1994) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1994) END asqlmon_predicates
|
||||
-- , plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.child_number LIKE '&2'
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
SUM(seconds) seconds
|
||||
, asqlmon_operation
|
||||
, session_state
|
||||
-- , event
|
||||
-- , obj_alias_qbc_name
|
||||
, asqlmon_predicates
|
||||
, COUNT(DISTINCT sql_id) dist_sqlids
|
||||
, COUNT(DISTINCT plan_hash_value) dist_plans
|
||||
, MIN(sql_id)
|
||||
, MAX(sql_id)
|
||||
FROM
|
||||
ash_and_plan
|
||||
WHERE
|
||||
seconds > 0
|
||||
GROUP BY
|
||||
asqlmon_operation
|
||||
, session_state
|
||||
-- , event
|
||||
-- , obj_alias_qbc_name
|
||||
, asqlmon_predicates
|
||||
ORDER BY
|
||||
seconds DESC
|
||||
)
|
||||
WHERE rownum <= 30
|
||||
/
|
||||
143
tpt/ash/ash_wait_chains.sql
Normal file
143
tpt/ash/ash_wait_chains.sql
Normal file
@@ -0,0 +1,143 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ash_wait_chains.sql (v0.8)
|
||||
-- Purpose: Display ASH wait chains (multi-session wait signature, a session
|
||||
-- waiting for another session etc.)
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ash_wait_chains <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ash_wait_chains username||':'||program2||event2 session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory G$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dash_wait_chains.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
-- Oracle 10g does not have the BLOCKING_INST_ID column in ASH so you'll need
|
||||
-- to comment out this column in this script. This may give you somewhat
|
||||
-- incorrect results in RAC environment with global blockers.
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL wait_chain FOR A300 WORD_WRAP
|
||||
COL "%This" FOR A6
|
||||
|
||||
PROMPT
|
||||
PROMPT -- Display ASH Wait Chain Signatures script v0.8 by Tanel Poder ( https://tanelpoder.com )
|
||||
|
||||
WITH
|
||||
bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat),
|
||||
ash AS (SELECT /*+ INLINE QB_NAME(ash) LEADING(a) USE_HASH(u) SWAP_JOIN_INPUTS(u) */
|
||||
a.*
|
||||
, CAST(a.sample_time AS DATE) sample_time_s -- round timestamp to 1 sec boundary for matching across RAC nodes
|
||||
, o.*
|
||||
, u.username
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' AND a.program LIKE '%(DBW%)' THEN
|
||||
'(DBWn)'
|
||||
WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, NVL(a.event||CASE WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||NVL((SELECT class FROM bclass WHERE r = a.p3),'undo @bclass '||a.p3)||']' ELSE null END,'ON CPU')
|
||||
|| ' ' event2
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
gv$active_session_history a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
),
|
||||
ash_samples AS (SELECT /*+ INLINE */ DISTINCT sample_time_s FROM ash),
|
||||
ash_data AS (SELECT /*+ INLINE */ * FROM ash),
|
||||
chains AS (
|
||||
SELECT /*+ INLINE */
|
||||
d.sample_time_s ts
|
||||
, level lvl
|
||||
, session_id sid
|
||||
, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 AND d.blocking_session IS NOT NULL THEN ' -> [idle blocker '||d.blocking_inst_id||','||d.blocking_session||','||d.blocking_session_serial#||(SELECT ' ('||s.program||')' FROM gv$session s WHERE (s.inst_id, s.sid , s.serial#) = ((d.blocking_inst_id,d.blocking_session,d.blocking_session_serial#)))||']' ELSE NULL END path -- there's a reason why I'm doing this
|
||||
--, SYS_CONNECT_BY_PATH(&1, ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 THEN '('||d.session_id||')' ELSE NULL END path
|
||||
-- , REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 AND LEVEL > 1 THEN ' [sid='||session_id||' seq#='||TO_CHAR(seq#)||']' ELSE NULL END path -- there's a reason why I'm doing this
|
||||
--, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ') path -- there's a reason why I'm doing this (ORA-30004 :)
|
||||
, CASE WHEN CONNECT_BY_ISLEAF = 1 THEN d.session_id ELSE NULL END sids
|
||||
, CONNECT_BY_ISLEAF isleaf
|
||||
, CONNECT_BY_ISCYCLE iscycle
|
||||
, d.*
|
||||
FROM
|
||||
ash_samples s
|
||||
, ash_data d
|
||||
WHERE
|
||||
s.sample_time_s = d.sample_time_s
|
||||
AND d.sample_time BETWEEN &3 AND &4
|
||||
CONNECT BY NOCYCLE
|
||||
( PRIOR d.blocking_session = d.session_id
|
||||
AND PRIOR d.blocking_inst_id = d.inst_id
|
||||
AND PRIOR s.sample_time_s = d.sample_time_s -- Different RAC nodes have sample_id drift (assuming that clocks are synced enough)
|
||||
)
|
||||
START WITH &2
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, COUNT(*) seconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, path wait_chain
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
, COUNT(DISTINCT sids) num_sids
|
||||
, MIN(sids)
|
||||
, MAX(sids)
|
||||
FROM
|
||||
chains
|
||||
WHERE
|
||||
isleaf = 1
|
||||
GROUP BY
|
||||
&1
|
||||
, path
|
||||
ORDER BY
|
||||
COUNT(*) DESC
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 30
|
||||
/
|
||||
20
tpt/ash/ashmem.sql
Normal file
20
tpt/ash/ashmem.sql
Normal file
@@ -0,0 +1,20 @@
|
||||
-- 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 (
|
||||
SELECT
|
||||
TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI:SS.FF') sample_time
|
||||
, ROUND(SUM(pga_allocated)/1024/1024) total_pga_mb
|
||||
, ROUND(SUM(temp_space_allocated)/1024/1024) total_temp_mp
|
||||
, COUNT(DISTINCT session_id||':'||session_serial#) act_sessions
|
||||
FROM
|
||||
v$active_session_history
|
||||
GROUP BY
|
||||
sample_time
|
||||
ORDER BY total_pga_mb
|
||||
DESC
|
||||
)
|
||||
WHERE rownum <= 10
|
||||
/
|
||||
|
||||
|
||||
98
tpt/ash/ashpeak.sql
Normal file
98
tpt/ash/ashpeak.sql
Normal file
@@ -0,0 +1,98 @@
|
||||
-- Copyright 2020 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashpeak.sql
|
||||
-- Purpose:
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) https://tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashpeak <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashpeak.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%Total" FOR A7 JUST RIGHT
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999999999.9
|
||||
COL log2_aas_4k FOR A14 HEAD "Log(2,AAS)" JUST LEFT
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
PROMPT
|
||||
PROMPT AAS by &1 within time range between &3 and &4
|
||||
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT
|
||||
&1
|
||||
, COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400, 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%Total"
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND(LOG(2,COUNT(*) / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400), 1), '#'),' '), 12)||'|' log2_aas_4k
|
||||
FROM (
|
||||
SELECT
|
||||
TRUNC(sample_time, 'DD') dd
|
||||
, TRUNC(sample_time, 'HH') hh
|
||||
, TRUNC(sample_time, 'MI') mi
|
||||
, TO_DATE(SUBSTR(TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI'), 1, 15)||'0', 'YYYY-MM-DD HH24:MI') mt
|
||||
, CAST(sample_time AS DATE) ss
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, a.*
|
||||
, u.username
|
||||
, o.*
|
||||
FROM
|
||||
v$active_session_history a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
)
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
&1
|
||||
/
|
||||
|
||||
119
tpt/ash/ashpeaktop.sql
Normal file
119
tpt/ash/ashpeaktop.sql
Normal file
@@ -0,0 +1,119 @@
|
||||
-- Copyright 2020 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashpeak.sql
|
||||
-- Purpose:
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) https://tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dashpeaktop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashpeak.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%Total" FOR A7 JUST RIGHT
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999999999.9
|
||||
COL log2_aas_4k FOR A14 HEAD "Log(2,AAS)" JUST LEFT
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
PROMPT
|
||||
PROMPT Top AAS peaks within time range between &3 and &4
|
||||
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&1
|
||||
, COUNT(*) sessions
|
||||
, COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400, 1) AAS
|
||||
FROM (
|
||||
SELECT
|
||||
TRUNC(sample_time, 'DD') dd
|
||||
, TRUNC(sample_time, 'HH') hh
|
||||
, TRUNC(sample_time, 'MI') mi
|
||||
, TO_DATE(SUBSTR(TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI'), 1, 15)||'0', 'YYYY-MM-DD HH24:MI') mt
|
||||
, CAST(sample_time AS DATE) ss
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, a.*
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
gv$active_session_history a
|
||||
WHERE
|
||||
&2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
)
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
totalseconds DESC
|
||||
)
|
||||
WHERE
|
||||
rownum <= 25
|
||||
/
|
||||
|
||||
133
tpt/ash/ashtop.sql
Normal file
133
tpt/ash/ashtop.sql
Normal file
@@ -0,0 +1,133 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashtop.sql v1.2
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashtop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ashtop username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashtop.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, TRUNC(px_flags / 2097152) dop
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM gv$active_session_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
TotalSeconds DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 15
|
||||
/
|
||||
|
||||
104
tpt/ash/ashtop10.sql
Normal file
104
tpt/ash/ashtop10.sql
Normal file
@@ -0,0 +1,104 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashtop.sql v1.2
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashtop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ashtop username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashtop.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
WITH bclass AS (SELECT class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, NVL(event, session_state)||
|
||||
CASE
|
||||
WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
FROM gv$active_session_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
TotalSeconds DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 15
|
||||
/
|
||||
|
||||
154
tpt/ash/ashtopsum.sql
Normal file
154
tpt/ash/ashtopsum.sql
Normal file
@@ -0,0 +1,154 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashtopsum.sql v1.3
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions AND (potentially lossy) SUM of IO rate metrics
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashtopsum <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ashtopsum username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashtopsum.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
COL rd_rq FOR 999,999,999
|
||||
COL wr_rq FOR 999,999,999
|
||||
COL rd_mb FOR 999,999,999
|
||||
COL wr_mb FOR 999,999,999
|
||||
COL pgamem_mb FOR 9,999,999
|
||||
COL tempspc_mb FOR 99,999,999
|
||||
|
||||
PROMPT This is an experimental script as some documentation/explanation is needed.
|
||||
PROMPT The ASH "delta" metrics are not tied to individual SQL_IDs or wait events,
|
||||
PROMPT They are valid in the session scope (and related mostly static attributes,
|
||||
PROMPT like PROGRAM, MACHINE, MODULE). Which SQL_ID/operation/event happens to be
|
||||
PROMPT active when ASH samples its data is just matter of luck.
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, SUM(delta_read_io_requests) rd_rq
|
||||
, SUM(delta_write_io_requests) wr_rq
|
||||
, SUM(delta_read_io_bytes)/1048576 rd_mb
|
||||
, SUM(delta_write_io_bytes)/1048576 wr_mb
|
||||
--, SUM(delta_interconnect_io_bytes)
|
||||
--, SUM(delta_read_mem_bytes)
|
||||
, MAX(pga_allocated)/1048576 pgamem_mb
|
||||
, MAX(temp_space_allocated)/1048576 tempspc_mb
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, TRUNC(px_flags / 2097152) dop
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM gv$active_session_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
TotalSeconds DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
43
tpt/ash/asqlflame.sql
Normal file
43
tpt/ash/asqlflame.sql
Normal file
@@ -0,0 +1,43 @@
|
||||
-- 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.
|
||||
|
||||
-- prototype script for displaying execution plan profile as a flame chart
|
||||
-- @sqlflame.sql <sqlid> <child#>
|
||||
|
||||
SET HEADING OFF LINESIZE 32767 PAGESIZE 0 TRIMSPOOL ON TRIMOUT ON LONG 9999999 VERIFY OFF LONGCHUNKSIZE 100000 FEEDBACK OFF APPINFO OFF
|
||||
SET TERMOUT OFF
|
||||
--SET TIMING OFF
|
||||
|
||||
WITH sq AS (
|
||||
SELECT /*+ MATERIALIZE */
|
||||
sp.id, sp.parent_id, sp.operation, sp.options
|
||||
, sp.object_owner, sp.object_name, ss.last_elapsed_time, ss.elapsed_time
|
||||
FROM v$sql_plan_statistics ss, v$sql_plan sp
|
||||
WHERE
|
||||
sp.sql_id=ss.sql_id
|
||||
AND sp.child_number=ss.child_number
|
||||
AND sp.address=ss.address
|
||||
AND sp.id=ss.operation_id
|
||||
AND sp.sql_id='&1'
|
||||
AND sp.child_number=&2
|
||||
)
|
||||
SELECT
|
||||
'0 - SELECT STATEMENT'||TRIM(SYS_CONNECT_BY_PATH(id||' - '||operation||NVL2(options,' '||options,NULL)||NVL2(object_owner||object_name, ' ['||object_owner||'.'||object_name||']', NULL), ';'))||' '||TRIM(ROUND(elapsed_time/1000))
|
||||
FROM
|
||||
sq
|
||||
CONNECT BY
|
||||
parent_id = PRIOR id
|
||||
START WITH parent_id = 0
|
||||
.
|
||||
|
||||
spool $HOME/sqlflame_stacks.txt
|
||||
/
|
||||
spool off
|
||||
|
||||
|
||||
SET TERMOUT ON HEADING ON PAGESIZE 5000 LINESIZE 999 FEEDBACK ON
|
||||
--SET TIMING ON
|
||||
|
||||
HOST $HOME/dev/FlameGraph/flamegraph.pl --countname=Milliseconds --title="sql_id=&1" $HOME/sqlflame_stacks.txt > $HOME/sqlflame_&1..svg
|
||||
HOST OPEN $HOME/sqlflame_&1..svg
|
||||
|
||||
111
tpt/ash/asqlmon.sql
Normal file
111
tpt/ash/asqlmon.sql
Normal file
@@ -0,0 +1,111 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: asqlmon.sql (v1.3)
|
||||
--
|
||||
-- Purpose: Report SQL-monitoring-style drill-down into where in an execution plan the execution time is spent
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) http://blog.tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @asqlmon <sqlid> <child#> <from_time> <to_time>
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics pack license for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEADING Plan_Operation FORMAT A72
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE FOR 99999999999
|
||||
COL asqlmon_sql_id HEAD SQL_ID
|
||||
COL asqlmon_sql_child HEAD CHILD FOR 999999
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
|
||||
BREAK ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon v1.3 - by Tanel Poder ( https://tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_child_number LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT
|
||||
-- plan.sql_id asqlmon_sql_id
|
||||
plan.child_number asqlmon_sql_child
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, LPAD(' ', depth, ' ') || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
-- , CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1990) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1990) END asqlmon_predicates
|
||||
-- , plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.child_number LIKE '&2'
|
||||
ORDER BY
|
||||
plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
117
tpt/ash/asqlmon12.sql
Normal file
117
tpt/ash/asqlmon12.sql
Normal file
@@ -0,0 +1,117 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: asqlmon.sql (v1.2)
|
||||
--
|
||||
-- Purpose: Report SQL-monitoring-style drill-down into where in an execution plan the execution time is spent
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) https://tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @asqlmon <sqlid> <child#> <from_time> <to_time>
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics pack license for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEAD Plan_Operation FOR a72
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE PRINT
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD "CHILD" PRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
|
||||
BREAK ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon v1.1 - by Tanel Poder ( https://tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, ash.sql_full_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_child_number LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, ash.sql_full_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT
|
||||
plan.sql_id asqlmon_sql_id
|
||||
, plan.child_number asqlmon_sql_child
|
||||
, plan.full_plan_hash_value asqlmon_full_plan_hash_value
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, LPAD(' ', depth, ' ') || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
-- , CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1990) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1990) END asqlmon_predicates
|
||||
-- , plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_full_plan_hash_value(+) = plan.full_plan_hash_value
|
||||
--AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.child_number LIKE '&2'
|
||||
ORDER BY
|
||||
plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
112
tpt/ash/asqlmonx.sql
Normal file
112
tpt/ash/asqlmonx.sql
Normal file
@@ -0,0 +1,112 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: asqlmon.sql (v1.1)
|
||||
--
|
||||
-- Purpose: Report SQL-monitoring-style drill-down into where in an execution plan the execution time is spent
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) http://blog.tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @asqlmon <sqlid> <child#> <from_time> <to_time>
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics pack license for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEAD Plan_Operation FOR a72
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE PRINT
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD "CHILD" PRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
BREAK ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon eXtended v1.1 - by Tanel Poder ( http://blog.tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
v$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_child_number LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT
|
||||
plan.sql_id asqlmon_sql_id
|
||||
, plan.child_number asqlmon_sql_child
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, LPAD(' ', depth, ' ') || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| SUBSTR(plan.access_predicates,1,1990) END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:] ' || SUBSTR(plan.filter_predicates,1,1990) END asqlmon_predicates
|
||||
, plan.projection
|
||||
FROM
|
||||
v$sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.child_number LIKE '&2'
|
||||
ORDER BY
|
||||
plan.child_number
|
||||
, plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
132
tpt/ash/bash_wait_chains.sql
Normal file
132
tpt/ash/bash_wait_chains.sql
Normal file
@@ -0,0 +1,132 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ash_wait_chains.sql (v0.2 BETA)
|
||||
-- Purpose: Display ASH wait chains (multi-session wait signature, a session
|
||||
-- waiting for another session etc.)
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ash_wait_chains <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ash_wait_chains username||':'||program2||event2 session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory V$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dash_wait_chains.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
-- Oracle 10g does not have the BLOCKING_INST_ID column in ASH so you'll need
|
||||
-- to comment out this column in this script. This may give you somewhat
|
||||
-- incorrect results in RAC environment with global blockers.
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL wait_chain FOR A300 WORD_WRAP
|
||||
COL "%This" FOR A6
|
||||
|
||||
PROMPT
|
||||
PROMPT -- Display ASH Wait Chain Signatures script v0.4 BETA by Tanel Poder ( http://blog.tanelpoder.com )
|
||||
|
||||
WITH
|
||||
bclass AS (SELECT class, ROWNUM r from v$waitstat),
|
||||
ash AS (SELECT /*+ QB_NAME(ash) LEADING(a) USE_HASH(u) SWAP_JOIN_INPUTS(u) */
|
||||
a.*
|
||||
, u.username
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, NVL(a.event||CASE WHEN a.event IN ('buffer busy waits', 'gc buffer busy', 'gc buffer busy acquire', 'gc buffer busy release')
|
||||
THEN ' ['||NVL((SELECT class FROM bclass WHERE r = a.p3),'undo @bclass '||a.p3)||']' ELSE null END,'ON CPU')
|
||||
|| ' ' event2
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
&ashtable. a
|
||||
, dba_users u
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
),
|
||||
ash_samples AS (SELECT DISTINCT sample_id FROM ash),
|
||||
ash_data AS (SELECT * FROM ash),
|
||||
chains AS (
|
||||
SELECT
|
||||
sample_time ts
|
||||
, level lvl
|
||||
, session_id sid
|
||||
, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 AND d.blocking_session IS NOT NULL THEN ' -> [idle blocker '||d.blocking_inst_id||','||d.blocking_session||','||d.blocking_session_serial#||(SELECT ' ('||s.program||')' FROM gv$session s WHERE (s.inst_id, s.sid , s.serial#) = ((d.blocking_inst_id,d.blocking_session,d.blocking_session_serial#)))||']' ELSE NULL END path -- there's a reason why I'm doing this
|
||||
--, SYS_CONNECT_BY_PATH(&1, ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 THEN '('||d.session_id||')' ELSE NULL END path
|
||||
-- , REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 AND LEVEL > 1 THEN ' [sid='||session_id||' seq#='||TO_CHAR(seq#)||']' ELSE NULL END path -- there's a reason why I'm doing this
|
||||
--, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ') path -- there's a reason why I'm doing this (ORA-30004 :)
|
||||
, CASE WHEN CONNECT_BY_ISLEAF = 1 THEN d.session_id ELSE NULL END sids
|
||||
, CONNECT_BY_ISLEAF isleaf
|
||||
, CONNECT_BY_ISCYCLE iscycle
|
||||
, d.*
|
||||
FROM
|
||||
ash_samples s
|
||||
, ash_data d
|
||||
WHERE
|
||||
s.sample_id = d.sample_id
|
||||
AND d.sample_time BETWEEN &3 AND &4
|
||||
CONNECT BY NOCYCLE
|
||||
( PRIOR d.blocking_session = d.session_id
|
||||
-- ash was saved from V$ not GV$ - AND PRIOR d.blocking_inst_id = d.inst_id
|
||||
AND PRIOR s.sample_id = d.sample_id
|
||||
)
|
||||
START WITH &2
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, COUNT(*) seconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, path wait_chain
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , COUNT(DISTINCT sids)
|
||||
-- , MIN(sids)
|
||||
-- , MAX(sids)
|
||||
FROM
|
||||
chains
|
||||
WHERE
|
||||
isleaf = 1
|
||||
GROUP BY
|
||||
&1
|
||||
, path
|
||||
ORDER BY
|
||||
COUNT(*) DESC
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 30
|
||||
/
|
||||
|
||||
129
tpt/ash/bashtop.sql
Normal file
129
tpt/ash/bashtop.sql
Normal file
@@ -0,0 +1,129 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashtop.sql v1.2
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashtop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @ashtop username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory V$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashtop.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
SELECT * FROM (
|
||||
WITH bclass AS (SELECT class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, NVL(event, session_state)||
|
||||
CASE
|
||||
WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN ('buffer busy waits', 'gc buffer busy', 'gc buffer busy acquire', 'gc buffer busy release')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
&ashtable. a
|
||||
) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
TotalSeconds DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 15
|
||||
/
|
||||
|
||||
54
tpt/ash/bevent_hist.sql
Normal file
54
tpt/ash/bevent_hist.sql
Normal file
@@ -0,0 +1,54 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD "Wait Event" for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR A15 JUST RIGHT
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.evh_event
|
||||
, e.evh_millisec
|
||||
, e.evh_sample_count
|
||||
, e.evh_est_event_count
|
||||
, e.evh_est_total_sec
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
, first_seen
|
||||
, last_seen
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END) / 1000,1) evh_est_total_sec
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
FROM
|
||||
&ashtable
|
||||
--gv$active_session_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
48
tpt/ash/bevent_hist_micro.sql
Normal file
48
tpt/ash/bevent_hist_micro.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket us+" FOR A15 JUST RIGHT
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.*
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END)/1000000,1) evh_est_total_sec
|
||||
FROM
|
||||
&ashtable
|
||||
--V$ACTIVE_SESSION_HISTORY
|
||||
--dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
48
tpt/ash/bshortmon_logfilesync.sql
Normal file
48
tpt/ash/bshortmon_logfilesync.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 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 wait_class FOR a15
|
||||
COL event FOR a55
|
||||
COL time_range HEAD "WAIT_TIM_BUCKET_US+" FOR 999,999,999,999
|
||||
COL avg_wait_us HEAD "AVG_WAIT_IN_BKT_US" FOR 999,999,999,999
|
||||
COL pct_event FOR a9
|
||||
COL pct_total FOR a9
|
||||
|
||||
BREAK ON event SKIP 1 DUPLICATES
|
||||
|
||||
-- TODO: ignore latest sample (0 waits)
|
||||
|
||||
SELECT
|
||||
session_state state
|
||||
, wait_class
|
||||
, event
|
||||
, ROUND(AVG(time_waited)) avg_wait_us
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END))) time_range
|
||||
, COUNT(*) samples
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 100, 1), 999.9))||' %',8) pct_event
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 10), '#'), ' '), 10,' ')||'|' pct_event_vis
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1), 999.9))||' %',8) pct_total
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_total_vis
|
||||
FROM
|
||||
dba_hist_ash_aug
|
||||
--gv$active_session_history
|
||||
--DBA_HIST_ACTIVE_SESS_HISTORY
|
||||
WHERE
|
||||
&2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
--AND sample_time BETWEEN TIMESTAMP'2013-10-01 13:54:00' AND TIMESTAMP'2013-10-01 13:55:00'
|
||||
AND (UPPER(wait_class) LIKE UPPER('%&1%') OR UPPER(event) LIKE UPPER('%&1%'))
|
||||
--AND program LIKE 'sqlplus%'
|
||||
GROUP BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))
|
||||
ORDER BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, time_range NULLS FIRST
|
||||
, samples DESC
|
||||
/
|
||||
|
||||
46
tpt/ash/btime_model_phases.sql
Normal file
46
tpt/ash/btime_model_phases.sql
Normal file
@@ -0,0 +1,46 @@
|
||||
-- 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 (
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
count(*)
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, &1
|
||||
, CASE WHEN IN_CONNECTION_MGMT = 'Y' THEN 'CONNECTION_MGMT ' END ||
|
||||
CASE WHEN IN_PARSE = 'Y' THEN 'PARSE ' END ||
|
||||
CASE WHEN IN_HARD_PARSE = 'Y' THEN 'HARD_PARSE ' END ||
|
||||
CASE WHEN IN_SQL_EXECUTION = 'Y' THEN 'SQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_EXECUTION = 'Y' THEN 'PLSQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_RPC = 'Y' THEN 'PLSQL_RPC ' END ||
|
||||
CASE WHEN IN_PLSQL_COMPILATION = 'Y' THEN 'PLSQL_COMPILATION ' END ||
|
||||
CASE WHEN IN_JAVA_EXECUTION = 'Y' THEN 'JAVA_EXECUTION ' END ||
|
||||
CASE WHEN IN_BIND = 'Y' THEN 'BIND ' END ||
|
||||
CASE WHEN IN_CURSOR_CLOSE = 'Y' THEN 'CURSOR_CLOSE ' END ||
|
||||
CASE WHEN IN_SEQUENCE_LOAD = 'Y' THEN 'SEQUENCE_LOAD ' END phase
|
||||
FROM
|
||||
v$active_session_history a
|
||||
, dba_users u
|
||||
WHERE
|
||||
a.user_id = u.user_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_type = 'FOREGROUND'
|
||||
GROUP BY
|
||||
&1
|
||||
, CASE WHEN IN_CONNECTION_MGMT = 'Y' THEN 'CONNECTION_MGMT ' END ||
|
||||
CASE WHEN IN_PARSE = 'Y' THEN 'PARSE ' END ||
|
||||
CASE WHEN IN_HARD_PARSE = 'Y' THEN 'HARD_PARSE ' END ||
|
||||
CASE WHEN IN_SQL_EXECUTION = 'Y' THEN 'SQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_EXECUTION = 'Y' THEN 'PLSQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_RPC = 'Y' THEN 'PLSQL_RPC ' END ||
|
||||
CASE WHEN IN_PLSQL_COMPILATION = 'Y' THEN 'PLSQL_COMPILATION ' END ||
|
||||
CASE WHEN IN_JAVA_EXECUTION = 'Y' THEN 'JAVA_EXECUTION ' END ||
|
||||
CASE WHEN IN_BIND = 'Y' THEN 'BIND ' END ||
|
||||
CASE WHEN IN_CURSOR_CLOSE = 'Y' THEN 'CURSOR_CLOSE ' END ||
|
||||
CASE WHEN IN_SEQUENCE_LOAD = 'Y' THEN 'SEQUENCE_LOAD ' END
|
||||
ORDER BY
|
||||
"%This" DESC
|
||||
)
|
||||
WHERE ROWNUM <= 20
|
||||
/
|
||||
|
||||
151
tpt/ash/cashtop.sql
Normal file
151
tpt/ash/cashtop.sql
Normal file
@@ -0,0 +1,151 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: cashtop.sql
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @cashtop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @cashtop pdb_name,username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the AWR's CDB_HIST_ACTIVE_SESS_HISTORY, use
|
||||
-- @ashtop.sql for accessiong the V$ ASH view
|
||||
--
|
||||
--
|
||||
-- TODO:
|
||||
-- Deal with cases where there's no AWR snapshot saved to DBA_HIST_SNAPSHOTS
|
||||
-- (due to a DB issue) but DBA_HIST_ASH samples are there
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
COL "%This" FOR A7
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A46 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
COL sql_plan_op FOR A40
|
||||
|
||||
SELECT /*+ qb_name(main) */ * FROM (
|
||||
WITH bclass AS (SELECT class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
10 * COUNT(*) "TotalSeconds"
|
||||
, ROUND(10 * COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, &1
|
||||
-- , 10 * SUM(CASE WHEN wait_class IS NULL THEN 1 ELSE 0 END) "CPU"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='User I/O' THEN 1 ELSE 0 END) "User I/O"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Application' THEN 1 ELSE 0 END) "Application"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Concurrency' THEN 1 ELSE 0 END) "Concurrency"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Commit' THEN 1 ELSE 0 END) "Commit"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Configuration' THEN 1 ELSE 0 END) "Configuration"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Cluster' THEN 1 ELSE 0 END) "Cluster"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Idle' THEN 1 ELSE 0 END) "Idle"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Network' THEN 1 ELSE 0 END) "Network"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='System I/O' THEN 1 ELSE 0 END) "System I/O"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Scheduler' THEN 1 ELSE 0 END) "Scheduler"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Administrative' THEN 1 ELSE 0 END) "Administrative"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Queueing' THEN 1 ELSE 0 END) "Queueing"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Other' THEN 1 ELSE 0 END) "Other"
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, a.instance_number AS inst_id
|
||||
, a.sql_plan_operation||' '||a.sql_plan_options sql_plan_op
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, NVL(event, session_state)||
|
||||
CASE
|
||||
WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
-- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
END event2
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM cdb_hist_active_sess_history a) a
|
||||
, cdb_users u
|
||||
, cdb_pdbs p
|
||||
, (SELECT
|
||||
con_id
|
||||
, object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM cdb_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.con_id = u.con_id (+)
|
||||
AND a.current_obj# = o.object_id (+)
|
||||
AND a.con_id = o.con_id (+)
|
||||
AND a.con_id = p.con_id (+)
|
||||
AND &2
|
||||
AND a.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
"TotalSeconds" DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
119
tpt/ash/create_ash_without_timestamps.sql
Normal file
119
tpt/ash/create_ash_without_timestamps.sql
Normal file
@@ -0,0 +1,119 @@
|
||||
-- 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 t$ash AS
|
||||
SELECT
|
||||
SAMPLE_ID -- NUMBER
|
||||
, CAST(SAMPLE_TIME AS DATE) sample_time -- TIMESTAMP(3)
|
||||
, TO_CHAR(sample_time, 'YYYY') sample_year
|
||||
, TO_CHAR(sample_time, 'MM') sample_month_num
|
||||
, TO_CHAR(sample_time, 'MON') sample_mon
|
||||
, TO_CHAR(sample_time, 'Month') sample_month
|
||||
, TO_CHAR(sample_time, 'DD') sample_day
|
||||
, TO_CHAR(sample_time, 'HH24') sample_hour
|
||||
, TO_CHAR(sample_time, 'MI') sample_minute
|
||||
, TO_CHAR(sample_time, 'SS') sample_second
|
||||
, IS_AWR_SAMPLE -- VARCHAR2(1)
|
||||
, SESSION_ID -- NUMBER
|
||||
, SESSION_SERIAL# -- NUMBER
|
||||
, SESSION_TYPE -- VARCHAR2(10)
|
||||
, FLAGS -- NUMBER
|
||||
, a.USER_ID -- NUMBER
|
||||
, u.username
|
||||
, SQL_ID -- VARCHAR2(13)
|
||||
, IS_SQLID_CURRENT -- VARCHAR2(1)
|
||||
, SQL_CHILD_NUMBER -- NUMBER
|
||||
, SQL_OPCODE -- NUMBER
|
||||
, SQL_OPNAME -- VARCHAR2(64)
|
||||
, FORCE_MATCHING_SIGNATURE -- NUMBER
|
||||
, TOP_LEVEL_SQL_ID -- VARCHAR2(13)
|
||||
, TOP_LEVEL_SQL_OPCODE -- NUMBER
|
||||
, SQL_PLAN_HASH_VALUE -- NUMBER
|
||||
, SQL_PLAN_LINE_ID -- NUMBER
|
||||
, SQL_PLAN_OPERATION -- VARCHAR2(30)
|
||||
, SQL_PLAN_OPTIONS -- VARCHAR2(30)
|
||||
, SQL_EXEC_ID -- NUMBER
|
||||
, SQL_EXEC_START -- DATE
|
||||
, PLSQL_ENTRY_OBJECT_ID -- NUMBER
|
||||
, PLSQL_ENTRY_SUBPROGRAM_ID -- NUMBER
|
||||
, PLSQL_OBJECT_ID -- NUMBER
|
||||
, PLSQL_SUBPROGRAM_ID -- NUMBER
|
||||
, QC_INSTANCE_ID -- NUMBER
|
||||
, QC_SESSION_ID -- NUMBER
|
||||
, QC_SESSION_SERIAL# -- NUMBER
|
||||
, PX_FLAGS -- NUMBER
|
||||
, EVENT -- VARCHAR2(64)
|
||||
, EVENT_ID -- NUMBER
|
||||
, EVENT# -- NUMBER
|
||||
, SEQ# -- NUMBER
|
||||
, P1TEXT -- VARCHAR2(64)
|
||||
, P1 -- NUMBER
|
||||
, P2TEXT -- VARCHAR2(64)
|
||||
, P2 -- NUMBER
|
||||
, P3TEXT -- VARCHAR2(64)
|
||||
, P3 -- NUMBER
|
||||
, WAIT_CLASS -- VARCHAR2(64)
|
||||
, WAIT_CLASS_ID -- NUMBER
|
||||
, WAIT_TIME -- NUMBER
|
||||
, SESSION_STATE -- VARCHAR2(7)
|
||||
, TIME_WAITED -- NUMBER
|
||||
, BLOCKING_SESSION_STATUS -- VARCHAR2(11)
|
||||
, BLOCKING_SESSION -- NUMBER
|
||||
, BLOCKING_SESSION_SERIAL# -- NUMBER
|
||||
, BLOCKING_INST_ID -- NUMBER
|
||||
, BLOCKING_HANGCHAIN_INFO -- VARCHAR2(1)
|
||||
, CURRENT_OBJ# -- NUMBER
|
||||
, CURRENT_FILE# -- NUMBER
|
||||
, CURRENT_BLOCK# -- NUMBER
|
||||
, CURRENT_ROW# -- NUMBER
|
||||
, TOP_LEVEL_CALL# -- NUMBER
|
||||
, TOP_LEVEL_CALL_NAME -- VARCHAR2(64)
|
||||
, CONSUMER_GROUP_ID -- NUMBER
|
||||
, XID -- RAW(8)
|
||||
, REMOTE_INSTANCE# -- NUMBER
|
||||
, TIME_MODEL -- NUMBER
|
||||
, IN_CONNECTION_MGMT -- VARCHAR2(1)
|
||||
, IN_PARSE -- VARCHAR2(1)
|
||||
, IN_HARD_PARSE -- VARCHAR2(1)
|
||||
, IN_SQL_EXECUTION -- VARCHAR2(1)
|
||||
, IN_PLSQL_EXECUTION -- VARCHAR2(1)
|
||||
, IN_PLSQL_RPC -- VARCHAR2(1)
|
||||
, IN_PLSQL_COMPILATION -- VARCHAR2(1)
|
||||
, IN_JAVA_EXECUTION -- VARCHAR2(1)
|
||||
, IN_BIND -- VARCHAR2(1)
|
||||
, IN_CURSOR_CLOSE -- VARCHAR2(1)
|
||||
, IN_SEQUENCE_LOAD -- VARCHAR2(1)
|
||||
, CAPTURE_OVERHEAD -- VARCHAR2(1)
|
||||
, REPLAY_OVERHEAD -- VARCHAR2(1)
|
||||
, IS_CAPTURED -- VARCHAR2(1)
|
||||
, IS_REPLAYED -- VARCHAR2(1)
|
||||
, SERVICE_HASH -- NUMBER
|
||||
, PROGRAM -- VARCHAR2(48)
|
||||
, MODULE -- VARCHAR2(64)
|
||||
, ACTION -- VARCHAR2(64)
|
||||
, CLIENT_ID -- VARCHAR2(64)
|
||||
, MACHINE -- VARCHAR2(64)
|
||||
, PORT -- NUMBER
|
||||
, ECID -- VARCHAR2(64)
|
||||
, DBREPLAY_FILE_ID -- NUMBER
|
||||
, DBREPLAY_CALL_COUNTER -- NUMBER
|
||||
, TM_DELTA_TIME -- NUMBER
|
||||
, TM_DELTA_CPU_TIME -- NUMBER
|
||||
, TM_DELTA_DB_TIME -- NUMBER
|
||||
, DELTA_TIME -- NUMBER
|
||||
, DELTA_READ_IO_REQUESTS -- NUMBER
|
||||
, DELTA_WRITE_IO_REQUESTS -- NUMBER
|
||||
, DELTA_READ_IO_BYTES -- NUMBER
|
||||
, DELTA_WRITE_IO_BYTES -- NUMBER
|
||||
, DELTA_INTERCONNECT_IO_BYTES -- NUMBER
|
||||
, PGA_ALLOCATED -- NUMBER
|
||||
, TEMP_SPACE_ALLOCATED -- NUMBER
|
||||
FROM
|
||||
v$active_session_history a
|
||||
-- , dba_users u
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
/
|
||||
|
||||
GRANT SELECT ON t$ash TO public;
|
||||
CREATE PUBLIC SYNONYM t$ash FOR sys.t$ash;
|
||||
89
tpt/ash/daplanline.sql
Normal file
89
tpt/ash/daplanline.sql
Normal file
@@ -0,0 +1,89 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: daplanline.sql (v1.0)
|
||||
--
|
||||
-- Purpose: Report response time consumption data from DBA_HIST_ACTIVE_SESS_HISTORY
|
||||
-- by top SQL PLAN rowsource TYPE (not individual SQL)
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) http://blog.tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @daplanline SYSDATE-1 SYSDATE
|
||||
-- @daplanline DATE'2013-11-11' DATE'2013-11-12'
|
||||
-- @daplanline "TIMESTAMP'2013-11-11 10:00:00'" "TIMESTAMP'2013-11-11 15:00:00'"
|
||||
-- ^^^- note the double quotes around the timestamp syntax, needed due to spaces
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics and Tuning pack licenses for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation FOR a100
|
||||
COL asqlmon_predicates FOR a100 word_wrap
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD CHILD# NOPRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "Line ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "Parent" FOR 9999
|
||||
COL daplanline_plan_line FOR A60 HEAD "Plan Line"
|
||||
|
||||
BREAK ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
WITH sq AS (
|
||||
SELECT
|
||||
-- to_char(ash.sample_time, 'YYYY-MM-DD HH24') sample_time
|
||||
count(*) samples
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
FROM
|
||||
dba_hist_active_sess_history ash
|
||||
WHERE
|
||||
sample_time BETWEEN &1 AND &2
|
||||
AND snap_id IN (SELECT snap_id FROM dba_hist_snapshot WHERE begin_interval_time >= &1 AND end_interval_time <= &2)
|
||||
AND session_type = 'FOREGROUND'
|
||||
GROUP BY
|
||||
--to_char(ash.sample_time, 'YYYY-MM-DD HH24')
|
||||
ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
sq.samples * 10 seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER () * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, sq.sample_time asqlmon_sample_time
|
||||
, sq.sql_plan_operation ||' '|| sq.sql_plan_options daplanline_plan_line
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
FROM
|
||||
sq
|
||||
WHERE
|
||||
1=1
|
||||
ORDER BY
|
||||
--sq.sample_time
|
||||
seconds DESC
|
||||
)
|
||||
WHERE
|
||||
rownum <= 30
|
||||
/
|
||||
137
tpt/ash/dash_wait_chains.sql
Normal file
137
tpt/ash/dash_wait_chains.sql
Normal file
@@ -0,0 +1,137 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dash_wait_chains.sql (v0.8)
|
||||
-- Purpose: Display ASH wait chains (multi-session wait signature, a session
|
||||
-- waiting for another session etc.)
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) https://tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dash_wait_chains <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @dash_wait_chains username||':'||program2||event2 session_type='FOREGROUND' sysdate-1 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the DBA_HIST_ACTIVE_SESS_HISTORY view, use
|
||||
-- @ash_wait_chains.sql for accessiong the GV$ ASH view for realtime info
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL wait_chain FOR A300 WORD_WRAP
|
||||
COL "%This" FOR A6
|
||||
|
||||
PROMPT
|
||||
PROMPT -- Display ASH Wait Chain Signatures script v0.8 by Tanel Poder ( https://tanelpoder.com )
|
||||
|
||||
WITH
|
||||
bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat),
|
||||
ash AS (SELECT /*+ INLINE QB_NAME(ash) LEADING(a) USE_HASH(u) SWAP_JOIN_INPUTS(u) */
|
||||
a.*
|
||||
, o.*
|
||||
, SUBSTR(TO_CHAR(a.sample_time, 'YYYYMMDDHH24MISS'),1,13) sample_time_10s -- ASH dba_hist_ samples stored every 10sec
|
||||
, u.username
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, NVL(a.event||CASE WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||NVL((SELECT class FROM bclass WHERE r = a.p3),'undo @bclass '||a.p3)||']' ELSE null END,'ON CPU')
|
||||
|| ' ' event2
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
),
|
||||
ash_samples AS (SELECT /*+ INLINE */ DISTINCT sample_time_10s FROM ash),
|
||||
ash_data AS (SELECT /*+ INLINE */ * FROM ash),
|
||||
chains AS (
|
||||
SELECT /*+ INLINE */
|
||||
d.sample_time_10s ts
|
||||
, level lvl
|
||||
, session_id sid
|
||||
, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 AND d.blocking_session IS NOT NULL THEN ' -> [idle blocker '||d.blocking_inst_id||','||d.blocking_session||','||d.blocking_session_serial#||(SELECT ' ('||s.program||')' FROM gv$session s WHERE (s.inst_id, s.sid , s.serial#) = ((d.blocking_inst_id,d.blocking_session,d.blocking_session_serial#)))||']' ELSE NULL END path -- there's a reason why I'm doing this
|
||||
--, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ') path -- there's a reason why I'm doing this (ORA-30004 :)
|
||||
--, SYS_CONNECT_BY_PATH(&1, ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 THEN '('||d.session_id||')' ELSE NULL END path
|
||||
--, REPLACE(SYS_CONNECT_BY_PATH(&1, '->'), '->', ' -> ')||CASE WHEN CONNECT_BY_ISLEAF = 1 THEN ' [sid='||d.session_id||' seq#='||TO_CHAR(seq#)||']' ELSE NULL END path -- there's a reason why I'm doing this (ORA-30004 :)
|
||||
, CASE WHEN CONNECT_BY_ISLEAF = 1 THEN d.session_id ELSE NULL END sids
|
||||
, CONNECT_BY_ISLEAF isleaf
|
||||
, CONNECT_BY_ISCYCLE iscycle
|
||||
, d.*
|
||||
FROM
|
||||
ash_samples s
|
||||
, ash_data d
|
||||
WHERE
|
||||
s.sample_time_10s = d.sample_time_10s
|
||||
AND d.sample_time BETWEEN &3 AND &4
|
||||
CONNECT BY NOCYCLE
|
||||
( PRIOR d.blocking_session = d.session_id
|
||||
AND PRIOR s.sample_time_10s = d.sample_time_10s
|
||||
AND PRIOR d.blocking_inst_id = d.instance_number)
|
||||
START WITH &2
|
||||
)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, COUNT(*) * 10 seconds
|
||||
, ROUND(COUNT(*) * 10 / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, path wait_chain
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
, COUNT(DISTINCT sids) num_sids
|
||||
, MIN(sids)
|
||||
, MAX(sids)
|
||||
FROM
|
||||
chains
|
||||
WHERE
|
||||
isleaf = 1
|
||||
GROUP BY
|
||||
&1
|
||||
, path
|
||||
ORDER BY
|
||||
COUNT(*) DESC
|
||||
)
|
||||
WHERE
|
||||
rownum <= 30
|
||||
/
|
||||
|
||||
98
tpt/ash/dashpeak.sql
Normal file
98
tpt/ash/dashpeak.sql
Normal file
@@ -0,0 +1,98 @@
|
||||
-- Copyright 2020 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashpeak.sql
|
||||
-- Purpose:
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) https://tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @ashpeak <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashpeak.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%Total" FOR A7 JUST RIGHT
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999999999.9
|
||||
COL log2_aas_4k FOR A14 HEAD "Log(2,AAS)" JUST LEFT
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
PROMPT
|
||||
PROMPT AAS by &1 within time range between &3 and &4
|
||||
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT
|
||||
&1
|
||||
, COUNT(*) * 10 totalseconds
|
||||
, ROUND(COUNT(*) * 10 / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400, 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*) * 10) OVER () * 100)||'%',5,' ') "%Total"
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND(LOG(2,COUNT(*) * 10 / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400), 1), '#'),' '), 12)||'|' log2_aas_4k
|
||||
FROM (
|
||||
SELECT
|
||||
TRUNC(sample_time, 'DD') dd
|
||||
, TRUNC(sample_time, 'HH') hh
|
||||
, TRUNC(sample_time, 'MI') mi
|
||||
, TO_DATE(SUBSTR(TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI'), 1, 15)||'0', 'YYYY-MM-DD HH24:MI') mt
|
||||
, CAST(sample_time AS DATE) ss
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, a.*
|
||||
, u.username
|
||||
, o.*
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
)
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
&1
|
||||
/
|
||||
|
||||
119
tpt/ash/dashpeaktop.sql
Normal file
119
tpt/ash/dashpeaktop.sql
Normal file
@@ -0,0 +1,119 @@
|
||||
-- Copyright 2020 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: ashpeak.sql
|
||||
-- Purpose:
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) https://tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dashpeaktop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the in-memory GV$ACTIVE_SESSION_HISTORY, use
|
||||
-- @dashpeak.sql for accessiong the DBA_HIST_ACTIVE_SESS_HISTORY archive
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%Total" FOR A7 JUST RIGHT
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999999999.9
|
||||
COL log2_aas_4k FOR A14 HEAD "Log(2,AAS)" JUST LEFT
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
PROMPT
|
||||
PROMPT Top AAS peaks within time range between &3 and &4
|
||||
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&1
|
||||
, COUNT(*) sessions
|
||||
, COUNT(*) * 10 totalseconds
|
||||
, ROUND(COUNT(*) * 10 / NULLIF(CAST(MAX(sample_time) AS DATE) - CAST(MIN(sample_time) AS DATE),0) / 86400, 1) AAS
|
||||
FROM (
|
||||
SELECT
|
||||
TRUNC(sample_time, 'DD') dd
|
||||
, TRUNC(sample_time, 'HH') hh
|
||||
, TRUNC(sample_time, 'MI') mi
|
||||
, TO_DATE(SUBSTR(TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI'), 1, 15)||'0', 'YYYY-MM-DD HH24:MI') mt
|
||||
, CAST(sample_time AS DATE) ss
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, a.*
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
&2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
)
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
totalseconds DESC
|
||||
)
|
||||
WHERE
|
||||
rownum <= 25
|
||||
/
|
||||
|
||||
150
tpt/ash/dashtop.sql
Normal file
150
tpt/ash/dashtop.sql
Normal file
@@ -0,0 +1,150 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dashtop.sql v1.2
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dashtop <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @dashtop username,sql_id session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses only the AWR's DBA_HIST_ACTIVE_SESS_HISTORY, use
|
||||
-- @dashtop.sql for accessiong the V$ ASH view
|
||||
--
|
||||
--
|
||||
-- TODO:
|
||||
-- Deal with cases where there's no AWR snapshot saved to DBA_HIST_SNAPSHOTS
|
||||
-- (due to a DB issue) but DBA_HIST_ASH samples are there
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
COL "%This" FOR A7
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A46 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
COL sql_plan_op FOR A40
|
||||
|
||||
SELECT /*+ qb_name(main) */ * FROM (
|
||||
WITH bclass AS (SELECT class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
10 * COUNT(*) "TotalSeconds"
|
||||
, ROUND(10 * COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, &1
|
||||
-- , 10 * SUM(CASE WHEN wait_class IS NULL THEN 1 ELSE 0 END) "CPU"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='User I/O' THEN 1 ELSE 0 END) "User I/O"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Application' THEN 1 ELSE 0 END) "Application"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Concurrency' THEN 1 ELSE 0 END) "Concurrency"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Commit' THEN 1 ELSE 0 END) "Commit"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Configuration' THEN 1 ELSE 0 END) "Configuration"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Cluster' THEN 1 ELSE 0 END) "Cluster"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Idle' THEN 1 ELSE 0 END) "Idle"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Network' THEN 1 ELSE 0 END) "Network"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='System I/O' THEN 1 ELSE 0 END) "System I/O"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Scheduler' THEN 1 ELSE 0 END) "Scheduler"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Administrative' THEN 1 ELSE 0 END) "Administrative"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Queueing' THEN 1 ELSE 0 END) "Queueing"
|
||||
-- , 10 * SUM(CASE WHEN wait_class ='Other' THEN 1 ELSE 0 END) "Other"
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, a.instance_number AS inst_id
|
||||
, a.sql_plan_operation||' '||a.sql_plan_options sql_plan_op
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, NVL(event, session_state)||
|
||||
CASE
|
||||
WHEN event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
-- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
END event2
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM dba_hist_active_sess_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND a.sample_time BETWEEN &3 AND &4
|
||||
--AND a.dbid = (SELECT d.dbid FROM v$database d) -- for partition pruning
|
||||
--AND a.snap_id IN (SELECT sn.snap_id FROM dba_hist_snapshot sn WHERE sn.begin_interval_time >= &3 AND sn.end_interval_time <= &4) -- for partition pruning
|
||||
AND snap_id IN (SELECT snap_id FROM dba_hist_snapshot WHERE sample_time BETWEEN &3 AND &4) -- for partition pruning
|
||||
--AND (a.dbid, a.snap_id) IN (SELECT d.dbid, sn.snap_id FROM v$database d, dba_hist_snapshot sn WHERE d.dbid = sn.dbid AND sn.begin_interval_time >= &3 AND sn.end_interval_time <= &4) -- for partition pruning
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
"TotalSeconds" DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
154
tpt/ash/dashtopsum.sql
Normal file
154
tpt/ash/dashtopsum.sql
Normal file
@@ -0,0 +1,154 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dashtopsum.sql v1.3
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions AND (potentially lossy) SUM of IO rate metrics
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dashtopsum <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @dashtopsum username,sql_opname session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses the DBA_HIST_ACTIVE_SESS_HISTORY archive in AWR repo
|
||||
-- use
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
COL rd_rq FOR 99,999,999,999
|
||||
COL wr_rq FOR 99,999,999,999
|
||||
COL rd_mb FOR 99,999,999,999
|
||||
COL wr_mb FOR 99,999,999,999
|
||||
COL pgamem_mb FOR 9,999,999
|
||||
COL tempspc_mb FOR 99,999,999
|
||||
|
||||
PROMPT This is an experimental script as some documentation/explanation is needed.
|
||||
PROMPT The ASH "delta" metrics are not tied to individual SQL_IDs or wait events,
|
||||
PROMPT They are valid in the session scope (and related mostly static attributes,
|
||||
PROMPT like PROGRAM, MACHINE, MODULE). Which SQL_ID/operation/event happens to be
|
||||
PROMPT active when ASH samples its data is just matter of luck.
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
10 * COUNT(*) totalseconds
|
||||
, ROUND(10 * COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, SUM(delta_read_io_requests) rd_rq
|
||||
, SUM(delta_write_io_requests) wr_rq
|
||||
, SUM(delta_read_io_bytes)/1048576 rd_mb
|
||||
, SUM(delta_write_io_bytes)/1048576 wr_mb
|
||||
--, SUM(delta_interconnect_io_bytes)
|
||||
--, SUM(delta_read_mem_bytes)
|
||||
, MAX(pga_allocated)/1048576 pgamem_mb
|
||||
, MAX(temp_space_allocated)/1048576 tempspc_mb
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, TRUNC(px_flags / 2097152) dop
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM dba_hist_active_sess_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
TotalSeconds DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
154
tpt/ash/dashtopsum_pga.sql
Normal file
154
tpt/ash/dashtopsum_pga.sql
Normal file
@@ -0,0 +1,154 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dashtopsum.sql v1.3
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by your
|
||||
-- specified dimensions AND (potentially lossy) SUM of IO rate metrics
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @dashtopsum <grouping_cols> <filters> <fromtime> <totime>
|
||||
--
|
||||
-- Example:
|
||||
-- @dashtopsum username,sql_opname session_type='FOREGROUND' sysdate-1/24 sysdate
|
||||
--
|
||||
-- Other:
|
||||
-- This script uses the DBA_HIST_ACTIVE_SESS_HISTORY archive in AWR repo
|
||||
-- use
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
COL "%This" FOR A7
|
||||
--COL p1 FOR 99999999999999
|
||||
--COL p2 FOR 99999999999999
|
||||
--COL p3 FOR 99999999999999
|
||||
COL p1text FOR A30 word_wrap
|
||||
COL p2text FOR A30 word_wrap
|
||||
COL p3text FOR A30 word_wrap
|
||||
COL p1hex FOR A17
|
||||
COL p2hex FOR A17
|
||||
COL p3hex FOR A17
|
||||
COL dop FOR 99
|
||||
COL AAS FOR 9999.9
|
||||
COL totalseconds HEAD "Total|Seconds" FOR 99999999
|
||||
COL dist_sqlexec_seen HEAD "Distinct|Execs Seen" FOR 999999
|
||||
COL dist_timestamps HEAD "Distinct|Tstamps" FOR 999999
|
||||
COL event FOR A42 WORD_WRAP
|
||||
COL event2 FOR A42 WORD_WRAP
|
||||
COL time_model_name FOR A50 WORD_WRAP
|
||||
COL program2 FOR A40 TRUNCATE
|
||||
COL username FOR A20 wrap
|
||||
COL obj FOR A30
|
||||
COL objt FOR A50
|
||||
COL sql_opname FOR A20
|
||||
COL top_level_call_name FOR A30
|
||||
COL wait_class FOR A15
|
||||
|
||||
COL rd_rq FOR 99,999,999,999
|
||||
COL wr_rq FOR 99,999,999,999
|
||||
COL rd_mb FOR 99,999,999,999
|
||||
COL wr_mb FOR 99,999,999,999
|
||||
COL pgamem_mb FOR 9,999,999
|
||||
COL tempspc_mb FOR 99,999,999
|
||||
|
||||
PROMPT This is an experimental script as some documentation/explanation is needed.
|
||||
PROMPT The ASH "delta" metrics are not tied to individual SQL_IDs or wait events,
|
||||
PROMPT They are valid in the session scope (and related mostly static attributes,
|
||||
PROMPT like PROGRAM, MACHINE, MODULE). Which SQL_ID/operation/event happens to be
|
||||
PROMPT active when ASH samples its data is just matter of luck.
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM (
|
||||
WITH bclass AS (SELECT /*+ INLINE */ class, ROWNUM r from v$waitstat)
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
10 * COUNT(*) totalseconds
|
||||
, ROUND(10 * COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, SUM(delta_read_io_requests) rd_rq
|
||||
, SUM(delta_write_io_requests) wr_rq
|
||||
, SUM(delta_read_io_bytes)/1048576 rd_mb
|
||||
, SUM(delta_write_io_bytes)/1048576 wr_mb
|
||||
--, SUM(delta_interconnect_io_bytes)
|
||||
--, SUM(delta_read_mem_bytes)
|
||||
, MAX(pga_allocated)/1048576 pgamem_mb
|
||||
, MAX(temp_space_allocated)/1048576 tempspc_mb
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
, COUNT(DISTINCT sample_time) dist_timestamps
|
||||
FROM
|
||||
(SELECT
|
||||
a.*
|
||||
, session_id sid
|
||||
, session_serial# serial
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p1 ELSE null END, '0XXXXXXXXXXXXXXX') p1hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p2 ELSE null END, '0XXXXXXXXXXXXXXX') p2hex
|
||||
, TO_CHAR(CASE WHEN session_state = 'WAITING' THEN p3 ELSE null END, '0XXXXXXXXXXXXXXX') p3hex
|
||||
, TRUNC(px_flags / 2097152) dop
|
||||
, NVL(a.event, a.session_state)||
|
||||
CASE
|
||||
WHEN a.event like 'enq%' AND session_state = 'WAITING'
|
||||
THEN ' [mode='||BITAND(p1, POWER(2,14)-1)||']'
|
||||
WHEN a.event IN (SELECT name FROM v$event_name WHERE parameter3 = 'class#')
|
||||
THEN ' ['||CASE WHEN a.p3 <= (SELECT MAX(r) FROM bclass)
|
||||
THEN (SELECT class FROM bclass WHERE r = a.p3)
|
||||
ELSE (SELECT DECODE(MOD(BITAND(a.p3,TO_NUMBER('FFFF','XXXX')) - 17,2),0,'undo header',1,'undo data', 'error') FROM dual)
|
||||
END ||']'
|
||||
ELSE null
|
||||
END event2 -- event is NULL in ASH if the session is not waiting (session_state = ON CPU)
|
||||
, CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
|
||||
REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
|
||||
ELSE
|
||||
'('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
|
||||
END || ' ' program2
|
||||
, CASE WHEN BITAND(time_model, POWER(2, 01)) = POWER(2, 01) THEN 'DBTIME ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 02)) = POWER(2, 02) THEN 'BACKGROUND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 03)) = POWER(2, 03) THEN 'CONNECTION_MGMT ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 04)) = POWER(2, 04) THEN 'PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 05)) = POWER(2, 05) THEN 'FAILED_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 06)) = POWER(2, 06) THEN 'NOMEM_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 07)) = POWER(2, 07) THEN 'HARD_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 08)) = POWER(2, 08) THEN 'NO_SHARERS_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 09)) = POWER(2, 09) THEN 'BIND_MISMATCH_PARSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 10)) = POWER(2, 10) THEN 'SQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 11)) = POWER(2, 11) THEN 'PLSQL_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 12)) = POWER(2, 12) THEN 'PLSQL_RPC ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 13)) = POWER(2, 13) THEN 'PLSQL_COMPILATION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 14)) = POWER(2, 14) THEN 'JAVA_EXECUTION ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 15)) = POWER(2, 15) THEN 'BIND ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 16)) = POWER(2, 16) THEN 'CURSOR_CLOSE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 17)) = POWER(2, 17) THEN 'SEQUENCE_LOAD ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 18)) = POWER(2, 18) THEN 'INMEMORY_QUERY ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 19)) = POWER(2, 19) THEN 'INMEMORY_POPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 20)) = POWER(2, 20) THEN 'INMEMORY_PREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 21)) = POWER(2, 21) THEN 'INMEMORY_REPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 22)) = POWER(2, 22) THEN 'INMEMORY_TREPOPULATE ' END
|
||||
||CASE WHEN BITAND(time_model, POWER(2, 23)) = POWER(2, 23) THEN 'TABLESPACE_ENCRYPTION ' END time_model_name
|
||||
FROM dba_hist_active_sess_history a) a
|
||||
, dba_users u
|
||||
, (SELECT
|
||||
object_id,data_object_id,owner,object_name,subobject_name,object_type
|
||||
, owner||'.'||object_name obj
|
||||
, owner||'.'||object_name||' ['||object_type||']' objt
|
||||
FROM dba_objects) o
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND a.current_obj# = o.object_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
pgamem_mb DESC NULLS LAST
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
107
tpt/ash/dasqlmon.sql
Normal file
107
tpt/ash/dasqlmon.sql
Normal file
@@ -0,0 +1,107 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dasqlmon.sql (v1.2)
|
||||
--
|
||||
-- Purpose: Report SQL-monitoring-style drill-down into where in an execution plan the execution time is spent
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) https://tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @dasqlmon <sqlid> <plan_hash_value> <from_time> <to_time>
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics license for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEAD Plan_Operation FOR a70
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD "CHILD" PRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
BREAK ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon v1.1 - by Tanel Poder ( https://tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
dba_hist_active_sess_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_plan_hash_value LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT
|
||||
plan.sql_id asqlmon_sql_id
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples * 10 seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, LPAD(' ', depth, ' ') || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| plan.access_predicates END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:]' || plan.filter_predicates END asqlmon_predicates
|
||||
-- , plan.projection
|
||||
FROM
|
||||
dba_hist_sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.plan_hash_value LIKE '&2'
|
||||
ORDER BY
|
||||
plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
107
tpt/ash/dasqlmonx.sql
Normal file
107
tpt/ash/dasqlmonx.sql
Normal file
@@ -0,0 +1,107 @@
|
||||
-- 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.
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: dasqlmon.sql (v1.2)
|
||||
--
|
||||
-- Purpose: Report SQL-monitoring-style drill-down into where in an execution plan the execution time is spent
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
--
|
||||
-- Copyright: (c) https://tanelpoder.com - All rights reserved.
|
||||
--
|
||||
-- Disclaimer: This script is provided "as is", no warranties nor guarantees are
|
||||
-- made. Use at your own risk :)
|
||||
--
|
||||
-- Usage: @dasqlmon <sqlid> <plan_hash_value> <from_time> <to_time>
|
||||
--
|
||||
-- Notes: This script runs on Oracle 11g+ and you should have the
|
||||
-- Diagnostics license for using it as it queries
|
||||
-- some separately licensed views.
|
||||
--
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
SET LINESIZE 999 PAGESIZE 5000 TRIMOUT ON TRIMSPOOL ON
|
||||
|
||||
COL asqlmon_operation HEAD Plan_Operation FOR a70
|
||||
COL asqlmon_predicates HEAD PREDICATES FOR a100 word_wrap
|
||||
COL obj_alias_qbc_name FOR a40
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE
|
||||
COL asqlmon_sql_id HEAD SQL_ID NOPRINT
|
||||
COL asqlmon_sql_child HEAD "CHILD" PRINT
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
COL projection FOR A520
|
||||
|
||||
COL pct_child HEAD "Activity %" FOR A8
|
||||
COL pct_child_vis HEAD "Visual" FOR A12
|
||||
|
||||
COL asqlmon_id HEAD "ID" FOR 9999
|
||||
COL asqlmon_parent_id HEAD "PID" FOR 9999
|
||||
|
||||
BREAK ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sample_time SKIP 1 DUP ON asqlmon_operation
|
||||
|
||||
PROMPT
|
||||
PROMPT -- ASQLMon v1.1 - by Tanel Poder ( https://tanelpoder.com ) - Display SQL execution plan line level activity breakdown from ASH
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT
|
||||
count(*) samples
|
||||
, ash.sql_id
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1) sql_plan_line_id -- this is because simple "planless" operations like single-row insert
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
-- , AVG(ash.p3) avg_p3 -- p3 is sometimes useful for listing block counts for IO wait events
|
||||
FROM
|
||||
dba_hist_active_sess_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_plan_hash_value LIKE '&2'
|
||||
AND ash.sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
ash.sql_id
|
||||
, ash.sql_plan_hash_value
|
||||
, NVL(ash.sql_plan_line_id,1)
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
, ash.session_state
|
||||
, ash.event
|
||||
)
|
||||
SELECT
|
||||
plan.sql_id asqlmon_sql_id
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples * 10 seconds
|
||||
, LPAD(TO_CHAR(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9)||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, LPAD(plan.id,4)||CASE WHEN parent_id IS NULL THEN ' ' ELSE ' <- ' END||LPAD(plan.parent_id,4) asqlmon_plan_id
|
||||
, plan.id asqlmon_id
|
||||
, plan.parent_id asqlmon_parent_id
|
||||
, LPAD(' ', depth, ' ') || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, sq.session_state
|
||||
, sq.event
|
||||
-- , sq.avg_p3
|
||||
, plan.object_alias || CASE WHEN plan.qblock_name IS NOT NULL THEN ' ['|| plan.qblock_name || ']' END obj_alias_qbc_name
|
||||
, CASE WHEN plan.access_predicates IS NOT NULL THEN '[A:] '|| plan.access_predicates END || CASE WHEN plan.filter_predicates IS NOT NULL THEN ' [F:]' || plan.filter_predicates END asqlmon_predicates
|
||||
, plan.projection
|
||||
FROM
|
||||
dba_hist_sql_plan plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.plan_hash_value LIKE '&2'
|
||||
ORDER BY
|
||||
plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
70
tpt/ash/devent_hist.sql
Normal file
70
tpt/ash/devent_hist.sql
Normal file
@@ -0,0 +1,70 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: devent_hist.sql
|
||||
-- Purpose: Display wait event duration histogram from DBA_HIST_ACTIVE_SESS_HISTORY
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com | @tanelpoder
|
||||
--
|
||||
-- Usage:
|
||||
-- @ash/devent_hist file 1=1 sysdate-1 sysdate
|
||||
-- @ash/devent_hist file 1=1 "TIMESTAMP'2014-06-05 09:30:00'" "TIMESTAMP'2014-06-05 09:35:00'"
|
||||
--
|
||||
-- Other:
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
--
|
||||
--------------------------------------------------------------------------------------------------
|
||||
|
||||
COL evh_event HEAD "Wait Event" for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR A15 JUST RIGHT
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits" FOR 999,999,999.9
|
||||
COL first_seen FOR A25
|
||||
COL last_seen FOR A25
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.evh_event
|
||||
, e.evh_millisec
|
||||
, e.evh_sample_count
|
||||
, e.evh_est_event_count
|
||||
, e.evh_est_total_sec
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
, first_seen
|
||||
, last_seen
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END) * 10 / 1000,1 ) evh_est_total_sec
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
FROM
|
||||
dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
46
tpt/ash/devent_hist_micro.sql
Normal file
46
tpt/ash/devent_hist_micro.sql
Normal file
@@ -0,0 +1,46 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket us+" FOR A15 JUST RIGHT
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.*
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END)/1000000,1) evh_est_total_sec
|
||||
FROM
|
||||
dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
37
tpt/ash/disk_rereads.sql
Normal file
37
tpt/ash/disk_rereads.sql
Normal 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.
|
||||
|
||||
-- experimental script - it will only capture a tiny portion of disk reread waits
|
||||
-- due to relatively infrequent sampling of ASH
|
||||
|
||||
SELECT
|
||||
SUM(rereads)
|
||||
, t.tablespace_name
|
||||
, ts.block_size
|
||||
, o.owner
|
||||
, o.object_name
|
||||
FROM
|
||||
(SELECT current_obj#, p1, p2, TO_CHAR(p1)||':'||TO_CHAR(p2), COUNT(*) rereads
|
||||
FROM v$active_session_history
|
||||
WHERE
|
||||
sample_time < SYSDATE-1/24
|
||||
AND event = 'db file sequential read'
|
||||
GROUP BY
|
||||
current_obj#, p1, p2
|
||||
HAVING
|
||||
COUNT(*) > 1
|
||||
) a
|
||||
, dba_data_files t
|
||||
, dba_tablespaces ts
|
||||
, dba_objects o
|
||||
WHERE
|
||||
a.p1 = t.file_id
|
||||
AND t.tablespace_name = ts.tablespace_name
|
||||
AND a.current_obj# = o.object_id (+)
|
||||
GROUP BY
|
||||
t.tablespace_name
|
||||
, ts.block_size
|
||||
, o.owner
|
||||
, o.object_name
|
||||
ORDER BY SUM(rereads) DESC
|
||||
/
|
||||
53
tpt/ash/event_hist.sql
Normal file
53
tpt/ash/event_hist.sql
Normal file
@@ -0,0 +1,53 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD "Wait Event" for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time" FOR 990.9
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,990.9
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR A15 JUST RIGHT
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits" FOR 999,999,990.9
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.evh_event
|
||||
, e.evh_millisec
|
||||
, e.evh_sample_count
|
||||
, e.evh_est_event_count
|
||||
, e.evh_est_total_sec
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
, first_seen
|
||||
, last_seen
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END) / 1000,1) evh_est_total_sec
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
FROM
|
||||
gv$active_session_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
55
tpt/ash/event_hist_cell.sql
Normal file
55
tpt/ash/event_hist_cell.sql
Normal 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR A15 JUST RIGHT
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
COL evh_cell_path HEAD "Cell Path" FOR A16
|
||||
|
||||
BREAK ON evh_event SKIP 1 ON evh_cell_path SKIP 1 NODUPLICATES
|
||||
|
||||
PROMPT Showing only CELL wait events as they have the wait_event.p1 = v$cell.cell_hashval link...
|
||||
|
||||
SELECT
|
||||
e.*
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, c.cell_path evh_cell_path
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END) / 1000,1) evh_est_total_sec
|
||||
FROM
|
||||
V$ACTIVE_SESSION_HISTORY a
|
||||
, v$cell c
|
||||
--dba_hist_active_sess_history
|
||||
WHERE
|
||||
c.cell_hashval = a.p1
|
||||
AND regexp_like(a.event, '&1')
|
||||
AND &2
|
||||
AND a.sample_time BETWEEN &3 AND &4
|
||||
AND a.session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND a.time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, c.cell_path
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_cell_path
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
54
tpt/ash/event_hist_micro.sql
Normal file
54
tpt/ash/event_hist_micro.sql
Normal file
@@ -0,0 +1,54 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD "Wait Event" for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time" FOR 990.9
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,990.9
|
||||
COL evh_millisec HEAD "Wait time|bucket us+" FOR A15 JUST RIGHT
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits" FOR 999,999,990.9
|
||||
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
e.evh_event
|
||||
, evh_millisec
|
||||
, evh_sample_count
|
||||
, evh_est_event_count
|
||||
, evh_est_total_sec
|
||||
, ROUND ( 100 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT(evh_est_total_sec) OVER (PARTITION BY evh_event)), '#'),' '), 10)||'|' evh_graph
|
||||
, first_seen
|
||||
, last_seen
|
||||
FROM (
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END)/1000000,1) evh_est_total_sec
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited)))) END -- evh_millisec
|
||||
) e
|
||||
ORDER BY
|
||||
evh_event
|
||||
, evh_millisec
|
||||
/
|
||||
|
||||
38
tpt/ash/evet_hist_cell.sql
Normal file
38
tpt/ash/evet_hist_cell.sql
Normal file
@@ -0,0 +1,38 @@
|
||||
-- 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.
|
||||
|
||||
-- this scripts uses "ASH math" by Graham Wood, Uri Shaft and John Beresniewicz for
|
||||
-- estimating the event counts (and average durations)
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Awesome|Graphic" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_ms HEAD "Estimated|Total ms"
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+"
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
event evh_event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*),1) evh_est_total_ms
|
||||
, ROUND ( 100 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event)), '#'),' '), 10)||'|' evh_graph
|
||||
FROM
|
||||
V$ACTIVE_SESSION_HISTORY
|
||||
--dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND sample_time > SYSDATE - 1
|
||||
AND time_waited > 0 -- TODO
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
ORDER BY 1, 2
|
||||
/
|
||||
|
||||
43
tpt/ash/examples/ash10.sql
Normal file
43
tpt/ash/examples/ash10.sql
Normal file
@@ -0,0 +1,43 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
COL sql_plan_step FOR A50 WORD_WRAP
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.session_state
|
||||
, a.event
|
||||
, a.sql_id
|
||||
, a.blocking_session_status
|
||||
, a.blocking_session
|
||||
, a.blocking_session_serial#
|
||||
, a.current_obj#
|
||||
, a.sql_plan_line_id
|
||||
, a.sql_plan_operation ||' '||a.sql_plan_options sql_plan_step
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
DBA_HIST_ACTIVE_SESS_HISTORY a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-20 17:25:00' AND TIMESTAMP'2011-01-20 18:55:00'
|
||||
AND a.event = 'enq: TX - index contention'
|
||||
GROUP BY
|
||||
a.session_state
|
||||
, a.event
|
||||
, a.sql_id
|
||||
, a.blocking_session_status
|
||||
, a.blocking_session
|
||||
, a.blocking_session_serial#
|
||||
, a.current_obj#
|
||||
, a.sql_plan_line_id
|
||||
, a.sql_plan_operation ||' '||a.sql_plan_options
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
32
tpt/ash/examples/ash11.sql
Normal file
32
tpt/ash/examples/ash11.sql
Normal 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.
|
||||
|
||||
SET LINES 999 PAGES 5000 TRIMSPOOL ON TRIMOUT ON VERIFY OFF
|
||||
|
||||
COL sql_plan_step FOR A50 WORD_WRAP
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.session_type
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.sql_id
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
DBA_HIST_ACTIVE_SESS_HISTORY a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-05-14 06:00:00' AND TIMESTAMP'2011-05-14 06:10:00'
|
||||
GROUP BY
|
||||
a.session_type
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.sql_id
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
90
tpt/ash/examples/ash12a.sql
Normal file
90
tpt/ash/examples/ash12a.sql
Normal file
@@ -0,0 +1,90 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SPOOL ash12.txt
|
||||
|
||||
--DEF from_time="2010-10-30 18:12:00"
|
||||
--DEF to_time="2010-10-30 18:14:00"
|
||||
DEF cols=session_type,program,sql_opcode
|
||||
|
||||
--PROMPT FROM_TIME=&from_time TO_TIME=&to_time
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
END stage
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
FROM
|
||||
gv$active_session_history
|
||||
-- dba_hist_active_sess_history
|
||||
WHERE
|
||||
1=1
|
||||
--AND sample_time BETWEEN TIMESTAMP'from_time' AND TIMESTAMP'to_time'
|
||||
AND session_state = 'ON CPU'
|
||||
AND event IS NULL
|
||||
AND sql_id IS NULL
|
||||
GROUP BY
|
||||
&cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
END
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
DEF cols=module
|
||||
/
|
||||
|
||||
DEF cols=action
|
||||
/
|
||||
|
||||
DEF cols=user_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode,top_level_sql_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,plsql_object_id,plsql_subprogram_id
|
||||
/
|
||||
|
||||
DEF cols=wait_class,event
|
||||
/
|
||||
|
||||
DEF cols=sql_id,wait_class
|
||||
/
|
||||
|
||||
DEF cols=sql_id,event
|
||||
/
|
||||
|
||||
DEF cols=program,event
|
||||
/
|
||||
|
||||
|
||||
SPOOL OFF
|
||||
|
||||
73
tpt/ash/examples/ash13.sql
Normal file
73
tpt/ash/examples/ash13.sql
Normal 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.
|
||||
|
||||
SET LINES 999 PAGES 5000 TRIMSPOOL ON TRIMOUT ON VERIFY OFF
|
||||
|
||||
SPOOL ash13.txt
|
||||
|
||||
--DEF from_time="2010-10-30 18:12:00"
|
||||
--DEF to_time="2010-10-30 18:14:00"
|
||||
DEF cols=session_type,program,sql_opcode
|
||||
|
||||
--PROMPT FROM_TIME=&from_time TO_TIME=&to_time
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&cols
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
FROM
|
||||
gv$active_session_history
|
||||
-- dba_hist_active_sess_history
|
||||
WHERE
|
||||
1=1
|
||||
-- AND sample_time BETWEEN TIMESTAMP'from_time' AND TIMESTAMP'to_time'
|
||||
-- AND event IS NULL
|
||||
-- AND sql_id IS NULL
|
||||
GROUP BY
|
||||
&cols
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
DEF cols=event
|
||||
/
|
||||
|
||||
DEF cols=sql_id
|
||||
/
|
||||
|
||||
DEF cols=module
|
||||
/
|
||||
|
||||
DEF cols=action
|
||||
/
|
||||
|
||||
DEF cols=user_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode,top_level_sql_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,plsql_object_id,plsql_subprogram_id
|
||||
/
|
||||
|
||||
DEF cols=wait_class,event
|
||||
/
|
||||
|
||||
DEF cols=sql_id,wait_class
|
||||
/
|
||||
|
||||
DEF cols=sql_id,event
|
||||
/
|
||||
|
||||
DEF cols=program,event
|
||||
/
|
||||
|
||||
|
||||
SPOOL OFF
|
||||
|
||||
73
tpt/ash/examples/ash13a.sql
Normal file
73
tpt/ash/examples/ash13a.sql
Normal 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.
|
||||
|
||||
SET LINES 999 PAGES 5000 TRIMSPOOL ON TRIMOUT ON VERIFY OFF
|
||||
|
||||
SPOOL ash13a.txt
|
||||
|
||||
--DEF from_time="2010-10-30 18:12:00"
|
||||
--DEF to_time="2010-10-30 18:14:00"
|
||||
DEF cols=session_type,program,sql_opcode
|
||||
|
||||
--PROMPT FROM_TIME=&from_time TO_TIME=&to_time
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&cols
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
FROM
|
||||
gv$active_session_history
|
||||
-- dba_hist_active_sess_history
|
||||
WHERE
|
||||
1=1
|
||||
-- AND sample_time BETWEEN TIMESTAMP'from_time' AND TIMESTAMP'to_time'
|
||||
-- AND event IS NULL
|
||||
-- AND sql_id IS NULL
|
||||
GROUP BY
|
||||
&cols
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
DEF cols=event
|
||||
/
|
||||
|
||||
DEF cols=sql_id
|
||||
/
|
||||
|
||||
DEF cols=module
|
||||
/
|
||||
|
||||
DEF cols=action
|
||||
/
|
||||
|
||||
DEF cols=user_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode,top_level_sql_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,plsql_object_id,plsql_subprogram_id
|
||||
/
|
||||
|
||||
DEF cols=wait_class,event
|
||||
/
|
||||
|
||||
DEF cols=sql_id,wait_class
|
||||
/
|
||||
|
||||
DEF cols=sql_id,event
|
||||
/
|
||||
|
||||
DEF cols=program,event
|
||||
/
|
||||
|
||||
|
||||
SPOOL OFF
|
||||
|
||||
78
tpt/ash/examples/ash2.sql
Normal file
78
tpt/ash/examples/ash2.sql
Normal file
@@ -0,0 +1,78 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
--DEF from_time="2010-10-30 18:12:00"
|
||||
--DEF to_time="2010-10-30 18:14:00"
|
||||
|
||||
DEF from_time="&1"
|
||||
DEF to_time="&2"
|
||||
|
||||
DEF cols=session_type,top_level_call_name,program,top_level_sql_opcode,top_level_sql_id,sql_opcode,sql_id
|
||||
|
||||
PROMPT FROM_TIME=&from_time TO_TIME=&to_time
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, &cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
WHEN IN_SEQUENCE_LOAD ='Y' THEN 'SEQUENCE_LOAD'
|
||||
END stage
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
sample_time BETWEEN TIMESTAMP'&from_time' AND TIMESTAMP'&to_time'
|
||||
AND session_state = 'ON CPU'
|
||||
AND event IS NULL
|
||||
AND sql_id IS NULL
|
||||
AND session_type = 'FOREGROUND'
|
||||
GROUP BY
|
||||
&cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
WHEN IN_SEQUENCE_LOAD ='Y' THEN 'SEQUENCE_LOAD'
|
||||
END
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode,sql_id
|
||||
/
|
||||
--
|
||||
-- DEF cols=session_type,program,top_level_sql_opcode,sql_id,event
|
||||
-- /
|
||||
--
|
||||
-- DEF cols=session_type,program,top_level_sql_opcode,sql_id,event,p1
|
||||
-- /
|
||||
--
|
||||
-- DEF cols=session_type,program,top_level_sql_opcode,sql_id,event,p1,p2
|
||||
-- /
|
||||
--
|
||||
-- DEF cols=session_type,program,top_level_sql_opcode,top_level_sql_id
|
||||
-- /
|
||||
--
|
||||
-- DEF cols=session_type,program,plsql_object_id,plsql_subprogram_id
|
||||
-- /
|
||||
--
|
||||
75
tpt/ash/examples/ash3.sql
Normal file
75
tpt/ash/examples/ash3.sql
Normal file
@@ -0,0 +1,75 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
DEF from_time="2010-10-30 18:12:00"
|
||||
DEF to_time="2010-10-30 18:14:00"
|
||||
DEF cols=session_type,program,sql_opcode
|
||||
|
||||
PROMPT FROM_TIME=&from_time TO_TIME=&to_time
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
&cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
WHEN IN_SEQUENCE_LOAD ='Y' THEN 'SEQUENCE_LOAD'
|
||||
END stage
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
FROM
|
||||
-- active_session_history_bak
|
||||
v$active_session_history
|
||||
-- dba_hist_active_sess_history
|
||||
WHERE
|
||||
1=1 -- sample_time BETWEEN TIMESTAMP'&from_time' AND TIMESTAMP'&to_time'
|
||||
AND session_state = 'ON CPU'
|
||||
AND event IS NULL
|
||||
AND sql_id IS NULL
|
||||
GROUP BY
|
||||
&cols
|
||||
, CASE WHEN IN_CONNECTION_MGMT='Y' THEN 'CONNECTION_MGMT'
|
||||
WHEN IN_PARSE ='Y' THEN 'PARSE'
|
||||
WHEN IN_HARD_PARSE ='Y' THEN 'HARD_PARSE'
|
||||
WHEN IN_SQL_EXECUTION ='Y' THEN 'SQL_EXECUTION'
|
||||
WHEN IN_PLSQL_EXECUTION ='Y' THEN 'PLSQL_EXECUTION'
|
||||
WHEN IN_PLSQL_RPC ='Y' THEN 'PLSQL_RPC'
|
||||
WHEN IN_PLSQL_COMPILATION ='Y' THEN 'PLSQL_COMPILATION'
|
||||
WHEN IN_JAVA_EXECUTION ='Y' THEN 'JAVA_EXECUTION'
|
||||
WHEN IN_BIND ='Y' THEN 'BIND'
|
||||
WHEN IN_CURSOR_CLOSE ='Y' THEN 'CURSOR_CLOSE'
|
||||
WHEN IN_SEQUENCE_LOAD ='Y' THEN 'SEQUENCE_LOAD'
|
||||
END
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
DEF cols=module
|
||||
/
|
||||
|
||||
DEF cols=action
|
||||
/
|
||||
|
||||
DEF cols=user_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,top_level_sql_opcode,top_level_sql_id
|
||||
/
|
||||
|
||||
DEF cols=session_type,program,plsql_object_id,plsql_subprogram_id
|
||||
/
|
||||
|
||||
66
tpt/ash/examples/ash5.sql
Normal file
66
tpt/ash/examples/ash5.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT /*+ LEADING(o) USE_HASH(a) */
|
||||
a.sql_id
|
||||
, o.kglnaobj cursor_name
|
||||
, a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
, x$kglob o
|
||||
WHERE
|
||||
a.sql_id = o.kglobt13
|
||||
AND a.sample_time BETWEEN SYSDATE AND SYSDATE - 1/12
|
||||
AND o.kglnaobj = 'table_4_9_73c8_0_0_0'
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, o.kglnaobj
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT /*+ LEADING(o) USE_HASH(a) */
|
||||
a.sql_id
|
||||
, o.kglnaobj cursor_name
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
, x$kglob o
|
||||
WHERE
|
||||
a.sql_id = o.kglobt13
|
||||
AND a.sample_time BETWEEN SYSDATE AND SYSDATE - 1/12
|
||||
AND o.kglnaobj = 'table_4_9_73c8_0_0_0'
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, a.p1
|
||||
, a.p2
|
||||
, o.kglnaobj
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 300
|
||||
/
|
||||
|
||||
|
||||
57
tpt/ash/examples/ash6.sql
Normal file
57
tpt/ash/examples/ash6.sql
Normal file
@@ -0,0 +1,57 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-05 15:00:00' AND TIMESTAMP'2011-01-05 15:30:00'
|
||||
AND a.sql_id = '9dq68unz1naqz' -- table_4_9_73c8_0_0_0
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-05 15:00:00' AND TIMESTAMP'2011-01-05 15:30:00'
|
||||
AND a.sql_id = '9dq68unz1naqz' -- table_4_9_73c8_0_0_0
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 300
|
||||
/
|
||||
|
||||
57
tpt/ash/examples/ash7.sql
Normal file
57
tpt/ash/examples/ash7.sql
Normal file
@@ -0,0 +1,57 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-05 15:00:00' AND TIMESTAMP'2011-01-05 15:30:00'
|
||||
AND a.sql_id = '9dq68unz1naqz' -- table_4_9_73c8_0_0_0
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-05 15:00:00' AND TIMESTAMP'2011-01-05 15:30:00'
|
||||
AND a.sql_id = '9dq68unz1naqz' -- table_4_9_73c8_0_0_0
|
||||
GROUP BY
|
||||
a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 300
|
||||
/
|
||||
|
||||
80
tpt/ash/examples/ash8.sql
Normal file
80
tpt/ash/examples/ash8.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
dba_hist_active_sess_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 300
|
||||
/
|
||||
|
||||
80
tpt/ash/examples/ash9.sql
Normal file
80
tpt/ash/examples/ash9.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- 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 VERIFY OFF
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 30
|
||||
/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
, count(*)
|
||||
, lpad(round(ratio_to_report(count(*)) over () * 100)||'%',10,' ') percent
|
||||
, MIN(a.sample_time)
|
||||
, MAX(a.sample_time)
|
||||
FROM
|
||||
v$active_session_history a
|
||||
WHERE
|
||||
a.sample_time BETWEEN TIMESTAMP'2011-01-10 18:00:00' AND TIMESTAMP'2011-01-10 19:00:00'
|
||||
GROUP BY
|
||||
a.program
|
||||
, a.sql_id
|
||||
, a.session_state
|
||||
, a.event
|
||||
, a.p1
|
||||
, a.p2
|
||||
ORDER BY
|
||||
percent DESC
|
||||
)
|
||||
WHERE ROWNUM <= 300
|
||||
/
|
||||
|
||||
19
tpt/ash/examples/ashrelated.sql
Normal file
19
tpt/ash/examples/ashrelated.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
SELECT
|
||||
COUNT(*) totalseconds
|
||||
, ROUND(COUNT(*) / ((CAST(&4 AS DATE) - CAST(&3 AS DATE)) * 86400), 1) AAS
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ')||' |' "%This"
|
||||
, &1
|
||||
, TO_CHAR(MIN(sample_time), 'YYYY-MM-DD HH24:MI:SS') first_seen
|
||||
, TO_CHAR(MAX(sample_time), 'YYYY-MM-DD HH24:MI:SS') last_seen
|
||||
-- , MAX(sql_exec_id) - MIN(sql_exec_id)
|
||||
, COUNT(DISTINCT sql_exec_start||':'||sql_exec_id) dist_sqlexec_seen
|
||||
FROM v$active_session_history a
|
||||
WHERE (session_id, session_serial#) IN (SELECT session_id, session_serial# FROM v$active_session_history
|
||||
WHERE sample_time BETWEEN &3 AND &4
|
||||
AND &2
|
||||
)
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
/
|
||||
|
||||
66
tpt/ash/gashtop.sql
Normal file
66
tpt/ash/gashtop.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
-- 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.
|
||||
|
||||
-- usage: @ashtop sql_id
|
||||
|
||||
COL ash_from_date NEW_VALUE ash_from_date
|
||||
COL ash_to_date NEW_VALUE ash_to_date
|
||||
|
||||
-- This was too much!
|
||||
--SELECT
|
||||
-- regexp_replace('&3','^-([0-9]*)(.)$', ' sysdate - \1 / ', 1, 0, 'i')
|
||||
-- ||decode(regexp_replace('&3', '^-[0-9]*(.)$', '\1', 1, 0, 'i'),
|
||||
-- 'd', '1',
|
||||
-- 'h', '24',
|
||||
-- 'm','24/60',
|
||||
-- 's','24/60/60',
|
||||
-- ''
|
||||
-- ) ash_from_date,
|
||||
-- regexp_replace(regexp_replace('&4', '^now$', 'sysdate'),'^-([0-9]*)(.)$', ' sysdate - \1 / ', 1, 0, 'i')
|
||||
-- ||decode(regexp_replace(regexp_replace('&4', '^now$', 'sysdate'), '^-[0-9]*(.)$', '\1', 1, 0, 'i'),
|
||||
-- 'd', '1',
|
||||
-- 'h', '24',
|
||||
-- 'm','24/60',
|
||||
-- 's','24/60/60',
|
||||
-- ''
|
||||
-- ) ash_to_date
|
||||
--from
|
||||
-- dual
|
||||
--/
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, &1
|
||||
, COUNT(*) "TotalSeconds"
|
||||
, SUM(CASE WHEN wait_class IS NULL THEN 1 ELSE 0 END) "CPU"
|
||||
, SUM(CASE WHEN wait_class ='User I/O' THEN 1 ELSE 0 END) "User I/O"
|
||||
, SUM(CASE WHEN wait_class ='Application' THEN 1 ELSE 0 END) "Application"
|
||||
, SUM(CASE WHEN wait_class ='Concurrency' THEN 1 ELSE 0 END) "Concurrency"
|
||||
, SUM(CASE WHEN wait_class ='Commit' THEN 1 ELSE 0 END) "Commit"
|
||||
, SUM(CASE WHEN wait_class ='Configuration' THEN 1 ELSE 0 END) "Configuration"
|
||||
, SUM(CASE WHEN wait_class ='Cluster' THEN 1 ELSE 0 END) "Cluster"
|
||||
, SUM(CASE WHEN wait_class ='Idle' THEN 1 ELSE 0 END) "Idle"
|
||||
, SUM(CASE WHEN wait_class ='Network' THEN 1 ELSE 0 END) "Network"
|
||||
, SUM(CASE WHEN wait_class ='System I/O' THEN 1 ELSE 0 END) "System I/O"
|
||||
, SUM(CASE WHEN wait_class ='Scheduler' THEN 1 ELSE 0 END) "Scheduler"
|
||||
, SUM(CASE WHEN wait_class ='Administrative' THEN 1 ELSE 0 END) "Administrative"
|
||||
, SUM(CASE WHEN wait_class ='Queueing' THEN 1 ELSE 0 END) "Queueing"
|
||||
, SUM(CASE WHEN wait_class ='Other' THEN 1 ELSE 0 END) "Other"
|
||||
FROM
|
||||
gv$active_session_history a
|
||||
, dba_users u
|
||||
WHERE
|
||||
a.user_id = u.user_id (+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
&1
|
||||
ORDER BY
|
||||
"TotalSeconds" DESC
|
||||
, &1
|
||||
)
|
||||
WHERE
|
||||
ROWNUM <= 20
|
||||
/
|
||||
|
||||
77
tpt/ash/gasqlmon.sql
Normal file
77
tpt/ash/gasqlmon.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
-- 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 asqlmon_operation FOR a80
|
||||
COL asqlmon_predicates FOR a100 word_wrap
|
||||
COL options FOR a30
|
||||
|
||||
COL asqlmon_plan_hash_value HEAD PLAN_HASH_VALUE
|
||||
COL asqlmon_sql_id HEAD SQL_ID
|
||||
COL asqlmon_sql_child HEAD CHILD#
|
||||
COL asqlmon_sample_time HEAD SAMPLE_HOUR
|
||||
|
||||
BREAK ON asqlmon_plan_hash_value SKIP 1 ON asqlmon_sql_id SKIP 1 ON asqlmon_sql_child SKIP 1 ON asqlmon_sample_time SKIP 1 DUP
|
||||
|
||||
WITH sample_times AS (
|
||||
select * from dual
|
||||
),
|
||||
sq AS (
|
||||
SELECT /*+ MATERIALIZE */
|
||||
-- to_char(ash.sample_time, 'YYYY-MM-DD HH24') sample_time
|
||||
count(*) samples
|
||||
, ash.inst_id
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, ash.sql_plan_line_id
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
FROM
|
||||
gv$active_session_history ash
|
||||
WHERE
|
||||
1=1
|
||||
AND ash.sql_id LIKE '&1'
|
||||
AND ash.sql_child_number LIKE '%&2%'
|
||||
GROUP BY
|
||||
--to_char(ash.sample_time, 'YYYY-MM-DD HH24')
|
||||
ash.inst_id
|
||||
, ash.sql_id
|
||||
, ash.sql_child_number
|
||||
, ash.sql_plan_hash_value
|
||||
, ash.sql_plan_line_id
|
||||
, ash.sql_plan_operation
|
||||
, ash.sql_plan_options
|
||||
),
|
||||
plan AS (
|
||||
SELECT /*+ MATERIALIZE */ * FROM gv$sql_plan
|
||||
WHERE sql_id IN (SELECT DISTINCT sql_id FROM sq)
|
||||
)
|
||||
SELECT
|
||||
plan.sql_id asqlmon_sql_id
|
||||
-- , plan.child_number asqlmon_sql_child
|
||||
, plan.plan_hash_value asqlmon_plan_hash_value
|
||||
, sq.samples seconds
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 100, 1), 999.9))||' %',8) pct_child
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(sq.samples) OVER (PARTITION BY sq.sql_id, sq.sql_plan_hash_value) * 10), '#'), ' '), 10,' ')||'|' pct_child_vis
|
||||
--, sq.sample_time asqlmon_sample_time
|
||||
, plan.id
|
||||
, LPAD(' ', depth) || plan.operation ||' '|| plan.options || NVL2(plan.object_name, ' ['||plan.object_name ||']', null) asqlmon_operation
|
||||
, plan.access_predicates ||' ' || plan.filter_predicates asqlmon_predicates
|
||||
FROM
|
||||
plan
|
||||
, sq
|
||||
WHERE
|
||||
1=1
|
||||
AND sq.inst_id = plan.inst_id
|
||||
AND sq.sql_id(+) = plan.sql_id
|
||||
AND sq.sql_child_number(+) = plan.child_number
|
||||
AND sq.sql_plan_line_id(+) = plan.id
|
||||
AND sq.sql_plan_hash_value(+) = plan.plan_hash_value
|
||||
AND plan.sql_id LIKE '&1'
|
||||
AND plan.child_number LIKE '%&2%'
|
||||
ORDER BY
|
||||
--sq.sample_time
|
||||
plan.sql_id
|
||||
, plan.plan_hash_value
|
||||
, plan.id
|
||||
/
|
||||
41
tpt/ash/gen_ash_report_html.sql
Normal file
41
tpt/ash/gen_ash_report_html.sql
Normal file
@@ -0,0 +1,41 @@
|
||||
-- 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_id NUMBER
|
||||
|
||||
COL bdate NEW_VALUE def_bdate
|
||||
COL edate NEW_VALUE def_edate
|
||||
|
||||
SET TERMOUT OFF
|
||||
|
||||
SELECT
|
||||
TO_CHAR(SYSDATE-1/24, 'YYYY-MM-DD HH24:MI') bdate
|
||||
, TO_CHAR(SYSDATE , 'YYYY-MM-DD HH24:MI') edate
|
||||
FROM
|
||||
dual
|
||||
/
|
||||
|
||||
SET TERMOUT ON
|
||||
|
||||
ACCEPT bdate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_bdate' PROMPT "Enter begin time [&def_bdate]: "
|
||||
ACCEPT edate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_edate' PROMPT "Enter end time [&def_edate]: "
|
||||
|
||||
BEGIN
|
||||
SELECT inst_id, dbid INTO :inst_id, :dbid FROM gv$database WHERE inst_id = SYS_CONTEXT('USERENV', 'INSTANCE');
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
PROMPT Spooling into ash_report.html
|
||||
SPOOL ash_report.html
|
||||
SET TERMOUT OFF PAGESIZE 0 HEADING OFF LINESIZE 1000 TRIMSPOOL ON TRIMOUT ON TAB OFF
|
||||
|
||||
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML(:dbid, :inst_id, TO_DATE('&bdate', 'YYYY-MM-DD HH24:MI'), TO_DATE('&edate', 'YYYY-MM-DD HH24:MI'), null, null, null, null ));
|
||||
|
||||
SPOOL OFF
|
||||
SET TERMOUT ON PAGESIZE 5000 HEADING ON
|
||||
PROMPT Done.
|
||||
|
||||
HOST &_start ash_report.html
|
||||
|
||||
40
tpt/ash/gen_ash_report_text.sql
Normal file
40
tpt/ash/gen_ash_report_text.sql
Normal file
@@ -0,0 +1,40 @@
|
||||
-- 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_id NUMBER
|
||||
|
||||
COL bdate NEW_VALUE def_bdate
|
||||
COL edate NEW_VALUE def_edate
|
||||
|
||||
SET TERMOUT OFF
|
||||
|
||||
SELECT
|
||||
TO_CHAR(SYSDATE-1/24, 'YYYY-MM-DD HH24:MI') bdate
|
||||
, TO_CHAR(SYSDATE , 'YYYY-MM-DD HH24:MI') edate
|
||||
FROM
|
||||
dual
|
||||
/
|
||||
|
||||
SET TERMOUT ON
|
||||
|
||||
ACCEPT bdate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_bdate' PROMPT "Enter begin time [&def_bdate]: "
|
||||
ACCEPT edate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_edate' PROMPT "Enter end time [&def_edate]: "
|
||||
|
||||
BEGIN
|
||||
SELECT inst_id, dbid INTO :inst_id, :dbid FROM gv$database;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
PROMPT Spooling into ash_report.txt
|
||||
SPOOL ash_report.txt
|
||||
SET TERMOUT OFF PAGESIZE 0 HEADING OFF LINESIZE 1000 TRIMSPOOL ON TRIMOUT ON TAB OFF
|
||||
|
||||
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(:dbid, :inst_id, TO_DATE('&bdate', 'YYYY-MM-DD HH24:MI'), TO_DATE('&edate', 'YYYY-MM-DD HH24:MI'), null, null, null, null ));
|
||||
|
||||
SPOOL OFF
|
||||
SET TERMOUT ON PAGESIZE 5000 HEADING ON
|
||||
PROMPT Done.
|
||||
|
||||
HOST &_start ash_report.txt
|
||||
48
tpt/ash/old.event_hist_cell.sql
Normal file
48
tpt/ash/old.event_hist_cell.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Event|Breakdown" JUST CENTER FOR A12
|
||||
COL evh_cell_graph HEAD "Cell Event|Breakdown" JUST CENTER FOR A12
|
||||
COL pct_cell_time HEAD "% Cell|Time"
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_ms HEAD "Estimated|Total ms"
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR 999999
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
COL evh_cell_path HEAD "Cell Path" FOR A16
|
||||
|
||||
BREAK ON evh_event SKIP 1 ON evh_cell_path SKIP 1 NODUPLICATES
|
||||
|
||||
SELECT
|
||||
event evh_event
|
||||
, cell_path evh_cell_path
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*),1) evh_est_total_ms
|
||||
, ROUND ( 100 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event)), '#'),' '), 10)||'|' evh_graph
|
||||
, ROUND ( 100 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event, cell_path) , 1 ) pct_cell_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event, cell_path)), '#'),' '), 10)||'|' evh_cell_graph
|
||||
FROM
|
||||
v$cell
|
||||
, V$ACTIVE_SESSION_HISTORY
|
||||
--dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND v$cell.cell_hashval = v$active_session_history.p1
|
||||
AND sample_time > SYSDATE - 1
|
||||
AND time_waited > 0 -- TODO
|
||||
GROUP BY
|
||||
event
|
||||
, cell_path
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE TRUNC(POWER(2,TRUNC(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
ORDER BY 1, 2
|
||||
/
|
||||
|
||||
41
tpt/ash/old_devent_hist.sql
Normal file
41
tpt/ash/old_devent_hist.sql
Normal file
@@ -0,0 +1,41 @@
|
||||
-- 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.
|
||||
|
||||
-- this script uses "ASH math" by John Beresniewicz, Graham Wood and Uri Shaft
|
||||
-- for estimating the event counts (and average durations):
|
||||
-- https://www.slideshare.net/jberesni/ash-architecture-and-advanced-usage-rmoug2014-36611678
|
||||
|
||||
COL evh_event HEAD WAIT_EVENT for A50 TRUNCATE
|
||||
COL evh_graph HEAD "Estimated|Time Graph" JUST CENTER FOR A12
|
||||
COL pct_evt_time HEAD "% Event|Time"
|
||||
COL evh_est_total_sec HEAD "Estimated|Total Sec" FOR 9,999,999.9
|
||||
COL evh_millisec HEAD "Wait time|bucket ms+" FOR A15 JUST RIGHT
|
||||
COL evh_event HEAD "Wait Event"
|
||||
COL evh_sample_count HEAD "Num ASH|Samples"
|
||||
COL evh_est_event_count HEAD "Estimated|Total Waits"
|
||||
|
||||
BREAK ON evh_event SKIP 1
|
||||
|
||||
SELECT
|
||||
event evh_event
|
||||
, LPAD('< ' || CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END, 15) evh_millisec
|
||||
, COUNT(*) evh_sample_count
|
||||
, ROUND(SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END),1) evh_est_event_count
|
||||
, ROUND(CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * SUM(CASE WHEN time_waited >= 1000000 THEN 1 WHEN time_waited = 0 THEN 0 ELSE 1000000 / time_waited END) / 1000,1) evh_est_total_sec
|
||||
, ROUND ( 100 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event) , 1 ) pct_evt_time
|
||||
, '|'||RPAD(NVL(RPAD('#', ROUND (10 * RATIO_TO_REPORT( CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END * COUNT(*) ) OVER (PARTITION BY event)), '#'),' '), 10)||'|' evh_graph
|
||||
FROM
|
||||
dba_hist_active_sess_history
|
||||
WHERE
|
||||
regexp_like(event, '&1')
|
||||
AND sample_time BETWEEN &2 AND &3
|
||||
AND session_state = 'WAITING' -- not really needed as "event" for ON CPU will be NULL in ASH, but added just for clarity
|
||||
AND time_waited > 0
|
||||
GROUP BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END -- evh_millisec
|
||||
ORDER BY
|
||||
event
|
||||
, CASE WHEN time_waited = 0 THEN 0 ELSE CEIL(POWER(2,CEIL(LOG(2,time_waited/1000)))) END
|
||||
/
|
||||
|
||||
74
tpt/ash/perfsheet_ash.sql
Normal file
74
tpt/ash/perfsheet_ash.sql
Normal file
@@ -0,0 +1,74 @@
|
||||
-- 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
|
||||
SAMPLE_ID
|
||||
, CAST(SAMPLE_TIME AS DATE) sample_time
|
||||
, SESSION_ID
|
||||
, SESSION_SERIAL#
|
||||
, SESSION_TYPE
|
||||
, USER_ID
|
||||
, SQL_ID
|
||||
, SQL_CHILD_NUMBER
|
||||
, SQL_OPCODE
|
||||
, FORCE_MATCHING_SIGNATURE
|
||||
, TOP_LEVEL_SQL_ID
|
||||
, TOP_LEVEL_SQL_OPCODE
|
||||
, SQL_PLAN_HASH_VALUE
|
||||
, SQL_PLAN_LINE_ID
|
||||
, SQL_PLAN_OPERATION
|
||||
, SQL_PLAN_OPTIONS
|
||||
, SQL_EXEC_ID
|
||||
, SQL_EXEC_START
|
||||
, PLSQL_ENTRY_OBJECT_ID
|
||||
, PLSQL_ENTRY_SUBPROGRAM_ID
|
||||
, PLSQL_OBJECT_ID
|
||||
, PLSQL_SUBPROGRAM_ID
|
||||
, QC_INSTANCE_ID
|
||||
, QC_SESSION_ID
|
||||
, QC_SESSION_SERIAL#
|
||||
, EVENT
|
||||
, EVENT_ID
|
||||
, EVENT#
|
||||
, SEQ#
|
||||
, P1TEXT
|
||||
, P1
|
||||
, P2TEXT
|
||||
, P2
|
||||
, P3TEXT
|
||||
, P3
|
||||
, WAIT_CLASS
|
||||
, WAIT_CLASS_ID
|
||||
, WAIT_TIME
|
||||
, SESSION_STATE
|
||||
, BLOCKING_SESSION_STATUS
|
||||
, BLOCKING_SESSION
|
||||
, BLOCKING_SESSION_SERIAL#
|
||||
, CURRENT_OBJ#
|
||||
, CURRENT_FILE#
|
||||
, CURRENT_BLOCK#
|
||||
, CURRENT_ROW#
|
||||
, CONSUMER_GROUP_ID
|
||||
, XID
|
||||
, REMOTE_INSTANCE#
|
||||
, IN_CONNECTION_MGMT
|
||||
, IN_PARSE
|
||||
, IN_HARD_PARSE
|
||||
, IN_SQL_EXECUTION
|
||||
, IN_PLSQL_EXECUTION
|
||||
, IN_PLSQL_RPC
|
||||
, IN_PLSQL_COMPILATION
|
||||
, IN_JAVA_EXECUTION
|
||||
, IN_BIND
|
||||
, IN_CURSOR_CLOSE
|
||||
, SERVICE_HASH
|
||||
, PROGRAM
|
||||
, MODULE
|
||||
, ACTION
|
||||
, CLIENT_ID
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
sample_time BETWEEN %FROM_DATE% AND %TO_DATE%
|
||||
AND %FILTER%
|
||||
|
||||
48
tpt/ash/rowsource_events.sql
Normal file
48
tpt/ash/rowsource_events.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 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.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
--
|
||||
-- File name: rowsource_events.sql
|
||||
-- Purpose: Display top ASH time (count of ASH samples) grouped by
|
||||
-- exeution plan rowsource type and session serial/parallel
|
||||
-- status.
|
||||
--
|
||||
-- This allows to find out if your parallel slaves are doing
|
||||
-- buffered full table scan IOs.
|
||||
--
|
||||
-- Author: Tanel Poder
|
||||
-- Copyright: (c) http://blog.tanelpoder.com
|
||||
--
|
||||
-- Usage:
|
||||
-- @rowsource_events.sql
|
||||
--
|
||||
-- Other:
|
||||
-- Requires Oracle 11g+
|
||||
--
|
||||
--------------------------------------------------------------------------------
|
||||
SELECT * FROM (
|
||||
SELECT
|
||||
COUNT(*) seconds
|
||||
, ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1) pct
|
||||
, sql_plan_operation||' '||sql_plan_options plan_line
|
||||
, CASE WHEN qc_session_id IS NULL THEN 'SERIAL' ELSE 'PARALLEL' END is_parallel
|
||||
, session_state
|
||||
, wait_class
|
||||
, event
|
||||
FROM
|
||||
gv$active_session_history
|
||||
WHERE
|
||||
sql_plan_operation LIKE '&1'
|
||||
AND sql_plan_options LIKE '&2'
|
||||
AND sample_time > SYSDATE - 1/24
|
||||
GROUP BY
|
||||
sql_plan_operation||' '||sql_plan_options
|
||||
, CASE WHEN qc_session_id IS NULL THEN 'SERIAL' ELSE 'PARALLEL' END
|
||||
, session_state
|
||||
, wait_class
|
||||
, event
|
||||
ORDER BY COUNT(*) DESC
|
||||
)
|
||||
WHERE rownum <= 20
|
||||
/
|
||||
19
tpt/ash/sample_drift.sql
Normal file
19
tpt/ash/sample_drift.sql
Normal 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.
|
||||
|
||||
-- check if there's sample time drift in ASH (should be every 1 seconds)
|
||||
-- it makes sense to run this only on active systems where every sample there
|
||||
-- are some active sessions seen
|
||||
|
||||
select * from (
|
||||
select
|
||||
to_char(sample_time,'YYYYMMDD HH24:MI:SS')
|
||||
, sample_time-lag(sample_time) over(order by sample_time) delta
|
||||
from
|
||||
(select distinct sample_time from v$active_session_history)
|
||||
)
|
||||
where
|
||||
delta < numtodsinterval(2, 'second') -- eliminate ASH sample gaps without captured DB activity
|
||||
/
|
||||
|
||||
|
||||
47
tpt/ash/shortmon.sql
Normal file
47
tpt/ash/shortmon.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- 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 wait_class FOR a15
|
||||
COL event FOR a35
|
||||
COL time_range HEAD "WAIT_TIM_BUCKET_US+" FOR A26 JUST RIGHT
|
||||
COL avg_wait_us HEAD "AVG_WAIT_IN_BKT_US" FOR 9,999,999,999
|
||||
COL pct_event FOR a9
|
||||
COL pct_event_vis FOR a13
|
||||
COL pct_total_vis FOR a13
|
||||
COL pct_total FOR a9
|
||||
|
||||
BREAK ON event SKIP 1 NODUPLICATES ON state ON wait_class
|
||||
|
||||
-- TODO: ignore latest sample (0 waits)
|
||||
|
||||
SELECT /* (hint disabled) LEADING(@"SEL$4" "S"@"SEL$4" "A"@"SEL$4") USE_HASH(@"SEL$4" "A"@"SEL$4") */
|
||||
session_state state
|
||||
, wait_class
|
||||
, event
|
||||
, ROUND(AVG(time_waited)) avg_wait_us
|
||||
, LPAD(REPLACE(TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END))),'9,999,999,999')||' ..'||TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))*2, '9,999,999,999'), ' ',''), 26) time_range
|
||||
, COUNT(*) samples
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 100, 1), 999.9))||' %',8) pct_event
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 10), '#'), ' '), 10,' ')||'|' pct_event_vis
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1), 999.9))||' %',8) pct_total
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_total_vis
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
1=1
|
||||
AND sample_time BETWEEN sysdate-1/24 AND sysdate
|
||||
--AND sample_time BETWEEN TIMESTAMP'2012-04-29 19:30:00' AND TIMESTAMP'2012-04-29 19:30:59'
|
||||
AND (REGEXP_LIKE(wait_class, '&1') OR REGEXP_LIKE(event, '&1'))
|
||||
GROUP BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))
|
||||
ORDER BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, time_range NULLS FIRST
|
||||
, samples DESC
|
||||
/
|
||||
|
||||
52
tpt/ash/shortmon_cell.sql
Normal file
52
tpt/ash/shortmon_cell.sql
Normal file
@@ -0,0 +1,52 @@
|
||||
-- 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.
|
||||
|
||||
-- shortmon_cell.sql : script by Tanel Poder (http://blog.tanelpoder.com)
|
||||
|
||||
COL wait_class FOR a15
|
||||
COL event FOR a35
|
||||
COL time_range HEAD "WAIT_TIM_BUCKET_US+" FOR A26 JUST RIGHT
|
||||
COL avg_wait_us HEAD "AVG_WAIT_IN_BKT_US" FOR 9,999,999,999
|
||||
COL pct_event FOR a9
|
||||
COL pct_total FOR a9
|
||||
COL cell_path FOR a16
|
||||
BREAK ON state ON wait_class ON event SKIP 1 NODUPLICATES ON CELL_PATH SKIP 1
|
||||
|
||||
-- TODO: ignore latest sample (0 waits)
|
||||
|
||||
SELECT /* (hint disabled) LEADING(@"SEL$4" "S"@"SEL$4" "A"@"SEL$4") USE_HASH(@"SEL$4" "A"@"SEL$4") */
|
||||
session_state state
|
||||
, wait_class
|
||||
, event
|
||||
, cell_path
|
||||
, ROUND(AVG(time_waited)) avg_wait_us
|
||||
, LPAD(REPLACE(TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END))),'9,999,999,999')||' ..'||TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))*2, '9,999,999,999'), ' ',''), 26) time_range
|
||||
, COUNT(*) samples
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 100, 1), 999.9))||' %',8) pct_event
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 10), '#'), ' '), 10,' ')||'|' pct_event_vis
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1), 999.9))||' %',8) pct_total
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_total_vis
|
||||
FROM
|
||||
v$active_session_history
|
||||
, v$cell
|
||||
WHERE
|
||||
1=1
|
||||
AND v$cell.cell_hashval = v$active_session_history.p1
|
||||
AND sample_time BETWEEN &1 AND &2 -- sysdate-1/24 AND sysdate
|
||||
--AND sample_time BETWEEN TIMESTAMP'2012-04-29 19:30:00' AND TIMESTAMP'2012-04-29 19:30:59'
|
||||
AND (REGEXP_LIKE(wait_class, 'User I/O')) --OR REGEXP_LIKE(event, '&1'))
|
||||
GROUP BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, cell_path
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))
|
||||
ORDER BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, cell_path
|
||||
, time_range NULLS FIRST
|
||||
, samples DESC
|
||||
/
|
||||
|
||||
45
tpt/ash/shortmon_logfilesync.sql
Normal file
45
tpt/ash/shortmon_logfilesync.sql
Normal 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.
|
||||
|
||||
COL wait_class FOR a15
|
||||
COL event FOR a55
|
||||
COL time_range HEAD "WAIT_TIM_BUCKET_US+" FOR 999,999,999,999
|
||||
COL avg_wait_us HEAD "AVG_WAIT_IN_BKT_US" FOR 999,999,999,999
|
||||
COL pct_event FOR a9
|
||||
COL pct_total FOR a9
|
||||
|
||||
BREAK ON event SKIP 1 DUPLICATES
|
||||
|
||||
-- TODO: ignore latest sample (0 waits)
|
||||
|
||||
SELECT
|
||||
session_state state
|
||||
, wait_class
|
||||
, event
|
||||
, ROUND(AVG(time_waited)) avg_wait_us
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END))) time_range
|
||||
, COUNT(*) samples
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 100, 1), 999.9))||' %',8) pct_event
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 10), '#'), ' '), 10,' ')||'|' pct_event_vis
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1), 999.9))||' %',8) pct_total
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_total_vis
|
||||
FROM
|
||||
gv$active_session_history
|
||||
--DBA_HIST_ACTIVE_SESS_HISTORY
|
||||
WHERE
|
||||
1=1
|
||||
AND sample_time BETWEEN TIMESTAMP'2011-10-25 08:24:00' AND TIMESTAMP'2011-10-25 08:30:00'
|
||||
AND (UPPER(wait_class) LIKE UPPER('%&1%') OR UPPER(event) LIKE UPPER('%&1%'))
|
||||
GROUP BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))
|
||||
ORDER BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, time_range NULLS FIRST
|
||||
, samples DESC
|
||||
/
|
||||
|
||||
48
tpt/ash/shortmon_numblocks.sql
Normal file
48
tpt/ash/shortmon_numblocks.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- 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 wait_class FOR a15
|
||||
COL event FOR a35
|
||||
COL time_range HEAD "WAIT_TIM_BUCKET_US+" FOR A26 JUST RIGHT
|
||||
COL avg_wait_us HEAD "AVG_WAIT_IN_BKT_US" FOR 9,999,999,999
|
||||
COL pct_event FOR a9
|
||||
COL pct_total FOR a9
|
||||
|
||||
BREAK ON event SKIP 1 DUPLICATES
|
||||
|
||||
-- TODO: ignore latest sample (0 waits)
|
||||
|
||||
SELECT /* (hint disabled) LEADING(@"SEL$4" "S"@"SEL$4" "A"@"SEL$4") USE_HASH(@"SEL$4" "A"@"SEL$4") */
|
||||
session_state state
|
||||
, wait_class
|
||||
, event
|
||||
, p3 num_blocks
|
||||
, ROUND(AVG(time_waited)) avg_wait_us
|
||||
, LPAD(REPLACE(TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END))),'9,999,999,999')||' ..'||TO_CHAR(POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))*2, '9,999,999,999'), ' ',''), 26) time_range
|
||||
, COUNT(*) samples
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 100, 1), 999.9))||' %',8) pct_event
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY session_state, wait_class, event) * 10), '#'), ' '), 10,' ')||'|' pct_event_vis
|
||||
, LPAD(TO_CHAR(TO_NUMBER(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100, 1), 999.9))||' %',8) pct_total
|
||||
, '|'||RPAD( NVL( LPAD('#', ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 10), '#'), ' '), 10,' ')||'|' pct_total_vis
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
1=1
|
||||
AND sample_time BETWEEN sysdate-1/24 AND sysdate
|
||||
--AND sample_time BETWEEN TIMESTAMP'2012-04-29 19:30:00' AND TIMESTAMP'2012-04-29 19:30:59'
|
||||
AND (REGEXP_LIKE(wait_class, '&1') OR REGEXP_LIKE(event, '&1'))
|
||||
GROUP BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, p3
|
||||
, POWER(2,TRUNC(LOG(2,CASE WHEN time_waited < 1 THEN NULL ELSE time_waited END)))
|
||||
ORDER BY
|
||||
session_state
|
||||
, wait_class
|
||||
, event
|
||||
, p3
|
||||
, time_range NULLS FIRST
|
||||
, samples DESC
|
||||
/
|
||||
|
||||
76
tpt/ash/sqlexec_duration_buckets.sql
Normal file
76
tpt/ash/sqlexec_duration_buckets.sql
Normal file
@@ -0,0 +1,76 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
|
||||
COL approx_elapsed_time FOR A30
|
||||
|
||||
BREAK ON ash_sql_id SKIP 1
|
||||
|
||||
WITH ash AS (
|
||||
SELECT
|
||||
sql_id
|
||||
, session_id
|
||||
, sample_time
|
||||
, sample_time - CAST(MIN(sql_exec_start)
|
||||
OVER(PARTITION BY session_id,session_serial#,sql_exec_start,sql_exec_id)
|
||||
AS TIMESTAMP) elapsed_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
, COUNT(*) seconds
|
||||
FROM
|
||||
gv$active_session_history
|
||||
WHERE
|
||||
sql_id LIKE '&1'
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
sql_id
|
||||
, session_id
|
||||
, session_serial#
|
||||
, sample_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
),
|
||||
longrunning AS (
|
||||
SELECT * FROM ash
|
||||
WHERE
|
||||
elapsed_time > INTERVAL '1' SECOND
|
||||
),
|
||||
individualexecutions AS (
|
||||
SELECT
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
-- an earlier analytic function already does the "partition by session_id,session_serial#"
|
||||
, MAX(elapsed_time) approx_elapsed_time
|
||||
, TRUNC((EXTRACT(DAY FROM MAX(elapsed_time)) * 24 * 60 * 60) +
|
||||
(EXTRACT(HOUR FROM MAX(elapsed_time)) * 60 * 60) +
|
||||
(EXTRACT(MINUTE FROM MAX(elapsed_time)) * 60) +
|
||||
(EXTRACT(SECOND FROM MAX(elapsed_time)))
|
||||
) as approx_elapsed_sec
|
||||
, SUM(seconds) sqlexec_db_time
|
||||
, COUNT(DISTINCT session_id) sessions
|
||||
FROM longrunning
|
||||
GROUP BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
ORDER BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, COUNT(*) DESC
|
||||
)
|
||||
SELECT
|
||||
sql_id as ash_sql_id
|
||||
, approx_elapsed_sec
|
||||
, SUM(sqlexec_db_time) total_db_time
|
||||
, MIN(sql_exec_start) first_seen_start
|
||||
, MAX(sql_exec_start) last_seen_start
|
||||
FROM
|
||||
individualexecutions
|
||||
GROUP BY
|
||||
sql_id
|
||||
, approx_elapsed_sec
|
||||
ORDER BY
|
||||
sql_id
|
||||
, approx_elapsed_sec
|
||||
/
|
||||
|
||||
48
tpt/ash/sqlexec_longer_than.sql
Normal file
48
tpt/ash/sqlexec_longer_than.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
WITH ash AS (
|
||||
SELECT
|
||||
sql_id
|
||||
, sample_time
|
||||
, sample_time - CAST(MIN(sql_exec_start) OVER(PARTITION BY session_id,session_serial#,sql_exec_start,sql_exec_id) AS TIMESTAMP) elapsed_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
, session_state
|
||||
, event
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
sql_id = '&1'
|
||||
--AND sample_time BETWEEN TIMESTAMP'2020-02-26 14:45:17' AND TIMESTAMP'2020-02-26 15:15:17'
|
||||
GROUP BY
|
||||
sql_id
|
||||
, session_id
|
||||
, session_serial#
|
||||
, sample_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
, session_state
|
||||
, event
|
||||
),
|
||||
longrunning AS (
|
||||
SELECT * FROM ash
|
||||
WHERE
|
||||
elapsed_time > INTERVAL '1' SECOND
|
||||
)
|
||||
SELECT
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, MAX(elapsed_time) -- an earlier analytic function already does the "partition by session_id,session_serial#"
|
||||
, session_state
|
||||
, event
|
||||
, COUNT(*) seconds
|
||||
FROM longrunning
|
||||
GROUP BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, session_state
|
||||
, event
|
||||
ORDER BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, COUNT(*) DESC
|
||||
/
|
||||
|
||||
100
tpt/ash/sqlid_activity.sql
Normal file
100
tpt/ash/sqlid_activity.sql
Normal file
@@ -0,0 +1,100 @@
|
||||
-- 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 PAGESIZE 5000 LINESIZE 1000 TRIMSPOOL ON TRIMOUT ON TAB OFF
|
||||
|
||||
DEF sqlset_name="GPN_MON18"
|
||||
|
||||
VAR dbid NUMBER
|
||||
VAR inst_id NUMBER
|
||||
|
||||
COL bdate NEW_VALUE def_bdate
|
||||
COL edate NEW_VALUE def_edate
|
||||
|
||||
SET TERMOUT OFF
|
||||
|
||||
SELECT
|
||||
TO_CHAR(SYSDATE-1/24, 'YYYY-MM-DD HH24:MI') bdate
|
||||
, TO_CHAR(SYSDATE , 'YYYY-MM-DD HH24:MI') edate
|
||||
FROM
|
||||
dual
|
||||
/
|
||||
|
||||
SET TERMOUT ON
|
||||
|
||||
ACCEPT sqlid CHAR FORMAT A13 DEFAULT '%' PROMPT "Enter SQL ID [ % ]: "
|
||||
SPOOL sql_activity_&sqlid..txt
|
||||
|
||||
ACCEPT bdate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_bdate' PROMPT "Enter begin time [&def_bdate]: "
|
||||
ACCEPT edate DATE FORMAT 'YYYY-MM-DD HH24:MI' DEFAULT '&def_edate' PROMPT "Enter end time [&def_edate]: "
|
||||
|
||||
PROMPT Spooling into sql_activity_&sqlid..txt
|
||||
|
||||
BEGIN
|
||||
SELECT inst_id, dbid INTO :inst_id, :dbid FROM gv$database;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
SELECT
|
||||
TO_CHAR(sample_time, 'YYYY-MM-DD HH24')||':00' sample_hour
|
||||
, sql_id
|
||||
, sql_plan_hash_value
|
||||
, COUNT(*) * 10 seconds
|
||||
, ROUND(COUNT(*) * 10 / 3600, 2) AAS
|
||||
, COUNT(DISTINCT sql_exec_start||sql_exec_id) sampled_execs
|
||||
FROM
|
||||
dba_hist_active_sess_history
|
||||
WHERE
|
||||
dbid = :dbid
|
||||
-- AND instance_number = :inst_id
|
||||
AND sample_time BETWEEN TO_DATE('&bdate', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('&edate', 'YYYY-MM-DD HH24:MI:SS')
|
||||
AND sql_id LIKE '&sqlid'
|
||||
GROUP BY
|
||||
TO_CHAR(sample_time, 'YYYY-MM-DD HH24')||':00'
|
||||
, sql_id
|
||||
, sql_plan_hash_value
|
||||
ORDER BY
|
||||
sample_hour
|
||||
, sql_id
|
||||
/
|
||||
|
||||
SET PAGESIZE 0 HEADING OFF
|
||||
|
||||
PROMPT
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT =========================================== DISPLAY_SQLSET ============================================
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT
|
||||
|
||||
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQLSET('&sqlset_name', '&sqlid', null, 'TYPICAL +ALIAS +MEMSTATS +NOTE'));
|
||||
|
||||
PROMPT
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT ============================================= DISPLAY_AWR =============================================
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT
|
||||
|
||||
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid', null, null, 'ALL'))
|
||||
/
|
||||
|
||||
PROMPT
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT =============================== ASH Report for SQL ID &sqlid ===================================
|
||||
PROMPT =======================================================================================================
|
||||
PROMPT
|
||||
|
||||
SET VERIFY ON
|
||||
-- Oracle 10.2 requires the :inst_id to be present (and not NULL)
|
||||
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(:dbid, :inst_id, TO_DATE('&bdate', 'YYYY-MM-DD HH24:MI'), TO_DATE('&edate', 'YYYY-MM-DD HH24:MI'), null, null, null, DECODE('&sqlid', '%', NULL, '&sqlid')))
|
||||
WHERE exists (SELECT version FROM v$instance WHERE version LIKE '10%')
|
||||
UNION ALL
|
||||
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT(:dbid, NULL, TO_DATE('&bdate', 'YYYY-MM-DD HH24:MI'), TO_DATE('&edate', 'YYYY-MM-DD HH24:MI'), null, null, null, DECODE('&sqlid', '%', NULL, '&sqlid')))
|
||||
WHERE exists (SELECT version FROM v$instance WHERE version LIKE '11%')
|
||||
/
|
||||
|
||||
SET VERIFY OFF
|
||||
SPOOL OFF
|
||||
SET TERMOUT ON PAGESIZE 5000 HEADING ON
|
||||
PROMPT Done. Output file: sql_activity_&sqlid..txt
|
||||
|
||||
65
tpt/ash/sqlid_dbtime_buckets.sql
Normal file
65
tpt/ash/sqlid_dbtime_buckets.sql
Normal file
@@ -0,0 +1,65 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at https://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
|
||||
COL approx_elapsed_time FOR A30
|
||||
|
||||
|
||||
WITH ash AS (
|
||||
SELECT
|
||||
sql_id
|
||||
, session_id
|
||||
, sample_time
|
||||
, sample_time - CAST(MIN(sql_exec_start)
|
||||
OVER(PARTITION BY session_id,session_serial#,sql_exec_start,sql_exec_id)
|
||||
AS TIMESTAMP) elapsed_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
, session_state
|
||||
, event
|
||||
, machine
|
||||
, module
|
||||
FROM
|
||||
v$active_session_history
|
||||
WHERE
|
||||
sql_id = '&1'
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
GROUP BY
|
||||
sql_id
|
||||
, session_id
|
||||
, session_serial#
|
||||
, sample_time
|
||||
, sql_exec_start
|
||||
, sql_exec_id
|
||||
, session_state
|
||||
, event
|
||||
, machine
|
||||
, module
|
||||
),
|
||||
longrunning AS (
|
||||
SELECT * FROM ash
|
||||
WHERE
|
||||
elapsed_time > INTERVAL '1' SECOND
|
||||
)
|
||||
SELECT
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
-- an earlier analytic function already does the "partition by session_id,session_serial#"
|
||||
, MAX(elapsed_time) approx_elapsed_time
|
||||
, session_state
|
||||
, event
|
||||
, COUNT(*) seconds
|
||||
, COUNT(DISTINCT session_id) sessions
|
||||
FROM longrunning
|
||||
GROUP BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, session_state
|
||||
, event
|
||||
ORDER BY
|
||||
sql_id
|
||||
, sql_exec_start
|
||||
, COUNT(*) DESC
|
||||
/
|
||||
|
||||
18
tpt/ash/sqlid_plan_activity.sql
Normal file
18
tpt/ash/sqlid_plan_activity.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
-- 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
|
||||
TRUNC(sample_time,'MI') minute
|
||||
, sql_plan_hash_value
|
||||
, COUNT(*)/60 avg_act_ses
|
||||
FROM
|
||||
v$active_session_history
|
||||
-- dba_hist_active_sess_history
|
||||
WHERE
|
||||
sql_id = '&1'
|
||||
GROUP BY
|
||||
TRUNC(sample_time,'MI')
|
||||
, sql_plan_hash_value
|
||||
ORDER BY
|
||||
minute, sql_plan_hash_value
|
||||
/
|
||||
64
tpt/ash/time_model.sql
Normal file
64
tpt/ash/time_model.sql
Normal file
@@ -0,0 +1,64 @@
|
||||
-- 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 TOP_LEVEL_CALL_NAME FOR A25
|
||||
COL SQL_OPNAME FOR A25
|
||||
|
||||
SELECT * FROM (
|
||||
SELECT /*+ LEADING(a) USE_HASH(u) */
|
||||
count(*) seconds
|
||||
, LPAD(ROUND(RATIO_TO_REPORT(COUNT(*)) OVER () * 100)||'%',5,' ') "%This"
|
||||
, &1
|
||||
, CASE WHEN IN_CONNECTION_MGMT = 'Y' THEN 'CONNECTION_MGMT ' END ||
|
||||
CASE WHEN IN_PARSE = 'Y' THEN 'PARSE ' END ||
|
||||
CASE WHEN IN_HARD_PARSE = 'Y' THEN 'HARD_PARSE ' END ||
|
||||
CASE WHEN IN_SQL_EXECUTION = 'Y' THEN 'SQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_EXECUTION = 'Y' THEN 'PLSQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_RPC = 'Y' THEN 'PLSQL_RPC ' END ||
|
||||
CASE WHEN IN_PLSQL_COMPILATION = 'Y' THEN 'PLSQL_COMPILATION ' END ||
|
||||
CASE WHEN IN_JAVA_EXECUTION = 'Y' THEN 'JAVA_EXECUTION ' END ||
|
||||
CASE WHEN IN_BIND = 'Y' THEN 'BIND ' END ||
|
||||
CASE WHEN IN_CURSOR_CLOSE = 'Y' THEN 'CURSOR_CLOSE ' END ||
|
||||
CASE WHEN IN_SEQUENCE_LOAD = 'Y' THEN 'SEQUENCE_LOAD ' END ||
|
||||
-- CASE WHEN IN_INMEMORY_QUERY = 'Y' THEN 'IN_INMEMORY_QUERY' END ||
|
||||
-- CASE WHEN IN_INMEMORY_POPULATE = 'Y' THEN 'IN_INMEMORY_POPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_PREPOPULATE = 'Y' THEN 'IN_INMEMORY_PREPOPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_REPOPULATE = 'Y' THEN 'IN_INMEMORY_REPOPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_TREPOPULATE = 'Y' THEN 'IN_INMEMORY_TREPOPULATE' END ||
|
||||
-- CASE WHEN IN_TABLESPACE_ENCRYPTION= 'Y' THEN 'IN_TABLESPACE_ENCRYPTION' END ||
|
||||
'' phase
|
||||
FROM
|
||||
v$active_session_history a
|
||||
, dba_users u
|
||||
WHERE
|
||||
a.user_id = u.user_id(+)
|
||||
AND &2
|
||||
AND sample_time BETWEEN &3 AND &4
|
||||
--AND session_type = 'FOREGROUND'
|
||||
GROUP BY
|
||||
&1
|
||||
, CASE WHEN IN_CONNECTION_MGMT = 'Y' THEN 'CONNECTION_MGMT ' END ||
|
||||
CASE WHEN IN_PARSE = 'Y' THEN 'PARSE ' END ||
|
||||
CASE WHEN IN_HARD_PARSE = 'Y' THEN 'HARD_PARSE ' END ||
|
||||
CASE WHEN IN_SQL_EXECUTION = 'Y' THEN 'SQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_EXECUTION = 'Y' THEN 'PLSQL_EXECUTION ' END ||
|
||||
CASE WHEN IN_PLSQL_RPC = 'Y' THEN 'PLSQL_RPC ' END ||
|
||||
CASE WHEN IN_PLSQL_COMPILATION = 'Y' THEN 'PLSQL_COMPILATION ' END ||
|
||||
CASE WHEN IN_JAVA_EXECUTION = 'Y' THEN 'JAVA_EXECUTION ' END ||
|
||||
CASE WHEN IN_BIND = 'Y' THEN 'BIND ' END ||
|
||||
CASE WHEN IN_CURSOR_CLOSE = 'Y' THEN 'CURSOR_CLOSE ' END ||
|
||||
CASE WHEN IN_SEQUENCE_LOAD = 'Y' THEN 'SEQUENCE_LOAD ' END ||
|
||||
-- CASE WHEN IN_INMEMORY_QUERY = 'Y' THEN 'IN_INMEMORY_QUERY' END ||
|
||||
-- CASE WHEN IN_INMEMORY_POPULATE = 'Y' THEN 'IN_INMEMORY_POPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_PREPOPULATE = 'Y' THEN 'IN_INMEMORY_PREPOPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_REPOPULATE = 'Y' THEN 'IN_INMEMORY_REPOPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_TREPOPULATE = 'Y' THEN 'IN_INMEMORY_TREPOPULATE' END ||
|
||||
-- CASE WHEN IN_INMEMORY_TREPOPULATE = 'Y' THEN 'IN_INMEMORY_TREPOPULATE' END ||
|
||||
-- CASE WHEN IN_TABLESPACE_ENCRYPTION= 'Y' THEN 'IN_TABLESPACE_ENCRYPTION' END ||
|
||||
''
|
||||
ORDER BY
|
||||
seconds DESC
|
||||
)
|
||||
WHERE ROWNUM <= 20
|
||||
/
|
||||
|
||||
1
tpt/ash/time_model_phases.sql
Symbolic link
1
tpt/ash/time_model_phases.sql
Symbolic link
@@ -0,0 +1 @@
|
||||
time_model.sql
|
||||
11
tpt/ash/w.sql
Normal file
11
tpt/ash/w.sql
Normal file
@@ -0,0 +1,11 @@
|
||||
-- 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.
|
||||
|
||||
DEF filter=&1
|
||||
|
||||
PROMPT What's going on? Showing top timed events of last minute from ASH...
|
||||
@ashtop event2 &filter sysdate-1/24/60 sysdate
|
||||
|
||||
PROMPT Showing top SQL and wait classes of last minute from ASH...
|
||||
@ashtop sql_id,session_state,wait_class &filter sysdate-1/24/60 sysdate
|
||||
|
||||
Reference in New Issue
Block a user