set echo off
set pages 9999
set linesize 200

column dcol new_value spoolname noprint

select db_unique_name || '_' || to_char(sysdate,'YYYYMMDDHH24MISS') dcol from v$database;

set feedback on

spool &spoolname._ora04031_monitoring.txt

prompt indications of shared pool space pressure
prompt -----------------------------------------

select *
from ( select to_char(first_value(run_date) over (partition by name order by run_date rows between unbounded preceding and unbounded following), 'DD/MM/YYYY HH24:MI') start_run_date,
              to_char(last_value(run_date) over (partition by name order by run_date rows between unbounded preceding and unbounded following), 'DD/MM/YYYY HH24:MI') end_run_date,
              name,
              ( nvl(last_value(value) over (partition by name order by run_date rows between unbounded preceding and unbounded following),0)
                - nvl(first_value(value) over (partition by name order by run_date rows between unbounded preceding and unbounded following),0)
              ) delta
       from sp_pressure
     )
group by start_run_date, end_run_date, name, delta
order by name;

prompt sizes of selected shared pool heaps
prompt -----------------------------------

column mb format 9G999G999D99

select name, bytes/1024/1024 MB
from v$sgastat
where pool = 'shared pool'
      and name in ('KGLH0', 'free memory', 'SQLA');


prompt KGLH0 / PCUR chunk information
prompt ------------------------------

column kb format 999G999G999D99
column max_kb format 999G999G999D99
column kb format 9G999G999D99
column max_kb format 999G999G999D99

select substr(ksmchcom, 1, instr(ksmchcom, '^') -1) subpool,
       ksmchcls, sum(ksmchsiz)/1024 KB, max(ksmchsiz)/1024 max_kb
from x$ksmsp
where ksmchcom like 'KGLH0%'
      or ksmchcom like 'PCUR%'
group by substr(ksmchcom, 1, instr(ksmchcom, '^') -1), ksmchcls
order by 1, 2;

prompt top sql by sharable mem
prompt -----------------------

column sharable_mem format 9G999G999G999
column users_opening format 9G999 heading  "USERS|OPENING"
column executions format 999G999
column version_count format 99G999  heading "VERSION|COUNT"
column loaded_versions format 99G999  heading "LOADED|VERSIONS"
column open_versions format 99G999  heading "OPEN|VERSIONS"
column kept_versions format 99G999  heading "KEPT|VERSIONS"
column parsing_user_id format 999  heading "P USER"

select *
from ( select sql_id, substr(sql_text,1,40) stm, sharable_mem, users_opening,
              executions, version_count, loaded_versions, open_versions,
              kept_versions, parsing_user_id
       from v$sqlarea
       order by sharable_mem desc
     )
where rownum <= 10;

prompt top sql by version_count
prompt ------------------------

column sharable_mem format 9G999G999G999
column persistent_mem format 9G999G999G999
column sql_fulltext format a100 word_wrapped

select * 
from ( select sql_id, version_count, loaded_versions, sharable_mem, persistent_mem, runtime_mem, optimizer_mode, invalidations, sql_fulltext
       from v$sqlarea 
       order by version_count desc
     )
where rownum <= 10;

prompt mismatch reasons for top sql by number of child cursors
prompt -------------------------------------------------------

set linesize 200
break on sql_id skip 1

