Oracle Tuning - ASH Architecture

tuning-ash-arch1

ASH introduced in 10g. Its part of the Diagnostics and Tuning Pack. Database performance monitor by statspack, AWR, ADDM and SQL Trace. They are gathering wait event information, but they observing past time. The v$dynamic view allow to see current and historical information of active sessions. You usually concentrate on a few important aspects while examining an Active Session History (ASH) report in order to comprehend how well your Oracle Database instance is doing. The following are the primary areas that an ASH report could look at:
  • Top SQL Statements.
  • Wait Events.
  • Concurrency.
  • CPU Usage.
  • I/O Activity.
  • Memory Usage.
  • Session Activity.
  • SQL Execution Plans.
  • Performance Trends.


  • Create an AWR Report :
    Because ASH data is frequently integrated into AWR reports, you usually need to create an AWR report before creating an ASH report. To create an AWR report, use the awrinfo.sql script. Usually, you may find this script in the $ORACLE_HOME/rdbms/admin directory.


    @$ORACLE_HOME/rdbms/admin/awrinfo.sql :
    Determine Snapshot IDs: You will receive snapshot IDs from the AWR report that correspond to various times. Make a note of the snapshot IDs for the duration you wish to examine.
    Create ASH Report: To create an ASH report for the given snapshot IDs, use the ashrpt.sql script. You can find this script in the $ORACLE_HOME/rdbms/admin directory as well.


    @$ORACLE_HOME/rdbms/admin/ashrpt.sql :
    Interpret the Report: Examine the ASH report after it has been prepared to assess how well your Oracle Database instance is doing. To find performance bottlenecks and areas for improvement, pay close attention to important indicators including the most frequently used SQL statements, wait events, CPU utilization, and session activity.
    As an alternative, you can directly query the ASH data from the V$ACTIVE_SESSION_HISTORY view using custom SQL queries, and you can create custom reports according to your own needs.
        SQL> @$ORACLE_HOME/rdbms/admin/awrinfo.sql;
    
        This script will report general AWR information
        specify the Report File Name
        The default report file name is awrinfo.txt.  To use this name,
        press < return > to continue, otherwise enter an alternative.
        Enter value for report_name: ash.html
        Using the report name ash.html
        No errors.
        No errors.
        ~~~~~~~~~~~~~~~
        AWR INFO Report
        ~~~~~~~~~~~~~~~
        Report generated at
        07:18:38 on Feb 16, 2024 ( Friday ) in Timezone +05:30
        Warning: Non Default AWR Setting!
        --------------------------------------------------------------------------------
        Snapshot interval is 10 minutes and Retention is 30 days
        DB_ID           DB_NAME   HOST_PLATFORM    INST STARTUP_TIME    LAST_ASH_SID        RAC      VERSION
        4176617848      DEV       tesdba.localdomain - Linux x86 64-bit 1 07:17:34 (02/16)  0        NO     12.2.0.1.0
    
        Create ASH Report
        SQL> @?/rdbms/admin/ashrpt;
        Specify the Report Type
        ~~~~~~~~~~~~~~~~~~~~~~~
        Enter 'html' for an HTML report, or 'text' for plain text
        Defaults to 'html'
        Enter value for report_type: html
        Type Specified:  html
        Enter value for begin_time: 02/16/2024 07:20:00
        Enter value for duration: 10
        Using 16-Feb-24 07:20:00 as report begin time
        Using 16-Feb-24 07:25:19 as report end time
        --     1 minute,  if the source is V$ACTIVE_SESSION_HISTORY or
        --     5 minutes, if the source is AWR_(PDB/ROOT)_ACTIVE_SESS_HISTORY.
        Specify the Report Name
        The default report file name is ashrpt_1_0216_0725.html.  To use this name,
        press < return > to continue, otherwise enter an alternative.
        Enter value for report_name: sample.html
        Using the report name sample.html
        Summary of All User Input
        -------------------------
        Format	       : HTML
        DB Id	       : 4176617848
        Inst num       : 1
        Begin time     : 16-Feb-24 07:20:00
        End time       : 16-Feb-24 07:25:19
        Slot width     : Default
        Report targets : 0
        Report name    : sample.html
        End of Report
        < /body >< /html >
        Report written to sample.html
    
    
    V$ACTIVE_SESSION_HISTROY (15 mins) :
        SQL> select NVL(a.event, 'ON CPU') as event, count(*) as total_wait_time from v$active_session_history a  
             Where a.sample_time > sysdate - 15/(24*60) group by a.event  order by total_wait_time desc;
    
                EVENT                       TOTAL_WAIT_TIME
      ---------------------------         ----------------------
        ON CPU                                          393
        oracle thread bootstrap 			     10
        control file parallel write			      3
        db file async I/O submit			      2
        db file sequential read 			      1
    
    
    DBA_HIST_ACTIVE_SESS_HISTORY :
        select NVL(a.event, 'ON CPU') as event, count(*)*20 as total_wait_time  from dba_hist_active_sess_history a  
        where a.sample_time > sysdate - 1 group by a.event  order by total_wait_time desc;
    
                EVENT                       TOTAL_WAIT_TIME
        ---------------------------     ----------------------
        ON CPU                                          4660
        control file parallel write			     180
        oracle thread bootstrap 			     100
        external table read                               80
        db file sequential read 			      40
        db file async I/O submit			      40
        flashback log file write			      20
        cursor: pin S wait on X 			      20
        ADR block file read                               20
    


    (Oracle Tuning - Identifying Long running SQLs for a time period)