Designing IA for AI - Information Architecture Conference 2024
Ash and awr deep dive hotsos
1. How to Dive in Fast and Find the Right
Answer to the Big Questions
Kellyn Pot’Vin, Sr. Technical Consultant
2. A Little About Me:
ACE Director, Oak Table Member
Board of Directors for RMOUG
Conference Director for RMOUG
DB Track Lead for KSCOPE
Author and presenter at Oracle
Open World, HotSos, Collaborate,
KSCOPE and others…
Advocate for Women in Technology
Lives in Westminster, CO!
3. Bit of a Change
What do I get questions on?
Work Smart, Don’t Work Hard…
ASH/AWR Reports in EM12c
Compare ADDM
SQL Monitor
ASH/AWR Reporting from the Command
Line
Search SQL, (Least Used Feature of EM)
ASH Queries
7. Stay on the Right Road
Optimization- Tune for Time or You’re
Wasting Time.
Know Your Goal(s)
Set a Stopping Point, avoid OTD,
(Obsessive Tuning Disorder)
Do NOT Assume. Always do the
Research and Have Data.
8. Brief History
ASH= Active Session History
AWR= Automatic Workload Repository
Introduced in Oracle 10g
Evolution to statspack, requests for
performance reporting improvements.
“Always on” approach to performance
metrics with requirement of non-locking
collection process.
Requires Management Diagnostic Pack
License from Oracle.
17. How Often Are We Asked, “What
Changed?”
It ran fine last week, now it doesn’t!
ETL loads have changed, but no one
has released any new code!
The DBA says there hasn’t been any
parameter changes to this database, but
I’m sure there have been.
Compare ADDM Resolution
18. What is Compare ADDM?
Uses Two AWR snapshots
Creates Report that
Compares SQL that is common and
different.
SGA changes
IO/CPU bound issues
Parameter Changes
19. What is in an ADDM Compare?
Report Includes Following:
Clear Demonstration of impact of change.
Recommendations to address issue.
Identifies causes behind change, (with
limitations.)
Lists Regressed SQL, too!
Tip: If Installing to database for first time,
(simple installation, nothing to concern about,
just pkg to fulfill views) you must have preferred
credentials SET of install will fail!
20. Executing a Report from EM12c
Choose focus period
Choose to compare to an Offset,
Baseline or Custom
21. 2-3PM, 12th Vs. 13th
Familiar interface with visual wait event
comparisons.
Average # of sessions during each
period are displayed.
24. Top Segments Causing IO Waits
High Level data
Click on “Show Hot Object Breakdown”
to see more detail.
25. Resource Comparisons
Comparisons of Memory, CPU, IO and
Interconnect.
Memory Is there Virtual paging?
Memory Base Period
Memory Comparison Period
26. Dashboard Provided for CPU,
Memory, IO and Interconnect
Is something OTHER than Oracle the
cause?
27. IO Bound Dashboard
Base vs. comparison period
Temp reads/writes specified
Single block read latency
28. SQL Monitor, EM12c Style
One More way to identify performance
issues.
Monitoring view ease for those less
familiar with database performance.
33. SQL Monitor Report CLI
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
SELECT DBMS_SQLTUNE.report_sql_monitor(
sql_id
=> '5vh6y3b7tnv8r',
type
=> 'TEXT',
report_level => 'ALL') AS report
FROM dual;
42. AWR and ASH from the CLI
All DBAs should know how to do this!
43. Running Reports, Command Line
$ORACLE_HOME/rdbms/admin/awrrpt.sql;
$ORACLE_HOME/rdbms/admin/ashrpt.sql;
$ORACLE_HOME/rdbms/admin/awrsqlrpt.sql;
Less Known AWR Reports:
awrinfo.sql General AWR Info
awrddrpt.sql Comparison report between
snapshots
awrblmig.sql Migrates pre-11g baseline
data into 11g Baseline tables.
awrgrpt.sql RAC Aware AWR Report.
44. AWR Info Report
Snapshot Interval Information
Basic Info on Instances and Nodes
No User or Application Schema info.
Space Usage by SYSAUX
WRH$ and Non- AWR Objects, ordered
by size
Snapshot info and if any errors.
Advisor Tasks
51. Querying ASH Data Directly
More defined reporting
No need to pull full report
Detail on waits that are of interest
Join to non-AWR objects
Examples and Ideas…
52. V$ACTIVE_SESSION_HISTORY
SAMPLE_ID- This is a unique identifier within an ASH sample.
SAMPLE_TIME- A unit of time used by Active Session History, (not to
be confused with DB_TIME)
USER_ID- Identifier for a user that’s executing the session.
SESSION_ID- Same as the SID or Session ID and can be used to join
to SID in other views/tables.
SESSION_STATE- What was the state of the session when ASH
recorded the sample.
ON CPU/WAITING- The two session states in Active Session History.
ON CPU is active, vs. Waiting, which is self-explanatory.
EVENT- Type of event that the session is currently active or waiting on.
TIME_WAITED- How long the session has been waiting if waiting.
WAIT_TIME- Confusing- but this is populated by any wait time if the
session is currently active and for the previous waits.
SQL_ID- The unique identifier for the SQL statement being executed.
SQL_CHILD_NUMBER-The cursor child number.
53. Session Averages
select
ROUND(RATIO_TO_REPORT(SUM(1)) OVER () * 100 ,2) PERCENTAGE,
ash.session_type SESS_TYPE,
session_state STATUS,
decode(nvl(sql_id,'-1'),'-1','nonsql','sql') SQL_TYPE,
count(distinct to_char(session_id)|| to_char(session_serial#)) SESS_CNT
from v$active_session_history ash
where
sample_time > sysdate - 30/(24*60)
and (
( ash.session_state = 'ON CPU' )
or
( ash.session_type != 'BACKGROUND' )
)
group by
ash.session_type,
ash.session_state, decode(nvl(sql_id,'-1'),'-1','nonsql','sql')
order by count(*)
/
55. Inspecting What
col type for a20
select * from (select
ash.SQL_ID , ash.SQL_PLAN_HASH_VALUE Plan_hash, aud.name type,
sum(decode(ash.session_state,'ON CPU',1,0)) "CPU",
sum(decode(ash.session_state,'WAITING',1,0)) "WAITING",
sum(decode(ash.session_state,'WAITING', decode(wait_class, 'User I/O',1,0),0)) "IO
WAIT" ,
sum(decode(ash.session_state,'WAITING', decode(wait_class, 'User I/O',1,0),0)) "IO" ,
sum(decode(ash.session_state,'WAITING', decode(wait_class, 'Concurrency',1,0)))
"CONCURRENCY" ,
sum(decode(ash.session_state,'WAITING', decode(wait_class, 'Application',1,0)))
"Application" ,
sum(decode(ash.session_state,'ON CPU',1,1)) "TOTAL"
from v$active_session_history ash,
audit_actions aud
where SQL_ID is not NULL
and ash.sql_opcode=aud.action
and ash.sample_time > sysdate - &minutes /( 60*24)
group by sql_id, SQL_PLAN_HASH_VALUE , aud.name
order by sum(decode(session_state,'ON CPU',1,1)) desc
) where rownum < 5;
56. 10 Min. View of Waits by SQL_ID
Choose Time in Minutes To Review, (10
in our example)
SQL_ID and Plan Hash Value Shown
Waits for CPU, Wait, IO Wait and others.
57. Quantity of Events Occurred Over
Small Amounts of Time
Col event for a50
select event, count(1)
from v$active_session_history
where sample_time between
to_date('21-FEB-14 01.43.00 PM','dd-MON-yy
hh:mi:ss PM')
and
to_date('21-FEB-15 01.53.00 PM','dd-MON-yy
hh:mi:ss PM')
group by event
order by event;
59. Transaction Wait Detail
col event for a22
col block_type for a18
col objn for a18
col otype for a10
col fn for 99
col sid for 9999
col bsid for 9999
col lm for 99
col p3 for 99999
col blockn for 99999
select
to_char(sample_time,'HH:MI') st,
substr(event,0,20) event,
ash.session_id sid,
mod(ash.p1,16) lm,
ash.p2,
ash.p3,
nvl(o.object_name,ash.current_obj#) objn,
substr(o.object_type,0,10) otype,
CURRENT_FILE# fn,
CURRENT_BLOCK# blockn,
ash.SQL_ID,
BLOCKING_SESSION bsid
from v$active_session_history ash,
all_objects o
where event like 'enq: TX%'
and o.object_id (+)= ash.CURRENT_OBJ#
and sample_time > sysdate - 10/(60*24)
Order by sample_time
69. Formatting and Setup
accept hours prompt "hours (default 12) : " default 12
column f_hours new_value v_hours
select &hours f_hours from dual;
column f_secs new_value v_secs
column f_samples new_value samples
select 3600 f_secs from dual;
select &v_secs f_samples from dual;
--select &seconds f_secs from dual;
column f_bars new_value v_bars
select 5 f_bars from dual;
column aas format 999.99
column f_graph new_value v_graph
select 30 f_graph from dual;
column graph format a30
column total format 99999
column npts format 99999
col waits for 99999
col cpu for 9999
70. select
to_char(to_date(tday||' '||tmod*&v_secs,'YYMMDD SSSSS'),'DD-MON HH24:MI:SS') tm,
samples npts,total/&samples aas,
substr(substr(substr(rpad('+',round((cpu*&v_bars)/&samples),'+') ||
rpad('-',round((waits*&v_bars)/&samples),'-') ||
rpad(' ',p.value * &v_bars,' '),0,(p.value * &v_bars)) ||
p.value || substr(rpad('+',round((cpu*&v_bars)/&samples),'+') ||
rpad('-',round((waits*&v_bars)/&samples),'-') ||
rpad(' ',p.value * &v_bars,' '),(p.value * &v_bars),10) ,0,30)
,0,&v_graph)graph,total,cpu, waits
from (
select to_char(sample_time,'YYMMDD')tday
, trunc(to_char(sample_time,'SSSSS')/&v_secs) tmod
, sum(decode(session_state,'ON CPU',1,decode(session_type,'BACKGROUND',0,1))) total
, (max(sample_id) - min(sample_id) + 1 )
samples
, sum(decode(session_state,'ON CPU' ,1,0)) cpu
, sum(decode(session_type,'BACKGROUND',0,decode(session_state,'WAITING',1,0))) waits
/* for waits I want to subtract out the BACKGROUND
but for CPU I want to count everyon */
from v$active_session_history
where sample_time > sysdate - &v_hours/24
group by trunc(to_char(sample_time,'SSSSS')/&v_secs),
to_char(sample_time,'YYMMDD')
union all
select to_char(sample_time,'YYMMDD')tday
, trunc(to_char(sample_time,'SSSSS')/&v_secs) tmod
, sum(decode(session_state,'ON CPU',10,decode(session_type,'BACKGROUND',0,10))) total
, (max(sample_id) - min(sample_id) + 1 )
samples
, sum(decode(session_state,'ON CPU' ,10,0)) cpu
, sum(decode(session_type,'BACKGROUND',0,decode(session_state,'WAITING',10,0))) waits
/* for waits I want to subtract out the BACKGROUND
but for CPU I want to count everyon */
from dba_hist_active_sess_history
where sample_time > sysdate - &v_hours/24
and sample_time < (select min(sample_time) from v$active_session_history)
group by trunc(to_char(sample_time,'SSSSS')/&v_secs),
to_char(sample_time,'YYMMDD')) ash, v$parameter p
where p.name='cpu_count'
order by to_date(tday||' '||tmod*&v_secs,'YYMMDD SSSSS')
/
73. Process Information
SELECT * FROM (
SELECT /*+ PARALLEL */
count(*) AS count,
user_id, program, module, sql_id
FROM SYS.DBA_HIST_ACTIVE_SESS_HISTORY
WHERE sample_time > TO_DATE('19-FEB-2014 03.00.00
PM','dd-MON-yy hh:mi:ss PM')
AND sample_time < TO_DATE('19-FEB-2014 08.00.00 PM','ddMON-yy hh:mi:ss PM')
AND program LIKE 'oracle@%'
GROUP BY user_id, program, module, machine, sql_id
ORDER BY count(*) desc
)
WHERE rownum <= 20
/
76. ASH Mining Output
Additional Options:
• Physical Read Averages
• Physical Writes, (Max/Averages)
• Redo Info
• Login Info
• Hard Parsing, etc.
77. Best Practice When Querying
ASH Data
Keep it Simple and don’t reinvent the
wheel.
Samples are an alias for time, not for
counts.
Understand what is valuable and compare
to packaged reports.
Be aware on RAC of node specific data.
Take care when querying Obj#, File# and
Block#, (still issues in different versions…)
Check the time that is available in buffer,
don’t assume!
78. AWR/ASH Links/Blogs
Tyler Muth: http://tylermuth.wordpress.com/
Kyle Hailey, John Beresniewicz, Graham
Wood: http://ashmasters.com/
Mine- “For the Love of ASH and AWR”
http://dbakevlar.com/2011/02/for-the-loveof-awr-and-ash/
Karl Arao- http://karlarao.tiddlyspot.com/
Guy Harrisonhttp://guyharrison.squarespace.com/opsgs
amples/