select *
from ( select a.*,
              dense_rank() over (order by nbr_child_cursors desc) dr
       from ( select sql_id, child_number, sql_type_mismatch, optimizer_mismatch, outline_mismatch, stats_row_mismatch, literal_mismatch,
                     force_hard_parse, explain_plan_cursor, buffered_dml_mismatch, pdml_env_mismatch, inst_drtld_mismatch, slave_qc_mismatch, 
                     typecheck_mismatch, auth_check_mismatch, bind_mismatch, describe_mismatch, language_mismatch, translation_mismatch, 
                     bind_equiv_failure, insuff_privs, insuff_privs_rem, remote_trans_mismatch, logminer_session_mismatch, incomp_ltrl_mismatch, 
                     overlap_time_mismatch, edition_mismatch, mv_query_gen_mismatch, user_bind_peek_mismatch, typchk_dep_mismatch, no_trigger_mismatch, 
                     flashback_cursor, anydata_transformation, pddl_env_mismatch, top_level_rpi_cursor, different_long_length, logical_standby_apply, 
                     diff_call_durn, bind_uacs_diff, plsql_cmp_switchs_diff, cursor_parts_mismatch, stb_object_mismatch, crossedition_trigger_mismatch, 
                     pq_slave_mismatch, top_level_ddl_mismatch, multi_px_mismatch, bind_peeked_pq_mismatch, mv_rewrite_mismatch, roll_invalid_mismatch, 
                     optimizer_mode_mismatch, px_mismatch, mv_staleobj_mismatch, flashback_table_mismatch, litrep_comp_mismatch, plsql_debug, 
                     load_optimizer_stats, acl_mismatch, flashback_archive_mismatch, lock_user_schema_failed, remote_mapping_mismatch, 
                     load_runtime_heap_failed, hash_match_failed, purged_cursor, bind_length_upgradeable, use_feedback_stats,
                     count(*) over (partition by sql_id) nbr_child_cursors
              from v$sql_shared_cursor
            ) A
     )
where dr <= 5
order by sql_id, child_number;

clear breaks

prompt counts per mismatch reason
prompt ---------------------------

set linesize 2000

select
sum(decode(sql_type_mismatch, 'Y', 1, 0)) sql_type_mismatch
,sum(decode(optimizer_mismatch, 'Y', 1, 0)) optimizer_mismatch
,sum(decode(outline_mismatch, 'Y', 1, 0)) outline_mismatch
,sum(decode(stats_row_mismatch, 'Y', 1, 0)) stats_row_mismatch
,sum(decode(literal_mismatch, 'Y', 1, 0)) literal_mismatch
,sum(decode(force_hard_parse, 'Y', 1, 0)) force_hard_parse
,sum(decode(explain_plan_cursor, 'Y', 1, 0)) explain_plan_cursor
,sum(decode(buffered_dml_mismatch, 'Y', 1, 0)) buffered_dml_mismatch
,sum(decode(pdml_env_mismatch, 'Y', 1, 0)) pdml_env_mismatch
,sum(decode(inst_drtld_mismatch, 'Y', 1, 0)) inst_drtld_mismatch
,sum(decode(slave_qc_mismatch, 'Y', 1, 0)) slave_qc_mismatch
,sum(decode(typecheck_mismatch, 'Y', 1, 0)) typecheck_mismatch
,sum(decode(auth_check_mismatch, 'Y', 1, 0)) auth_check_mismatch
,sum(decode(bind_mismatch, 'Y', 1, 0)) bind_mismatch
,sum(decode(describe_mismatch, 'Y', 1, 0)) describe_mismatch
,sum(decode(language_mismatch, 'Y', 1, 0)) language_mismatch
,sum(decode(translation_mismatch, 'Y', 1, 0)) translation_mismatch
,sum(decode(bind_equiv_failure, 'Y', 1, 0)) bind_equiv_failure
,sum(decode(insuff_privs, 'Y', 1, 0)) insuff_privs
,sum(decode(insuff_privs_rem, 'Y', 1, 0)) insuff_privs_rem
,sum(decode(remote_trans_mismatch, 'Y', 1, 0)) remote_trans_mismatch
,sum(decode(logminer_session_mismatch, 'Y', 1, 0)) logminer_session_mismatch
,sum(decode(incomp_ltrl_mismatch, 'Y', 1, 0)) incomp_ltrl_mismatch
,sum(decode(overlap_time_mismatch, 'Y', 1, 0)) overlap_time_mismatch
,sum(decode(edition_mismatch, 'Y', 1, 0)) edition_mismatch
,sum(decode(mv_query_gen_mismatch, 'Y', 1, 0)) mv_query_gen_mismatch
,sum(decode(user_bind_peek_mismatch, 'Y', 1, 0)) user_bind_peek_mismatch
,sum(decode(typchk_dep_mismatch, 'Y', 1, 0)) typchk_dep_mismatch
,sum(decode(no_trigger_mismatch, 'Y', 1, 0)) no_trigger_mismatch
,sum(decode(flashback_cursor, 'Y', 1, 0)) flashback_cursor
,sum(decode(anydata_transformation, 'Y', 1, 0)) anydata_transformation
,sum(decode(pddl_env_mismatch, 'Y', 1, 0)) pddl_env_mismatch
,sum(decode(top_level_rpi_cursor, 'Y', 1, 0)) top_level_rpi_cursor
,sum(decode(different_long_length, 'Y', 1, 0)) different_long_length
,sum(decode(logical_standby_apply, 'Y', 1, 0)) logical_standby_apply
,sum(decode(diff_call_durn, 'Y', 1, 0)) diff_call_durn
,sum(decode(bind_uacs_diff, 'Y', 1, 0)) bind_uacs_diff
,sum(decode(plsql_cmp_switchs_diff, 'Y', 1, 0)) plsql_cmp_switchs_diff
,sum(decode(cursor_parts_mismatch, 'Y', 1, 0)) cursor_parts_mismatch
,sum(decode(stb_object_mismatch, 'Y', 1, 0)) stb_object_mismatch
,sum(decode(crossedition_trigger_mismatch, 'Y', 1, 0)) crossedition_trigger_mismatch
,sum(decode(pq_slave_mismatch, 'Y', 1, 0)) pq_slave_mismatch
,sum(decode(top_level_ddl_mismatch, 'Y', 1, 0)) top_level_ddl_mismatch
,sum(decode(multi_px_mismatch, 'Y', 1, 0)) multi_px_mismatch
,sum(decode(bind_peeked_pq_mismatch, 'Y', 1, 0)) bind_peeked_pq_mismatch
,sum(decode(mv_rewrite_mismatch, 'Y', 1, 0)) mv_rewrite_mismatch
,sum(decode(roll_invalid_mismatch, 'Y', 1, 0)) roll_invalid_mismatch
,sum(decode(optimizer_mode_mismatch, 'Y', 1, 0)) optimizer_mode_mismatch
,sum(decode(px_mismatch, 'Y', 1, 0)) px_mismatch
,sum(decode(mv_staleobj_mismatch, 'Y', 1, 0)) mv_staleobj_mismatch
,sum(decode(flashback_table_mismatch, 'Y', 1, 0)) flashback_table_mismatch
,sum(decode(litrep_comp_mismatch, 'Y', 1, 0)) litrep_comp_mismatch
,sum(decode(plsql_debug, 'Y', 1, 0)) plsql_debug
,sum(decode(load_optimizer_stats, 'Y', 1, 0)) load_optimizer_stats
,sum(decode(acl_mismatch, 'Y', 1, 0)) acl_mismatch
,sum(decode(flashback_archive_mismatch, 'Y', 1, 0)) flashback_archive_mismatch
,sum(decode(lock_user_schema_failed, 'Y', 1, 0)) lock_user_schema_failed
,sum(decode(remote_mapping_mismatch, 'Y', 1, 0)) remote_mapping_mismatch
,sum(decode(load_runtime_heap_failed, 'Y', 1, 0)) load_runtime_heap_failed
,sum(decode(hash_match_failed, 'Y', 1, 0)) hash_match_failed
,sum(decode(purged_cursor, 'Y', 1, 0)) purged_cursor
,sum(decode(bind_length_upgradeable, 'Y', 1, 0)) bind_length_upgradeable
,sum(decode(use_feedback_stats, 'Y', 1, 0)) use_feedback_stats
from v$sql_shared_cursor;


prompt average cursors per session
prompt ---------------------------

column avg_per_session format 9G999D99

select avg(counted) avg_per_session
from  ( select count(*) counted
        from v$open_cursor
        group by sid
      );

prompt average cursors per session split by cursor type
prompt ------------------------------------------------

column avg_per_session format 9G999D99

select cursor_type, (count(*)/(select count(distinct sid) from v$open_cursor)) avg_per_session
from v$open_cursor
group by cursor_type;

prompt sharable memory per namespace, type and status
prompt ----------------------------------------------

column namespace format a35
column type format a35
column kb format 999G999G999D99

select namespace, type, status, sum(sharable_mem)/1024 KB
from v$db_object_cache
group by namespace, type, status
order by namespace, type, status;

spool off
