Chapter 2 < oracle_quick.ksh #!/bin/ksh # First, we must set the environment . . . . ORACLE_SID=$ORACLE_SID export ORACLE_SID ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'` export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH export PATH echo "Please enter the number of seconds between snapshots." read elapsed $ORACLE_HOME/bin/sqlplus –s perfstat/perfstat<<! execute statspack.snap snap" ; exit ! sleep $elapsed $ORACLE_HOME/bin/sqlplus –s perfstat/perfstat<<! execute statspack.snap; select name, snap_id, to_char(snap_time,' dd Mon YYYY HH24:mi:ss') from stats\$snapshot, v\$database where snap_id > (select max(snap_id)-2 from stats\$snapshot) ; < features_used.sql select samp.dbid, fu.name, samp.version, detected_usages, total_samples, decode(to_char(last_usage_date, 'MM/DD/YYYY, HH:MI:SS'), NULL, 'FALSE', to_char(last_sample_date, 'MM/DD/YYYY, HH:MI:SS'), 'TRUE', 'FALSE') currently_used, first_usage_date, last_usage_date, aux_count, feature_info, last_sample_date, last_sample_period, sample_interval, mt.description from wri$_dbu_usage_sample samp, wri$_dbu_feature_usage fu, wri$_dbu_feature_metadata mt where samp.dbid = fu.dbid and samp.version = fu.version and fu.name = mt.name and fu.name not like '_DBFUS_TEST%' and /* filter test features */ bitand(mt.usg_det_method, 4) != 4 /* filter disabled feat */; < phys_disk_reads.sql break on begin_interval_time skip 2 column phyrds format 999,999,999 column begin_interval_time format a25 select begin_interval_time, filename, phyrds from dba_hist_filestatxs natural join dba_hist_snapshot ; < display_statistics.sql prompt prompt This will query the dba_hist_sysstat to display all values prompt that exceed the value specified in prompt the "where" clause of the query. prompt set pages 999 break on snap_time skip 2 accept stat_name char prompt 'Enter Statistic Name: '; accept stat_value number prompt 'Enter Statistics Threshold value: '; col snap_time format a19 col value format 999,999,999 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, value from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = '&stat_name' and value > &stat_value order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi'); < track_hot_write.sql prompt prompt This will identify any single file who's write I/O prompt is more than 25% of the total write I/O of the database. prompt set pages 999 break on snap_time skip 2 col filename format a40 col phywrts format 999,999,999 col snap_time format a20 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, filename, phywrts from dba_hist_filestatxs natural join dba_hist_snapshot where phywrts > 0 and phywrts * 4 > ( select avg(value) all_phys_writes from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = 'physical writes' and value > 0 ) order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi'), phywrts desc; < rpt_sysstat_hr.sql prompt This will query the dba_hist_sysstat view to prompt display average values by hour of the day set pages 999 break on snap_time skip 2 accept stat_name char prompt 'Enter Statistics Name: '; col snap_time format a19 col avg_value format 999,999,999 select to_char(begin_interval_time,'hh24') snap_time, avg(value) avg_value from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = '&stat_name' group by to_char(begin_interval_time,'hh24') order by to_char(begin_interval_time,'hh24'); < plot_values_by_hour.sql prompt prompt This will query the dba_hist_sysstat view to display prompt average values by day-of-the-week prompt set pages 999 accept stat_name char prompt 'Enter Statistic Name: '; col snap_time format a19 col avg_value format 999,999,999 select to_char(begin_interval_time,'day') snap_time, avg(value) avg_value from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = '&stat_name' group by to_char(begin_interval_time,'day') order by decode( to_char(begin_interval_time,'day'), 'sunday',1, 'monday',2, 'tuesday',3, 'wednesday',4, 'thursday',5, 'friday',6, 'saturday',7 ) ; Chapter 3 < sess_waits_ash.sql select b.username, a.stat_name, round((a.value / 1000000),3) time_secs from v$sess_time_model a, v$session b where a.sid = b.sid and b.sid = 123 order by 3 desc; < elapsed_time.sql select s.sid, s.username, s.module, round(t.value/1000000,2) "elapsed processing time (sec)" from v$sess_time_model t, v$session s where t.sid = s.sid and t.stat_name = 'db time' and s.username IS NOT NULL and t.value/1000000 >= 1; < pct_of_tot_elapsed_time.sql select e.stat_name "E.STAT_NAME" , Round((e.value - b.value)/1000000,2)"Time (s)" , Round(decode( e.stat_name,'DB time' , to_number(null) , 100*(e.value - b.value) )/ (select nvl((e1.value - b1.value),-1) FROM dba_hist_sys_time_model e1 , dba_hist_sys_time_model b1 WHERE b1.snap_id = b.snap_id AND e1.snap_id = e.snap_id AND b1.dbid = b.dbid AND e1.dbid = e.dbid AND b1.instance_number = b.instance_number AND e1.instance_number = e.instance_number AND e1.stat_name = 'DB time' AND b1.stat_id = e1.stat_id ),2) "Percent of Total DB Time" from dba_hist_sys_time_model e, dba_hist_sys_time_model b WHERE b.snap_id = &pBgnSnap AND e.snap_id = &pEndSnap AND b.dbid = &pDbId AND e.dbid = &pDbId AND b.instance_number = &pInstNum AND e.instance_number = &pInstNum AND b.stat_id = e.stat_id AND e.value - b.value > 0 ORDER BY 2 DESC < avg_workload_hour_of_the_day.sql select to_char(end_interval_time,'HH24') "Hour of Day", Round(avg(newtime.value-oldtime.value)/1000000,2) "Avg DB Time (Sec)" from dba_hist_sys_time_model oldtime, dba_hist_sys_time_model newtime, dba_hist_snapshot sn where newtime.snap_id = sn.snap_id and oldtime.snap_id = sn.snap_id-1 and newtime.stat_name = 'DB time' and oldtime.stat_name = 'DB time' having avg(newtime.value-oldtime.value) > 0 group by to_char(end_interval_time,'HH24'); Chapter 4 < cache_advice.sql column c1 heading 'Cache Size (meg)' format 999,999,999,999 column c2 heading 'Buffers' format 999,999,999 column c3 heading 'Estd Phys|Read Factor' format 999.90 column c4 heading 'Estd Phys| Reads' format 999,999,999 select size_for_estimate c1, buffers_for_estimate c2, estd_physical_read_factor c3, estd_physical_reads c4 from v$db_cache_advice where name = 'DEFAULT' and block_size = (select value from v$parameter where name = 'db_block_size') and advice_status = 'ON'; < display_stat.sql prompt prompt This will query the dba_hist_sysstat view to display all values prompt that exceed the value specified in the "where" clause of the query. prompt set pages 999 break on snap_time skip 2 accept stat_name char prompt 'Enter Statistic Name: '; accept stat_value number prompt 'Enter Statistics Threshold value: '; col snap_time format a19 col value format 999,999,999 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, value from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = '&stat_name' and value > &stat_value order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') ; < wait_time_detail_10g.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* prompt prompt This will compare values from dba_hist_waitstat with prompt detail information from dba_hist_active_sess_history. prompt set pages 999 set lines 80 break on snap_time skip 2 col snap_time heading 'Snap|Time' format a20 col file_name heading 'File|Name' format a40 col object_type heading 'Object|Type' format a10 col object_name heading 'Object|Name' format a20 col wait_count heading 'Wait|Count' format 999,999 col time heading 'Time' format 999,999 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, object_type, object_name, wait_count, time from dba_hist_waitstat wait, dba_hist_snapshot snap, dba_hist_active_sess_history ash, dba_data_files df, dba_objects obj where wait.snap_id = snap.snap_id and wait.snap_id = ash.snap_id and df.file_id = ash.current_file# and obj.object_id = ash.current_obj# and wait_count > 50 order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi'), file_name; < file_io_hogs.sql prompt This will identify any single file who's write I/O prompt is more than 25% of the total write I/O of the database. prompt set pages 999 break on snap_time skip 2 col filename format a40 col phywrts format 999,999,999 col snap_time format a20 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, filename, phywrts from dba_hist_filestatxs natural join dba_hist_snapshot where phywrts > 0 and phywrts * 4 > ( select avg(value) all_phys_writes from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = 'physical writes' and value > 0 ) order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi'), phywrts desc; Chapter 5 < sql_shared_cursor.sql select version_count, address, hash_value, parsing_schema_name, reason, sql_text from ( select address,'' ||decode(max( UNBOUND_CURSOR),'Y', ' UNBOUND_CURSOR') ||decode(max( SQL_TYPE_MISMATCH),'Y', ' SQL_TYPE_MISMATCH') ||decode(max( OPTIMIZER_MISMATCH),'Y', ' OPTIMIZER_MISMATCH') ||decode(max( OUTLINE_MISMATCH),'Y', ' OUTLINE_MISMATCH') ||decode(max( STATS_ROW_MISMATCH),'Y', ' STATS_ROW_MISMATCH') ||decode(max( LITERAL_MISMATCH),'Y', ' LITERAL_MISMATCH') ||decode(max( SEC_DEPTH_MISMATCH),'Y', ' SEC_DEPTH_MISMATCH') ||decode(max( EXPLAIN_PLAN_CURSOR),'Y', ' EXPLAIN_PLAN_CURSOR') ||decode(max( BUFFERED_DML_MISMATCH),'Y', ' BUFFERED_DML_MISMATCH') ||decode(max( PDML_ENV_MISMATCH),'Y', ' PDML_ENV_MISMATCH') ||decode(max( INST_DRTLD_MISMATCH),'Y', ' INST_DRTLD_MISMATCH') ||decode(max( SLAVE_QC_MISMATCH),'Y', ' SLAVE_QC_MISMATCH') ||decode(max( TYPECHECK_MISMATCH),'Y', ' TYPECHECK_MISMATCH') ||decode(max( AUTH_CHECK_MISMATCH),'Y', ' AUTH_CHECK_MISMATCH') ||decode(max( BIND_MISMATCH),'Y', ' BIND_MISMATCH') ||decode(max( DESCRIBE_MISMATCH),'Y', ' DESCRIBE_MISMATCH') ||decode(max( LANGUAGE_MISMATCH),'Y', ' LANGUAGE_MISMATCH') ||decode(max( TRANSLATION_MISMATCH),'Y', ' TRANSLATION_MISMATCH') ||decode(max( ROW_LEVEL_SEC_MISMATCH),'Y', ' ROW_LEVEL_SEC_MISMATCH') ||decode(max( INSUFF_PRIVS),'Y', ' INSUFF_PRIVS') ||decode(max( INSUFF_PRIVS_REM),'Y', ' INSUFF_PRIVS_REM') ||decode(max( REMOTE_TRANS_MISMATCH),'Y', ' REMOTE_TRANS_MISMATCH') ||decode(max( LOGMINER_SESSION_MISMATCH),'Y', ' LOGMINER_SESSION_MISMATCH') ||decode(max( INCOMP_LTRL_MISMATCH),'Y', ' INCOMP_LTRL_MISMATCH') ||decode(max( OVERLAP_TIME_MISMATCH),'Y', ' OVERLAP_TIME_MISMATCH') ||decode(max( SQL_REDIRECT_MISMATCH),'Y', ' SQL_REDIRECT_MISMATCH') ||decode(max( MV_QUERY_GEN_MISMATCH),'Y', ' MV_QUERY_GEN_MISMATCH') ||decode(max( USER_BIND_PEEK_MISMATCH),'Y', ' USER_BIND_PEEK_MISMATCH') ||decode(max( TYPCHK_DEP_MISMATCH),'Y', ' TYPCHK_DEP_MISMATCH') ||decode(max( NO_TRIGGER_MISMATCH),'Y', ' NO_TRIGGER_MISMATCH') ||decode(max( FLASHBACK_CURSOR),'Y', ' FLASHBACK_CURSOR') ||decode(max( ANYDATA_TRANSFORMATION),'Y', ' ANYDATA_TRANSFORMATION') ||decode(max( INCOMPLETE_CURSOR),'Y', ' INCOMPLETE_CURSOR') ||decode(max( TOP_LEVEL_RPI_CURSOR),'Y', ' TOP_LEVEL_RPI_CURSOR') ||decode(max( DIFFERENT_LONG_LENGTH),'Y', ' DIFFERENT_LONG_LENGTH') ||decode(max( LOGICAL_STANDBY_APPLY),'Y', ' LOGICAL_STANDBY_APPLY') ||decode(max( DIFF_CALL_DURN),'Y', ' DIFF_CALL_DURN') ||decode(max( BIND_UACS_DIFF),'Y', ' BIND_UACS_DIFF') ||decode(max( PLSQL_CMP_SWITCHS_DIFF),'Y', ' PLSQL_CMP_SWITCHS_DIFF') ||decode(max( CURSOR_PARTS_MISMATCH),'Y', ' CURSOR_PARTS_MISMATCH') ||decode(max( STB_OBJECT_MISMATCH),'Y', ' STB_OBJECT_MISMATCH') ||decode(max( ROW_SHIP_MISMATCH),'Y', ' ROW_SHIP_MISMATCH') ||decode(max( PQ_SLAVE_MISMATCH),'Y', ' PQ_SLAVE_MISMATCH') ||decode(max( TOP_LEVEL_DDL_MISMATCH),'Y', ' TOP_LEVEL_DDL_MISMATCH') ||decode(max( MULTI_PX_MISMATCH),'Y', ' MULTI_PX_MISMATCH') ||decode(max( BIND_PEEKED_PQ_MISMATCH),'Y', ' BIND_PEEKED_PQ_MISMATCH') ||decode(max( MV_REWRITE_MISMATCH),'Y', ' MV_REWRITE_MISMATCH') ||decode(max( ROLL_INVALID_MISMATCH),'Y', ' ROLL_INVALID_MISMATCH') ||decode(max( OPTIMIZER_MODE_MISMATCH),'Y', ' OPTIMIZER_MODE_MISMATCH') ||decode(max( PX_MISMATCH),'Y', ' PX_MISMATCH') ||decode(max( MV_STALEOBJ_MISMATCH),'Y', ' MV_STALEOBJ_MISMATCH') ||decode(max( FLASHBACK_TABLE_MISMATCH),'Y', ' FLASHBACK_TABLE_MISMATCH') ||decode(max( LITREP_COMP_MISMATCH),'Y', ' LITREP_COMP_MISMATCH') reason from v$sql_shared_cursor group by address ) join v$sqlarea using(address) where version_count>&versions order by version_count desc, address; < check_bind_sensitive_sql.sql select sql_id, child_number, is_bind_sensitive, is_bind_aware from v$sql where sql_text = 'select max(id) from acs_test_tab where record_type = :l_record_type'; The following are additional sample queries for 11g adaptive cursor sharing: select hash_value, sql_id, child_number, range_id, low, high, predicate from v$sql_cs_selectivity; And: select hash_value, sql_id, child_number, bucket_id, count from v$sql_cs_histogram; And: select sql_id, hash_value, plan_hash_value, is_bind_sensitive, is_bind_aware, sql_text from v$sql; And: select hash_value, sql_id, child_number, bind_set_hash_value, peeked, executions, rows_processed, buffer_gets cpu_time from v$sql_cs_statistics; column "Tablespace" format a13 column "Used MB" format 99,999,999 column "Free MB" format 99,999,999 colimn "Total MB" format 99,999,999 select fs.tablespace_name "Tablespace", (df.totalspace - fs.freespace) "Used MB", fs.freespace "Free MB", df.totalspace "Total MB", round(100 * (fs.freespace / df.totalspace)) "Pct. Free" from (select tablespace_name, round(sum(bytes) / 1048576) TotalSpace from dba_data_files group by tablespace_name ) df, (select tablespace_name, round(sum(bytes) / 1048576) FreeSpace from dba_free_space group by tablespace_name ) fs where df.tablespace_name = fs.tablespace_name; < plan9i.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set echo off; set feedback on set pages 999; column nbr_FTS format 999,999 column num_rows format 999,999,999 column blocks format 999,999 column owner format a14; column name format a24; column ch format a1; column object_owner heading "Owner" format a12; column ct heading "# of SQL selects" format 999,999; select object_owner, count(*) ct from v$sql_plan where object_owner is not null group by object_owner order by ct desc ; --spool access.lst; set heading off; set feedback off; set heading on; set feedback on; ttitle 'full table scans and counts| |The "K" indicates that the table is in the KEEP Pool (Oracle8).' select p.owner, p.name, t.num_rows, -- ltrim(t.cache) ch, decode(t.buffer_pool,'KEEP','Y','DEFAULT','N') K, s.blocks blocks, sum(a.executions) nbr_FTS from dba_tables t, dba_segments s, v$sqlarea a, (select distinct address, object_owner owner, object_name name from v$sql_plan where operation = 'TABLE ACCESS' and options = 'FULL') p where a.address = p.address and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') having sum(a.executions) > 9 group by p.owner, p.name, t.num_rows, t.cache, t.buffer_pool, s.blocks order by sum(a.executions) desc; column nbr_RID format 999,999,999 column num_rows format 999,999,999 column owner format a15; column name format a25; ttitle 'Table access by ROWID and counts' select p.owner, p.name, t.num_rows, sum(s.executions) nbr_RID from dba_tables t, v$sqlarea s, (select distinct address, object_owner owner, object_name name from v$sql_plan where operation = 'TABLE ACCESS' and options = 'BY ROWID') p where s.address = p.address and t.table_name = p.name and t.owner = p.owner having sum(s.executions) > 9 group by p.owner, p.name, t.num_rows order by sum(s.executions) desc; --************************************************* < plan10g.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* spool plan.lst set echo off set feedback on set pages 999; column nbr_FTS format 99,999 column num_rows format 999,999 column blocks format 9,999 column owner format a10; column name format a30; column ch format a1; column time heading "Snapshot Time" format a15 column object_owner heading "Owner" format a12; column ct heading "# of SQL selects" format 999,999; break on time select object_owner, count(*) ct from dba_hist_sql_plan where object_owner is not null group by object_owner order by ct desc ; --spool access.lst; set heading on; set feedback on; ttitle 'full table scans and counts| |The "K" indicates that the table is in the KEEP Pool (Oracle8).' select to_char(sn.end_interval_time,'mm/dd/rr hh24') time, p.owner, p.name, t.num_rows, -- ltrim(t.cache) ch, decode(t.buffer_pool,'KEEP','Y','DEFAULT','N') K, s.blocks blocks, sum(a.executions_delta) nbr_FTS from dba_tables t, dba_segments s, dba_hist_sqlstat a, dba_hist_snapshot sn, (select distinct pl.sql_id, object_owner owner, object_name name from dba_hist_sql_plan pl where operation = 'TABLE ACCESS' and options = 'FULL') p where a.snap_id = sn.snap_id and a.sql_id = p.sql_id and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') having sum(a.executions_delta) > 1 group by to_char(sn.end_interval_time,'mm/dd/rr hh24'),p.owner, p.name, t.num_rows, t.cache, t.buffer_pool, s.blocks order by 1 asc; column nbr_RID format 999,999,999 column num_rows format 999,999,999 column owner format a15; column name format a25; ttitle 'Table access by ROWID and counts' select to_char(sn.end_interval_time,'mm/dd/rr hh24') time, p.owner, p.name, t.num_rows, sum(a.executions_delta) nbr_RID from dba_tables t, dba_hist_sqlstat a, dba_hist_snapshot sn, (select distinct pl.sql_id, object_owner owner, object_name name from dba_hist_sql_plan pl where operation = 'TABLE ACCESS' and options = 'BY USER ROWID') p where a.snap_id = sn.snap_id and a.sql_id = p.sql_id and t.table_name = p.name and t.owner = p.owner having sum(a.executions_delta) > 9 group by to_char(sn.end_interval_time,'mm/dd/rr hh24'),p.owner, p.name, t.num_rows order by 1 asc; --************************************************* -- Index Report Section --************************************************* column nbr_scans format 999,999,999 column num_rows format 999,999,999 column tbl_blocks format 999,999,999 column owner format a9; column table_name format a20; column index_name format a20; ttitle 'Index full scans and counts' select to_char(sn.end_interval_time,'mm/dd/rr hh24') time, p.owner, d.table_name, p.name index_name, seg.blocks tbl_blocks, sum(s.executions_delta) nbr_scans from dba_segments seg, dba_indexes d, dba_hist_sqlstat s, dba_hist_snapshot sn, (select distinct pl.sql_id, object_owner owner, object_name name from dba_hist_sql_plan pl where operation = 'INDEX' and options = 'FULL SCAN') p where d.index_name = p.name and s.snap_id = sn.snap_id and s.sql_id = p.sql_id and d.table_name = seg.segment_name and seg.owner = p.owner having sum(s.executions_delta) > 9 group by to_char(sn.end_interval_time,'mm/dd/rr hh24'),p.owner, d.table_name, p.name, seg.blocks order by 1 asc; ttitle 'Index range scans and counts' select to_char(sn.end_interval_time,'mm/dd/rr hh24') time, p.owner, d.table_name, p.name index_name, seg.blocks tbl_blocks, sum(s.executions_delta) nbr_scans from dba_segments seg, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_indexes d, (select distinct pl.sql_id, object_owner owner, object_name name from dba_hist_sql_plan pl where operation = 'INDEX' and options = 'RANGE SCAN') p where d.index_name = p.name and s.snap_id = sn.snap_id and s.sql_id = p.sql_id and d.table_name = seg.segment_name and seg.owner = p.owner having sum(s.executions_delta) > 9 group by to_char(sn.end_interval_time,'mm/dd/rr hh24'),p.owner, d.table_name, p.name, seg.blocks order by 1 asc; ttitle 'Index unique scans and counts' select to_char(sn.end_interval_time,'mm/dd/rr hh24') time, p.owner, d.table_name, p.name index_name, sum(s.executions_delta) nbr_scans from dba_hist_sqlstat s, dba_hist_snapshot sn, dba_indexes d, (select distinct pl.sql_id, object_owner owner, object_name name from dba_hist_sql_plan pl where operation = 'INDEX' and options = 'UNIQUE SCAN') p where d.index_name = p.name and s.snap_id = sn.snap_id and s.sql_id = p.sql_id having sum(s.executions_delta) > 9 group by to_char(sn.end_interval_time,'mm/dd/rr hh24'),p.owner, d.table_name, p.name order by 1 asc; spool off < optimizer_index_cost_adj.sql col c1 heading 'Average Waits for|Full Scan Read I/O' format 9999.999 col c2 heading 'Average Waits for|Index Read I/O' format 9999.999 col c3 heading 'Percent of| I/O Waits|for Full Scans' format 9.99 col c4 heading 'Percent of| I/O Waits|for Index Scans' format 9.99 col c5 heading 'Starting|Value|for|optimizer|index|cost|adj' format 999 select a.average_wait c1, b.average_wait c2, a.total_waits /(a.total_waits + b.total_waits) c3, b.total_waits /(a.total_waits + b.total_waits) c4, (b.average_wait / a.average_wait)*100 c5 from v$system_event a, v$system_event b where a.event = 'db file scattered read' and b.event = 'db file sequential read' ; < delete_forall.sql set serveroutput on declare type t_id_tab is table of forall_test.id%TYPE; type t_code_tab is table of forall_test.code%TYPE; l_id_tab t_id_tab := t_id_tab(); l_code_tab t_code_tab := t_code_tab(); l_start number; l_size number := 10000; begin -- Populate collections. for i in 1 .. l_size loop l_id_tab.extend; l_code_tab.extend; l_id_tab(l_id_tab.last) := i; l_code_tab(l_code_tab.last) := to_char(i); end loop; -- Time regular updates. l_start := dbms_utility.get_time; for i in l_id_tab.first .. l_id_tab.last loop delete from forall_test where id = l_id_tab(i) and code = l_code_tab(i); end loop; rollback; dbms_output.put_line('Normal Deletes : ' || (dbms_utility.get_time - l_start)); l_start := dbms_utility.get_time; -- Time bulk updates. forall i in l_id_tab.first .. l_id_tab.last delete from forall_test where id = l_id_tab(i) and code = l_code_tab(i); dbms_output.put_line('Bulk Deletes : ' || (dbms_utility.get_time - l_start)); rollback; end; / < update_forall.sql set serveroutput on declare type t_id_tab is table of forall_test.id%TYPE; type t_forall_test_tab is table of forall_test%ROWTYPE; l_id_tab t_id_tab := t_id_tab(); l_tab t_forall_test_tab := t_forall_test_tab (); l_start number; l_size number := 10000; begin -- Populate collections. for i in 1 .. l_size loop l_id_tab.extend; l_tab.extend; l_id_tab(l_id_tab.last) := i; l_tab(l_tab.last).id := i; l_tab(l_tab.last).code := to_char(i); l_tab(l_tab.last).description := 'Description: ' || to_char(i); end loop; -- Time regular updates. l_start := dbms_utility.get_time; for i in l_tab.first .. l_tab.last loop update forall_test set row = l_tab(i) where id = l_tab(i).id; end loop; dbms_output.put_line('Normal Updates : ' || (dbms_utility.get_time - l_start)); l_start := dbms_utility.get_time; -- Time bulk updates. -- **************************************************** -- *** Here is the forall -- **************************************************** forall i in l_tab.first .. l_tab.last update forall_test set row = l_tab(i) where id = l_id_tab(i); dbms_output.put_line('Bulk Updates : ' || (dbms_utility.get_time - l_start)); commit; end; / < oracle10g_quick.ksh -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* spool rpt_last.lst set pages 9999; set feedback on; set verify off; column reads format 999,999,999 column writes format 999,999,999 select to_char(sn.end_interval_time,'yyyy-mm-dd HH24'), (newreads.value-oldreads.value) reads, (newwrites.value-oldwrites.value) writes from dba_hist_sysstat oldreads, dba_hist_sysstat newreads, dba_hist_sysstat oldwrites, dba_hist_sysstat newwrites, dba_hist_snapshot sn where newreads.snap_id = (select max(sn.snap_id) from dba_hist_snapshot) and newwrites.snap_id = (select max(sn.snap_id) from dba_hist_snapshot) and oldreads.snap_id = sn.snap_id-1 and oldwrites.snap_id = sn.snap_id-1 and oldreads.stat_name = 'physical reads' and newreads.stat_name = 'physical reads' and oldwrites.stat_name = 'physical writes' and newwrites.stat_name = 'physical writes' ; prompt *********************************************************** prompt This will identify any single file who's read I/O prompt is more than 10% of the total read I/O of the database. prompt prompt The "hot" file should be examined, and the hot table/index prompt should be identified using STATSPACK. prompt prompt - The busy file should be placed on a disk device with prompt "less busy" files to minimize read delay and channel prompt contention. prompt prompt - If small file has a hot small table, place the table prompt in the KEEP pool prompt prompt - If the file has a large-table full-table scan, place prompt the table in the RECYCLE pool and turn on parallel query prompt for the table. prompt *********************************************************** column mydate format a16 column file_name format a40 column reads format 999,999,999 select to_char(sn.end_interval_time,'yyyy-mm-dd HH24') mydate, new.filename file_name, new.phyrds-old.phyrds reads from dba_hist_filestatxs old, dba_hist_filestatxs new, dba_hist_snapshot snwhere sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 and new.filename = old.filename --and -- new.phyrds-old.phyrds > 10000 and (new.phyrds-old.phyrds)*10 > ( select (newreads.value-oldreads.value) reads from dba_hist_sysstat oldreads, dba_hist_sysstat newreads, dba_hist_snapshot sn1 where sn.snap_id = sn1.snap_id and newreads.snap_id = sn.snap_id and oldreads.snap_id = sn.snap_id-1 and oldreads.stat_name = 'physical reads' and newreads.stat_name = 'physical reads' and (newreads.value-oldreads.value) > 0) ; prompt *********************************************************** prompt This will identify any single file who's write I/O prompt is more than 10% of the total write I/O of the database. prompt prompt The "hot" file should be examined, and the hot table/index prompt should be identified using STATSPACK. prompt prompt - The busy file should be placed on a disk device with prompt "less busy" files to minimize write delay and channel prompt channel contention. prompt prompt - If small file has a hot small table, place the table prompt in the KEEP pool prompt prompt *********************************************************** column mydate format a16 column file_name format a40 column writes format 999,999,999 select to_char(sn.end_interval_time,'yyyy-mm-dd HH24') mydate, new.filename file_name, new.phywrts-old.phywrts writes from dba_hist_filestatxs old, dba_hist_filestatxs new, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 and new.filename = old.filename --and ---- new.phywrts-old.phywrts > 10000 and (new.phywrts-old.phywrts)*10 > (select(newwrites.value-oldwrites.value) writes from dba_hist_sysstat oldwrites, dba_hist_sysstat newwrites, dba_hist_snapshot sn1 where sn.snap_id = sn1.snap_id and newwrites.snap_id = sn.snap_id and oldwrites.snap_id = sn.snap_id-1 and oldwrites.stat_name = 'physical writes' and newwrites.stat_name = 'physical writes' and (newwrites.value-oldwrites.value) > 0) ; prompt *********************************************************** prompt The data buffer hit ratio is controlled by the db_block_buffer or db_cache_size parameters. prompt *********************************************************** column logical_reads format 999,999,999 column phys_reads format 999,999,999 column phys_writes format 999,999,999 column "BUFFER HIT RATIO" format 999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, d.value "phys_writes", round(100 * (((a.value-e.value)+(b.value-f.value))-(c.value-g.value)) / ((a.value-e.value)+(b.value-f.value))) "BUFFER HIT RATIO" from dba_hist_sysstat a, dba_hist_sysstat b, dba_hist_sysstat c, dba_hist_sysstat d, dba_hist_sysstat e, dba_hist_sysstat f, dba_hist_sysstat g, dba_hist_snapshot sn where -- (round(100 * (((a.value-e.value)+(b.value-f.value))-(c.value-g.value)) --/ ((a.value-e.value)+(b.value-f.value))) ) < 90 --and sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and a.snap_id = sn.snap_id and b.snap_id = sn.snap_id and c.snap_id = sn.snap_id and d.snap_id = sn.snap_id and e.snap_id = sn.snap_id-1 and f.snap_id = sn.snap_id-1 and g.snap_id = sn.snap_id-1 and a.stat_name = 'consistent gets' and e.stat_name = 'consistent gets' and b.stat_name = 'db block gets' and f.stat_name = 'db block gets' and c.stat_name = 'physical reads' and g.stat_name = 'physical reads' and d.stat_name = 'physical writes' ; column mydate heading 'Yr. Mo Dy Hr.' format a16 column reloads format 999,999,999 column hit_ratio format 999.99 column pin_hit_ratio format 999.99 break on mydate skip 2; select to_char(sn.end_interval_time,'yyyy-mm-dd HH24') mydate, new.namespace, (new.gethits-old.gethits)/(new.gets-old.gets) hit_ratio, (new.pinhits-old.pinhits)/(new.pins-old.pins) pin_hit_ratio, new.reloads from dba_hist_librarycache old, dba_hist_librarycache new, dba_hist_snapshot sn where new.snap_id = sn.snap_id and old.snap_id = new.snap_id-1 and old.namespace = new.namespace and new.gets-old.gets > 0 and new.pins-old.pins > 0 ; prompt *********************************************************** prompt When there are high disk sorts, you should investigate prompt increasing sort_area_size, or adding indexes to force index_full scans prompt *********************************************************** column sorts_memory format 999,999,999 column sorts_disk format 999,999,999 column ratio format .9999999999999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, newmem.value-oldmem.value sorts_memory, newdsk.value-olddsk.value sorts_disk, (newdsk.value-olddsk.value)/(newmem.value-oldmem.value) ratio from dba_hist_sysstat oldmem, dba_hist_sysstat newmem, dba_hist_sysstat newdsk, dba_hist_sysstat olddsk, dba_hist_snapshot sn where -- Where there are more than 100 disk sorts per hour -- newdsk.value-olddsk.value > 100 --and sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and newdsk.snap_id = sn.snap_id and olddsk.snap_id = sn.snap_id-1 and newmem.snap_id = sn.snap_id and oldmem.snap_id = sn.snap_id-1 and oldmem.stat_name = 'sorts (memory)' and newmem.stat_name = 'sorts (memory)' and olddsk.stat_name = 'sorts (disk)' and newdsk.stat_name = 'sorts (disk)' and newmem.value-oldmem.value > 0 ; prompt *********************************************************** prompt When there is high I/O waits, disk bottlenecks may exist prompt Run iostats to find the hot disk and shuffle files to prompt remove the contention prompt prompt See p. 191 "High Performance Oracle8 Tuning" by Don Burleson prompt prompt *********************************************************** break on snapdate skip 2 column snapdate format a16 column filename format a40 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, old.filename, new.wait_count -old.wait_count waits from dba_hist_filestatxs old, dba_hist_filestatxs new, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and new.wait_count -old.wait_count > 0 and new.snap_id = sn.snap_id and old.filename = new.filename and old.snap_id = sn.snap_id-1 ; prompt *********************************************************** prompt Buffer Bury Waits may signal a high update table with too prompt few freelists. Find the offending table and add more freelists. prompt *********************************************************** column buffer_busy_wait format 999,999,999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, avg(new.buffer_busy_wait-old.buffer_busy_wait) buffer_busy_wait from dba_hist_buffer_pool_stat old, dba_hist_buffer_pool_stat new, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and new.snap_id = sn.snap_id and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 --having -- avg(new.buffer_busy_wait-old.buffer_busy_wait) > 100 group by to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') ; prompt *********************************************************** prompt High redo log space requests indicate a need to increase prompt the log_buffer parameter prompt *********************************************************** column redo_log_space_requests format 999,999,999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, newmem.value-oldmem.value redo_log_space_requests from dba_hist_sysstat oldmem, dba_hist_sysstat newmem, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) --and -- newmem.value-oldmem.value > 30 and newmem.snap_id = sn.snap_id and oldmem.snap_id = sn.snap_id-1 and oldmem.stat_name = 'redo log space requests' and newmem.stat_name = 'redo log space requests' and newmem.value-oldmem.value > 0 ; prompt *********************************************************** prompt Table fetch continued row indicates chained rows, or prompt fetches of long datatypes (long raw, blob) prompt prompt Investigate increasing db_block_size or reorganizing tables prompt with chained rows. prompt prompt *********************************************************** column table_fetch_continued_row format 999,999,999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, avg(newmem.value-oldmem.value) table_fetch_continued_row from dba_hist_sysstat oldmem, dba_hist_sysstat newmem, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and newmem.snap_id = sn.snap_id and oldmem.snap_id = sn.snap_id-1 and oldmem.stat_name = 'table fetch continued row' and newmem.stat_name = 'table fetch continued row' --and -- newmem.value-oldmem.value > 0 --having -- avg(newmem.value-oldmem.value) > 10000 group by to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') ; prompt *********************************************************** prompt Enqueue Deadlocks indicate contention within the Oracle prompt shared pool. prompt prompt Investigate increasing shared_pool_size prompt *********************************************************** column enqueue_deadlocks format 999,999,999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, a.value enqueue_deadlocks from dba_hist_sysstat a, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and a.snap_id = sn.snap_id and a.stat_name = 'enqueue deadlocks' ; prompt *********************************************************** prompt Long-table full table scans can indicate a need to: prompt prompt - Make the offending tables parallel query prompt (alter table xxx parallel degree yyy;) prompt - Place the table in the RECYCLE pool prompt - Build an index on the table to remove the FTS prompt prompt To locate the table, run access.sql prompt prompt *********************************************************** column fts format 999,999,999 select to_char(sn.end_interval_time,'dd Mon HH24:mi:ss') mydate, newmem.value-oldmem.value fts from dba_hist_sysstat oldmem, dba_hist_sysstat newmem, dba_hist_snapshot sn where sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and newmem.snap_id = sn.snap_id and oldmem.snap_id = sn.snap_id-1 and oldmem.stat_name = 'table scans (long tables)' and newmem.stat_name = 'table scans (long tables)' ; spool off; Chapter 6 < awr_disk_reads.sql break on begin_interval_time skip 2 column phyrds format 999,999,999 column begin_interval_time format a25 select begin_interval_time, filename, phyrds from dba_hist_filestatxs natural join dba_hist_snapshot; < Creation Script for dba_hist_sysstat create table dba_hist_sysstat as select s.snap_id, s.dbid, s.instance_number, s.statistic#, s.statistic_hash, nm.statistic_name, value from wrm$_snapshot sn, wrh$_sysstat s, dba_hist_stat_name nm where s.statistic_hash = nm.statistic_hash and s.statistic# = nm.statistic# and s.dbid = nm.dbid and s.snap_id = sn.snap_id and s.dbid = sn.dbid and s.instance_number = sn.instance_number and sn.status = 0 and sn.bl_moved = 0 union all select s.snap_id, s.dbid, s.instance_number, s.statistic#, s.statistic_hash, nm.statistic_name, value from WRM$_SNAPSHOT sn, WRH$_SYSSTAT_BL s, DBA_HIST_STAT_NAME nm where s.statistic_hash = nm.statistic_hash and s.statistic# = nm.statistic# and s.dbid = nm.dbid and s.snap_id = sn.snap_id and s.dbid = sn.dbid and s.instance_number = sn.instance_number and sn.status = 0 and sn.bl_moved = 1; select s1.ucomment, w1.event, s1.snap_id, w1.total_waits, lag(w1.total_waits) over (order by s1.snap_id) prev_val, w1.total_waits - lag(w1.total_waits) over (order by s1.snap_id) delta_val from stats$snapshot s1, stats$system_event w1 where s1.snap_id between 313 and 320 and s1.snap_id = w1.snap_id and w1.event = 'db file sequential read' order by w1.event, s1.snap_id; select sy.snap_id, sy.statistic# statistic#, sy.name statname, sy.value - (LAG(sy.value) over (partition by sy.name order by sy.snap_id)) statdelta from stats$sysstat sy where sy.snap_id in (12208,12599,13480,13843) and sy.name IN ('consistent gets','consistent changes', 'db block gets', 'db block changes') order by sy.name, sy.snap_id; < wait_alert_email.ksh #!/bin/ksh # First, we must set the environment . . . . ORACLE_SID=proderp export ORACLE_SID ORACLE_HOME=`cat /var/opt/oracle/oratab|grep \^$ORACLE_SID:|cut -f2 -d':'` export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH export PATH SERVER_NAME=`uname -a|awk '{print $2}'` typeset -u SERVER_NAME export SERVER_NAME # sample every 10 seconds SAMPLE_TIME=10 while true do #************************************************************* # Test to see if Oracle is accepting connections #************************************************************* $ORACLE_HOME/bin/sqlplus -s /<<! > /tmp/check_$ORACLE_SID.ora select * from v\$database; exit ! #************************************************************* # If not, exit immediately . . . #************************************************************* check_stat=`cat /tmp/check_$ORACLE_SID.ora|grep -i error|wc -l`; oracle_num=`expr $check_stat` if [ $oracle_num -gt 0 ] then exit 0 fi rm -f /export/home/oracle/statspack/busy.lst $ORACLE_HOME/bin/sqlplus -s perfstat/perfstat<<!> /tmp/busy.lst set feedback off; select sysdate, event, substr(tablespace_name,1,14), p2 from v\$session_wait a, dba_data_files b where a.p1 = b.file_id ; ! var=`cat /tmp/busy.lst|wc -l` echo $var if [[ $var -gt 1 ]]; then echo *******************************************************************" echo "There are waits" cat /tmp/busy.lst|mailx -s "Prod block wait found"\ info@remote-dba.net \ Larry_Ellison@oracle.com echo *******************************************************************" exit fi sleep $SAMPLE_TIME done < event_read_waits.sql select to_char(snap_time,'mm/dd/yyyy hh24:mi:ss') snaptime , max(decode(event,'db file scattered read', nvl(wait_ms,0), null)) wait_ms_dbfscatrd , max(decode(event,'db file sequential read',nvl(wait_ms,0), null)) wait_ms_dbfseqrd , max(decode(event,'db file scattered read', nvl(waits,0), null)) waits_dbfscatrd , max(decode(event,'db file sequential read',nvl(waits,0), null)) waits_dbfseqrd from ( select ps.snap_time , event , case when (total_waits - lag_total_waits > 0) then round(( (time_waited_micro - lag_time_waited_micro) / (total_waits - lag_total_waits)) / 1000) else -1 end wait_ms , (total_waits - lag_total_waits) waits , (time_waited_micro - lag_time_waited_micro) time_waited from ( select se.snap_id , event , se.total_waits , se.total_timeouts , se.time_waited_micro , lag(se.event) over (order by snap_id, event) lag_event , lag(se.snap_id) over (order by snap_id, event) lag_snap_id , lag(se.total_waits) over (order by snap_id, event) lag_total_waits , lag(se.total_timeouts) over (order by snap_id, event) lag_total_timeouts , lag(se.time_waited_micro) over (order by snap_id, event) lag_time_waited_micro from perfstat.stats$system_event se where event = 'db file sequential read' and snap_id in (select snap_id from stats$snapshot where snap_time > trunc(sysdate) - 1 ) union all select se.snap_id , event , se.total_waits , se.total_timeouts , se.time_waited_micro , lag(se.event) over (order by snap_id, event) lag_event , lag(se.snap_id) over (order by snap_id, event) lag_snap_id , lag(se.total_waits) over (order by snap_id, event) lag_total_waits , lag(se.total_timeouts) over (order by snap_id, event) lag_total_timeouts , lag(se.time_waited_micro) over (order by snap_id, event) lag_time_waited_micro from perfstat.stats$system_event se where event = 'db file scattered read' and snap_id in (select snap_id from stats$snapshot where snap_time > trunc(sysdate) -1 ) order by event, snap_id ) a , perfstat.stats$snapshot ss , perfstat.stats$snapshot ps where a.lag_snap_id = ps.snap_id and a.snap_id = ss.snap_id and a.lag_total_waits != a.total_waits and a.event = a.lag_event order by a.snap_id, event ) group by snap_time ; < wt_events_int.sql select event , waits "Waits" , time "Wait Time (s)" , pct*100 "Percent of Tot" , waitclass "Wait Class" from (select e.event_name event , e.total_waits - nvl(b.total_waits,0) waits , (e.time_waited_micro - nvl(b.time_waited_micro,0))/1000000 time , (e.time_waited_micro - nvl(b.time_waited_micro,0))/ (select sum(e1.time_waited_micro - nvl(b1.time_waited_micro,0)) from dba_hist_system_event b1 , dba_hist_system_event e1 where b1.snap_id(+) = b.snap_id and e1.snap_id = e.snap_id and b1.dbid(+) = b.dbid and e1.dbid = e.dbid and b1.instance_number(+) = b.instance_number and e1.instance_number = e.instance_number and b1.event_id(+) = e1.event_id and e1.total_waits > nvl(b1.total_waits,0) and e1.wait_class <> 'Idle' ) pct , e.wait_class waitclass from dba_hist_system_event b , dba_hist_system_event e where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.event_id(+) = e.event_id and e.total_waits > nvl(b.total_waits,0) and e.wait_class <> 'Idle' order by time desc, waits desc ); < awr_system_events.sql select event "Event Name", waits "Waits", timeouts "Timeouts", time "Wait Time (s)", avgwait "Avg Wait (ms)", waitclass "Wait Class" from (select e.event_name event , e.total_waits - nvl(b.total_waits,0) waits , e.total_timeouts - nvl(b.total_timeouts,0) timeouts , (e.time_waited_micro - nvl(b.time_waited_micro,0))/1000000 time , decode ((e.total_waits - nvl(b.total_waits, 0)), 0, to_number(NULL), ((e.time_waited_micro - nvl(b.time_waited_micro,0))/1000) / (e.total_waits - nvl(b.total_waits,0)) ) avgwait , e.wait_class waitclass from dba_hist_system_event b , dba_hist_system_event e where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.event_id(+) = e.event_id and e.total_waits > nvl(b.total_waits,0) and e.wait_class <> 'Idle' ) order by time desc, waits desc; < show_background_waits.sql select event "Event Name", waits "Waits", timeouts "Timeouts", time "Wait Time (s)", avgwait "Avg Wait (ms)", waitclass "Wait Class" from (select e.event_name event , e.total_waits - nvl(b.total_waits,0) waits , e.total_timeouts - nvl(b.total_timeouts,0) timeouts , (e.time_waited_micro - nvl(b.time_waited_micro,0))/1000000 time , decode ((e.total_waits - nvl(b.total_waits, 0)), 0, to_number(NULL), ((e.time_waited_micro - nvl(b.time_waited_micro,0))/1000) / (e.total_waits - nvl(b.total_waits,0)) ) avgwait , e.wait_class waitclass from dba_hist_bg_event_summary b , dba_hist_bg_event_summary e where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.event_id(+) = e.event_id and e.total_waits > nvl(b.total_waits,0) and e.wait_class <> 'Idle' ) order by time desc, waits desc; < wait_stat_int.sql select e.class "E.CLASS" , e.wait_count - nvl(b.wait_count,0) "Waits" , e.time - nvl(b.time,0) "Total Wait Time (cs)" , (e.time - nvl(b.time,0)) / (e.wait_count - nvl(b.wait_count,0)) "Avg Time (cs)" from dba_hist_waitstat b , dba_hist_waitstat e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.dbid = e.dbid and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.instance_number = e.instance_number and b.class = e.class and b.wait_count < e.wait_count order by 3 desc, 2 desc; < enq_stat_int.sql select ety “Enqueue”, reqs "Requests", sreq "Successful Gets", freq "Failed Gets", waits "Waits", wttm "Wait Time (s)", awttm "Avg Wait Time(ms)" from ( select /*+ ordered */ e.eq_type || '-' || to_char(nvl(l.name,' ')) || decode( upper(e.req_reason) , 'CONTENTION', null , '-', null , ' ('||e.req_reason||')') ety , e.total_req# - nvl(b.total_req#,0) reqs , e.succ_req# - nvl(b.succ_req#,0) sreq , e.failed_req# - nvl(b.failed_req#,0) freq , e.total_wait# - nvl(b.total_wait#,0) waits , (e.cum_wait_time - nvl(b.cum_wait_time,0))/1000 wttm , decode( (e.total_wait# - nvl(b.total_wait#,0)) , 0, to_number(NULL) , ( (e.cum_wait_time - nvl(b.cum_wait_time,0)) / (e.total_wait# - nvl(b.total_wait#,0)) ) ) awttm from dba_hist_enqueue_stat e , dba_hist_enqueue_stat b , v$lock_type l where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.dbid(+) = e.dbid and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.instance_number(+) = e.instance_number and b.eq_type(+) = e.eq_type and b.req_reason(+) = e.req_reason and e.total_wait# - nvl(b.total_wait#,0) > 0 and l.type(+) = e.eq_type order by wttm desc, waits desc); < metric_summary.sql select metric_name “Metric Name”, metric_unit "Metric Unit", minval "Minimum Value", maxval "Maximum Value", average "Average Value" from dba_hist_sysmetric_summary where snap_id = &pEndSnap and dbid = &pDbId and instance_number = &pInstNum; < sys_time_model_int.sql column "Statistic Name" format A40 column "Time (s)" format 999,999 column "Percent of Total DB Time" format 999,999 select e.stat_name "Statistic Name" , (e.value - b.value)/1000000 "Time (s)" , decode( e.stat_name,'DB time' , to_number(null) , 100*(e.value - b.value) )/ ( select nvl((e1.value - b1.value),-1) from dba_hist_sys_time_model e1 , dba_hist_sys_time_model b1 where b1.snap_id = b.snap_id and e1.snap_id = e.snap_id and b1.dbid = b.dbid and e1.dbid = e.dbid and b1.instance_number = b.instance_number and e1.instance_number = e.instance_number and b1.stat_name = 'DB time' and b1.stat_id = e1.stat_id ) "Percent of Total DB Time" from dba_hist_sys_time_model e , dba_hist_sys_time_model b where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.instance_number = &pInst_Num and e.instance_number = &pInst_Num and b.stat_id = e.stat_id and e.value - b.value > 0 order by 2 desc; < sys_stat_int.sql select e.stat_name "Statistic Name" , e.value - b.value "Total" , round((e.value - b.value)/ ( select avg( extract( day from (e1.end_interval_time-b1.end_interval_time) )*24*60*60+ extract( hour from (e1.end_interval_time-b1.end_interval_time) )*60*60+ extract( minute from (e1.end_interval_time-b1.end_interval_time) )*60+ extract( second from (e1.end_interval_time-b1.end_interval_time)) ) from dba_hist_snapshot b1 ,dba_hist_snapshot e1 where b1.snap_id = b.snap_id and e1.snap_id = e.snap_id and b1.dbid = b.dbid and e1.dbid = e.dbid and b1.instance_number = b.instance_number and e1.instance_number = e.instance_number and b1.startup_time = e1.startup_time and b1.end_interval_time < e1.end_interval_time ),2) "Per Second" from dba_hist_sysstat b , dba_hist_sysstat e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.stat_id = e.stat_id and e.stat_name not in ( 'logons current' , 'opened cursors current' , 'workarea memory allocated' ) and e.value >= b.value and e.value > 0 order by 1 asc; < latch_int.sql select e.latch_name "Latch Name" , e.gets - b.gets "Get Requests" , to_number(decode(e.gets, b.gets, null, (e.misses - b.misses) * 100/(e.gets - b.gets))) "Percent Get Misses" , to_number(decode(e.misses, b.misses, null, (e.sleeps - b.sleeps)/(e.misses - b.misses))) "Avg Sleeps / Miss" , (e.wait_time - b.wait_time)/1000000 "Wait Time (s)" , e.immediate_gets - b.immediate_gets "No Wait Requests" , to_number(decode(e.immediate_gets, b.immediate_gets, null, (e.immediate_misses - b.immediate_misses) * 100 / (e.immediate_gets - b.immediate_gets))) "Percent No Wait Miss" from dba_hist_latch b , dba_hist_latch e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.dbid = e.dbid and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.instance_number = e.instance_number and b.latch_hash = e.latch_hash and e.gets - b.gets > 0 order by 1, 4; < latch_miss_int.sql select latchname "Latch Name", nwmisses "No Wait Misses", sleeps "Sleeps", waiter_sleeps "Waiter Sleeps" From ( select e.parent_name||' '||e.where_in_code latchname , e.nwfail_count - nvl(b.nwfail_count,0) nwmisses , e.sleep_count - nvl(b.sleep_count,0) sleeps , e.wtr_slp_count - nvl(b.wtr_slp_count,0) waiter_sleeps from dba_hist_latch_misses_summary b , dba_hist_latch_misses_summary e where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.dbid(+) = e.dbid and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.instance_number(+) = e.instance_number and b.parent_name(+) = e.parent_name and b.where_in_code(+) = e.where_in_code and e.sleep_count > nvl(b.sleep_count,0) ) order by 1, 3 desc; < lib_cache_int.sql select b.namespace "Name Space" , e.gets - b.gets "Get Requests" , to_number(decode(e.gets,b.gets,null, 100 - (e.gethits - b.gethits) * 100/(e.gets - b.gets))) "Get Pct Miss" , e.pins - b.pins "Pin Requests" , to_number(decode(e.pins,b.pins,null, 100 - (e.pinhits - b.pinhits) * 100/(e.pins - b.pins))) "Pin Pct Miss" , e.reloads - b.reloads "Reloads" , e.invalidations - b.invalidations "Invalidations" from dba_hist_librarycache b , dba_hist_librarycache e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.dbid = e.dbid and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.instance_number = e.instance_number and b.namespace = e.namespace; < rowcache_int.sql select param "Parameter", gets "Get Requests", getm "Pct Miss" From (select lower(b.parameter) param , e.gets - b.gets gets , to_number(decode(e.gets,b.gets,null, (e.getmisses - b.getmisses) * 100/(e.gets - b.gets))) getm , e.scans - b.scans scans , to_number(decode(e.scans,b.scans,null, (e.scanmisses - b.scanmisses) * 100/(e.scans - b.scans))) scanm , e.modifications - b.modifications mods , e.usage usage from dba_hist_rowcache_summary b , dba_hist_rowcache_summary e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.dbid = e.dbid and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.instance_number = e.instance_number and b.parameter = e.parameter and e.gets - b.gets > 0 ) order by param; < buf_pool_int.sql select name , numbufs "Number of Buffers" , buffs "Buffer Gets" , conget "Consistent Gets" , phread "Physical Reads" , phwrite "Physical Writes" , fbwait "Free Buffer Waits" , bbwait "Buffer Busy Waits" , wcwait "Write Complete Waits" , poolhr "Pool Hit %" From (select e.name , e.set_msize numbufs , decode( e.db_block_gets - nvl(b.db_block_gets,0) + e.consistent_gets - nvl(b.consistent_gets,0) , 0, to_number(null) , (100* (1 - ( (e.physical_reads - nvl(b.physical_reads,0)) / ( e.db_block_gets - nvl(b.db_block_gets,0) + e.consistent_gets - nvl(b.consistent_gets,0)) ) ) ) ) poolhr , e.db_block_gets - nvl(b.db_block_gets,0) + e.consistent_gets - nvl(b.consistent_gets,0) buffs , e.consistent_gets - nvl(b.consistent_gets,0) conget , e.physical_reads - nvl(b.physical_reads,0) phread , e.physical_writes - nvl(b.physical_writes,0) phwrite , e.free_buffer_wait - nvl(b.free_buffer_wait,0) fbwait , e.write_complete_wait - nvl(b.write_complete_wait,0) wcwait , e.buffer_busy_wait - nvl(b.buffer_busy_wait,0) bbwait from dba_hist_buffer_pool_stat b , dba_hist_buffer_pool_stat e where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.dbid(+) = e.dbid and b.instance_number(+) = &pInst_Num and e.instance_number = &pInst_Num and b.instance_number(+) = e.instance_number and b.id(+) = e.id) order by 1; < os_stat_int.sql select e.stat_name "Statistic Name" , decode(e.stat_name, 'NUM_CPUS', e.value, e.value - b.value) "Total" , decode( instrb(e.stat_name, 'BYTES'), 0, to_number(null) , round((e.value - b.value)/( select avg( extract( day from (e1.end_interval_time-b1.end_interval_time) )*24*60*60+ extract( hour from (e1.end_interval_time-b1.end_interval_time) )*60*60+ extract( minute from (e1.end_interval_time-b1.end_interval_time) )*60+ extract( second from (e1.end_interval_time-b1.end_interval_time)) ) from dba_hist_snapshot b1 ,dba_hist_snapshot e1 where b1.snap_id = b.snap_id and e1.snap_id = e.snap_id and b1.dbid = b.dbid and e1.dbid = e.dbid and b1.instance_number = b.instance_number and e1.instance_number = e.instance_number and b1.startup_time = e1.startup_time and b1.end_interval_time < e1.end_interval_time ),2)) "Per Second" from dba_hist_osstat b , dba_hist_osstat e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId and e.dbid = &pDbId and b.instance_number = &pInstNum and e.instance_number = &pInstNum and b.stat_id = e.stat_id and e.value >= b.value and e.value > 0 order by 1 asc; < high_sql_buf_gets.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select sql_id , buffer_gets_total "Buffer Gets" , executions_total "Executions" , buffer_gets_total/executions_total "Gets / Exec" , pct*100 "% Total" , cpu_time_total/1000000 "CPU Time (s)" , elapsed_time_total/1000000 "Elapsed Time (s)" , module "SQL Module" , stmt "SQL Statement" from (select e.sql_id sql_id , e.buffer_gets_total - nvl(b.buffer_gets_total,0) buffer_gets_total , e.executions_total - nvl(b.executions_total,0) executions_total , (e.buffer_gets_total - nvl(b.buffer_gets_total,0))/ ( select e1.value - nvl(b1.value,0) from dba_hist_sysstat b1 , dba_hist_sysstat e1 where b1.snap_id(+) = b.snap_id and e1.snap_id = e.snap_id and b1.dbid(+) = b.dbid and e1.dbid = e.dbid and b1.instance_number(+) = b.instance_number and e1.instance_number = e.instance_number and b1.stat_id = e1.stat_id and e1.stat_name = 'session logical reads' ) pct , e.elapsed_time_total - nvl(b.elapsed_time_total,0) elapsed_time_total , e.cpu_time_total - nvl(b.cpu_time_total,0) cpu_time_total , e.module , t.sql_text stmt from dba_hist_sqlstat e , dba_hist_sqlstat b , dba_hist_sqltext t where b.snap_id(+) = @pBgnSnap and b.dbid(+) = e.dbid and b.instance_number(+) = e.instance_number and b.sql_id(+) = e.sql_id and e.snap_id = &pEndSnap and e.dbid = &pDBId and e.instance_number = &pInstNum and (e.executions_total - nvl(b.executions_total,0)) > 0 and t.sql_id = b.sql_id ) order by 2 desc; < seg_top_logreads.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select object_name "Object Name" , tablespace_name "Tablespace Name" , object_type "Object Type" , logical_reads_total "Logical Reads" , ratio "%Total" from( select n.owner||'.'||n.object_name||decode(n.subobject_name,null,null,'.'||n.subobject_name) object_name , n.tablespace_name , case when length(n.subobject_name) < 11 then n.subobject_name else substr(n.subobject_name,length(n.subobject_name)-9) end subobject_name , n.object_type , r.logical_reads_total , round(r.ratio * 100, 2) ratio from dba_hist_seg_stat_obj n , (select * from (select e.dataobj# , e.obj# , e.dbid , e.logical_reads_total - nvl(b.logical_reads_total, 0) logical_reads_total , ratio_to_report(e.logical_reads_total - nvl(b.logical_reads_total, 0)) over () ratio from dba_hist_seg_stat e , dba_hist_seg_stat b where b.snap_id = 2694 and e.snap_id = 2707 and b.dbid = 37933856 and e.dbid = 37933856 and b.instance_number = 1 and e.instance_number = 1 and e.obj# = b.obj# and e.dataobj# = b.dataobj# and e.logical_reads_total - nvl(b.logical_reads_total, 0) > 0 order by logical_reads_total desc) d where rownum <= 100) r where n.dataobj# = r.dataobj# and n.obj# = r.obj# and n.dbid = r.dbid ) order by logical_reads_total desc; < db_tbsp_io.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select tbsp “Tablespace” , ios "I/O Activity" From ( select e.tsname tbsp , sum (e.phyrds - nvl(b.phyrds,0)) + sum (e.phywrts - nvl(b.phywrts,0)) ios from dba_hist_filestatxs e , dba_hist_filestatxs b where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.dbid(+) = e.dbid and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.instance_number(+) = e.instance_number and b.file# = e.file# and ( (e.phyrds - nvl(b.phyrds,0) ) + (e.phywrts - nvl(b.phywrts,0)) ) > 0 group by e.tsname union select e.tsname tbsp , sum (e.phyrds - nvl(b.phyrds,0)) + sum (e.phywrts - nvl(b.phywrts,0)) ios from dba_hist_tempstatxs e , dba_hist_tempstatxs b where b.snap_id(+) = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid(+) = &pDbId and e.dbid = &pDbId and b.dbid(+) = e.dbid and b.instance_number(+) = &pInstNum and e.instance_number = &pInstNum and b.instance_number(+) = e.instance_number and b.file# = e.file# and ( (e.phyrds - nvl(b.phyrds,0) ) + (e.phywrts - nvl(b.phywrts,0) ) ) > 0 group by e.tsname ); Chapter 7 < display_sql_captured.sql display_sql_captured.sql select aa, hv from ( select /*+ ordered use_nl (b st) */ decode( st.piece , 0 , lpad(to_char((e.buffer_gets - nvl(b.buffer_gets,0)) ,'99,999,999,999') ,15)||' '|| lpad(to_char((e.executions - nvl(b.executions,0)) ,'999,999,999') ,12)||' '|| lpad((to_char(decode(e.executions - nvl(b.executions,0) ,0, to_number(null) ,(e.buffer_gets - nvl(b.buffer_gets,0)) / (e.executions - nvl(b.executions,0))) ,'999,999,990.0')) ,14) ||' '|| lpad((to_char(100*(e.buffer_gets - nvl(b.buffer_gets,0))/:gets ,'990.0')) , 6) ||' '|| lpad( nvl(to_char( (e.cpu_time - nvl(b.cpu_time,0))/1000000 , '9990.00') , ' '),8) || ' ' || lpad( nvl(to_char( (e.elapsed_time - nvl(b.elapsed_time,0))/1000000 , '99990.00') , ' '),9) || ' ' || lpad(e.old_hash_value,10)||''|| decode(e.module,null,st.sql_text ,rpad('Module: '||e.module,80)||st.sql_text) , st.sql_text) aa , e.old_hash_value hv from stats$sql_summary e , stats$sql_summary b , stats$sqltext st where b.snap_id(+) = :bid and b.dbid(+) = e.dbid and b.instance_number(+) = e.instance_number and b.old_hash_value(+) = e.old_hash_value and b.address(+) = e.address and b.text_subset(+) = e.text_subset and e.snap_id = :eid and e.dbid = :dbid and e.instance_number = :inst_num and e.old_hash_value = st.old_hash_value and e.text_subset = st.text_subset and st.piece <= &&num_rows_per_hash and e.executions > nvl(b.executions,0) and 100*(e.buffer_gets - nvl(b.buffer_gets,0))/:gets > &&top_pct_sql order by (e.buffer_gets - nvl(b.buffer_gets,0)) desc, e.old_hash_value, st.piece ) where rownum < &&top_n_sql; Chapter 8 < Redo_allocation_latches.sql select round( greatest( (sum(decode(ln.name,'redo allocation',misses,0)) /greatest(sum(decode(ln.name,'redo allocation',gets,0)),1)), (sum(decode(ln.name,'redo allocation',immediate_misses,0)) /greatest(sum(decode(ln.name,'redo allocation',immediate_gets,0)) +sum(decode(ln.name,'redo allocation',immediate_misses,0)),1)) )*100,2) from v$latch l, v$latchname ln where l.latch#=ln.latch#; Chapter 9 --************************************************************* -- SKEWONLY option—Detailed analysis -- -- Use this method for a first-time analysis for skewed indexes -- This runs a long time because all indexes are examined --************************************************************* begin dbms_stats.gather_schema_stats( ownname => 'SCOTT', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size skewonly', degree => 7 ); end; --************************************************************** -- REPEAT OPTION - Only reanalyze histograms for indexes -- that have histograms -- -- Following the initial analysis, the weekly analysis -- job will use the “repeat” option. The repeat option -- tells dbms_stats that no indexes have changed, and -- it will only reanalyze histograms for -- indexes that have histograms. --************************************************************** begin dbms_stats.gather_schema_stats( ownname => 'SCOTT', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size repeat', degree => 7 ); end; -- ******************************** -- Create column histograms -- ******************************** exec dbms_stats.gather_table_stats (null, ‘sales’ method_opt=> ‘for all columns size skewonly); -- ******************************** -- Verify existence of histograms -- ******************************** select column_name, histogram from user_tab_sol_statistics where table_name = ‘SALES’; -- **************************************** - Create the extended optimizer statistics -- **************************************** select dbms_stats.create_extended_stats (NULL, 'sales', '(product_price+sales_tax)') from dual; -- ********************************************************* -- Display extended statistics extensions -- ********************************************************* column extension format a30 select extension_name, extension from dba_stat_extensions where table_name = 'EMP'; EXTENSION_NAME EXTENSION ------------------------------ ------------------------------ SYS_STU3VG629OEYG6FN0EKTGV_HQ6 ("JOB","DEPTNO") SYS_STULPA1A#B6YL4KQ59DQO3OADQ ("JOB","MGR") SYS_STU2JLSDWQAFJHQST7$QK81_YB (LOWER("ENAME")) SYS_STUOK75YSL165W#_X8GUYL0A1X (UPPER("ENAME")) -- ********************************************************* -- Display extended statistics distinct values and histograms -- ********************************************************* column col_group format a30 select e.extension col_group, t.num_distinct, t.histogram from dba_stat_extensions e join dba_tab_col_statistics t on e.extension_name=t.column_name and t.table_name = 'EMP'; COL_GROUP NUM_DISTINCT HISTOGRAM ------------------------------ ------------ --------------- ("JOB","DEPTNO") 9 NONE ("JOB","MGR") 8 NONE (LOWER("ENAME")) 14 NONE (UPPER("ENAME")) 14 NONE -- ********************************************************* -- Display extended statistics distinct values and histograms -- ********************************************************* column col_group format a30 select e.extension col_group, t.num_distinct, t.histogram from dba_stat_extensions e join dba_tab_col_statistics t on e.extension_name=t.column_name and t.table_name = 'EMP'; COL_GROUP NUM_DISTINCT HISTOGRAM ------------------------------ ------------ --------------- ("JOB","DEPTNO") 9 NONE ("JOB","MGR") 8 NONE (LOWER("ENAME")) 14 NONE (UPPER("ENAME")) 14 NONE select sum(a.time_waited_micro)/sum(a.total_waits)/1000000 c1, sum(b.time_waited_micro)/sum(b.total_waits)/1000000 c2, ( sum(a.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c3, ( sum(b.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c4, ( sum(b.time_waited_micro) / sum(b.total_waits)) / (sum(a.time_waited_micro)/sum(a.total_waits) ) * 100 c5 from dba_hist_system_event a, dba_hist_system_event b where a.snap_id = b.snap_id and a.event_name = 'db file scattered read' and b.event_name = 'db file sequential read'; Chapter 10 < top_20_sessions.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select * from (select b.sid sid, decode (b.username,null,e.name,b.username) user_name, d.spid os_id, b.machine machine_name, to_char(logon_time,'dd-mon-yy hh:mi:ss pm') logon_time, (sum(decode(c.name,'physical reads',value,0)) + sum(decode(c.name,'physical writes',value,0)) + sum(decode(c.name,'physical writes direct',value,0)) + sum(decode(c.name,'physical writes direct (lob)',value,0))+ sum(decode(c.name,'physical reads direct (lob)',value,0)) + sum(decode(c.name,'physical reads direct',value,0))) total_physical_io, (sum(decode(c.name,'db block gets',value,0)) + sum(decode(c.name,'db block changes',value,0)) + sum(decode(c.name,'consistent changes',value,0)) + sum(decode(c.name,'consistent gets',value,0)) ) total_logical_io, (sum(decode(c.name,'session pga memory',value,0))+ sum(decode(c.name,'session uga memory',value,0)) ) total_memory_usage, sum(decode(c.name,'parse count (total)',value,0)) parses, sum(decode(c.name,'cpu used by this session',value,0)) total_cpu, sum(decode(c.name,'parse time cpu',value,0)) parse_cpu, sum(decode(c.name,'recursive cpu usage',value,0)) recursive_cpu, sum(decode(c.name,'cpu used by this session',value,0)) - sum(decode(c.name,'parse time cpu',value,0)) - sum(decode(c.name,'recursive cpu usage',value,0)) other_cpu, sum(decode(c.name,'sorts (disk)',value,0)) disk_sorts, sum(decode(c.name,'sorts (memory)',value,0)) memory_sorts, sum(decode(c.name,'sorts (rows)',value,0)) rows_sorted, sum(decode(c.name,'user commits',value,0)) commits, sum(decode(c.name,'user rollbacks',value,0)) rollbacks, sum(decode(c.name,'execute count',value,0)) executions from sys.v_$sesstat a, sys.v_$session b, sys.v_$statname c, sys.v_$process d, sys.v_$bgprocess e where a.statistic#=c.statistic# and b.sid=a.sid and d.addr = b.paddr and e.paddr (+) = b.paddr and c.NAME in ('physical reads', 'physical writes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)', 'db block gets', 'db block changes', 'consistent changes', 'consistent gets', 'session pga memory', 'session uga memory', 'parse count (total)', 'CPU used by this session', 'parse time cpu', 'recursive cpu usage', 'sorts (disk)', 'sorts (memory)', 'sorts (rows)', 'user commits', 'user rollbacks', 'execute count' ) group by b.sid, d.spid, decode (b.username,null,e.name,b.username), b.machine, to_char(logon_time,'dd-mon-yy hh:mi:ss pm') order by 6 desc) where rownum < 21 < high_scan_sql.sql select c.username username, count(a.hash_value) scan_count from sys.v_$sql_plan a, sys.dba_segments b, sys.dba_users c, sys.v_$sql d where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type IN ('TABLE', 'TABLE PARTITION') and a.operation like '%TABLE%' and a.options = 'FULL' and c.user_id = d.parsing_user_id and d.hash_value = a.hash_value and b.bytes / 1024 > 1024 group by c.username order by 2 desc ; < find_cartesian_joins.sql select username, count(distinct c.hash_value) nbr_stmts from sys.v_$sql a, sys.dba_users b, sys.v_$sql_plan c where a.parsing_user_id = b.user_id and options = 'CARTESIAN' and operation like '%JOIN%' and a.hash_value = c.hash_value group by username order by 2 desc ; < high_resource_sql.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select sql_text, username, disk_reads_per_exec, buffer_gets, disk_reads, parse_calls, sorts, executions, rows_processed, hit_ratio, first_load_time, sharable_mem, persistent_mem, runtime_mem, cpu_time, elapsed_time, address, hash_value from (select sql_text , b.username , round((a.disk_reads/decode(a.executions,0,1, a.executions)),2) disk_reads_per_exec, a.disk_reads , a.buffer_gets , a.parse_calls , a.sorts , a.executions , a.rows_processed , 100 - round(100 * a.disk_reads/greatest(a.buffer_gets,1),2) hit_ratio, a.first_load_time , sharable_mem , persistent_mem , runtime_mem, cpu_time, elapsed_time, address, hash_value from sys.v_$sqlarea a, sys.all_users b where a.parsing_user_id=b.user_id and b.username not in ('sys','system') order by 3 desc) where rownum < 21 < cartesian_sum.sql select count(distinct hash_value) carteisan_statements, count(*) total_cartesian_joins from sys.v_$sql_plan where options = 'CARTESIAN' and operation like '%JOIN%' < sql_cartesian.sql select * from sys.v_$sql where hash_value in (select hash_value from sys.v_$sql_plan where options = 'CARTESIAN' and operation LIKE '%JOIN%' ) order by hash_value; < large_scan_count.sql select sql_text, total_large_scans, executions, executions * total_large_scans sum_large_scans from (select sql_text, count(*) total_large_scans, executions from sys.v_$sql_plan a, sys.dba_segments b, sys.v_$sql c where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type IN ('TABLE', 'TABLE PARTITION') and a.operation LIKE '%TABLE%' and a.options = 'FULL' and c.hash_value = a.hash_value and b.bytes / 1024 > 1024 group by sql_text, executions) order by 4 desc; < awr_sqlstat_deltas.sql col c1 heading ‘Begin|Interval|time’ format a8 col c2 heading ‘SQL|ID’ format a13 col c3 heading ‘Exec|Delta’ format 9,999 col c4 heading ‘Buffer|Gets|Delta’ format 9,999 col c5 heading ‘Disk|Reads|Delta’ format 9,999 col c6 heading ‘IO Wait|Delta’ format 9,999 col c7 heading ‘Application|Wait|Delta’ format 9,999 col c8 heading ‘Concurrency|Wait|Delta’ format 9,999 break on c1 select to_char(s.begin_interval_time,’mm-dd hh24’) c1, sql.sql_id c2, sql.executions_delta c3, sql.buffer_gets_delta c4, sql.disk_reads_delta c5, sql.iowait_delta c6, sql.apwait_delta c7, sql.ccwait_delta c8 from dba_hist_sqlstat sql, dba_hist_snapshot s where s.snap_id = sql.snap_id order by c1, c2; < awr_sqlstat_deltas_detail.sql col c1 heading ‘Begin|Interval|time’ format a8 col c2 heading ‘Exec|Delta’ format 999,999 col c3 heading ‘Buffer|Gets|Delta’ format 999,999 col c4 heading ‘Disk|Reads|Delta’ format 9,999 col c5 heading ‘IO Wait|Delta’ format 9,999 col c6 heading ‘App|Wait|Delta’ format 9,999 col c7 heading ‘Cncr|Wait|Delta’ format 9,999 col c8 heading ‘CPU|Time|Delta’ format 999,999 col c9 heading ‘Elpsd|Time|Delta’ format 999,999 accept sqlid prompt ‘Enter SQL ID: ‘ ttitle ‘time series execution for|&sqlid’ break on c1 select to_char(s.begin_interval_time,’mm-dd hh24’) c1, sql.executions_delta c2, sql.buffer_gets_delta c3, sql.disk_reads_delta c4, sql.iowait_delta c5, sql.apwait_delta c6, sql.ccwait_delta c7, sql.cpu_time_delta c8, sql.elapsed_time_delta c9 from dba_hist_sqlstat sql, dba_hist_snapshot s where s.snap_id = sql.snap_id and sql_id = ‘&sqlid’ order by c1; < sqlstathist.sql set echo off feed off lines 100 pages 9999 clear col clear break col beginttm head 'Begin|Interval' format a14 col sqlid head 'SQL|ID' format a13 col execsdlt head 'Delta|Execs' format 99990 col bufgetwaitdlt head 'Delta|Buffer|Gets' format 9999990 col dskrdwaitdlt head 'Delta|Disk|Reads' format 999990 col iowaitdlt head 'Delta|IO Wait' format 9999990 col appwaitdlt head 'Delta|Wait|App' format 9999990 col concurwaitdlt head 'Delta|Wait|Concur' format 99990 break on beginttm skip 1 spool sqlstathist.lis set echo off feed off lines 100 pages 9999 clear col clear break col beginttm head 'Begin|Interval' format a14 col sqlid head 'SQL|ID' format a13 col execsdlt head 'Delta|Execs' format 99990 col bufgetwaitdlt head 'Delta|Buffer|Gets' format 9999990 col dskrdwaitdlt head 'Delta|Disk|Reads' format 999990 col iowaitdlt head 'Delta|IO Wait' format 9999990 col appwaitdlt head 'Delta|Wait|App' format 9999990 col concurwaitdlt head 'Delta|Wait|Concur' format 99990 break on beginttm skip 1 spool sqlstathist.lis select to_char(begin_interval_time,'mm-dd hh24:mi:ss') beginttm, sql_id sqlid, executions_delta execsdlt, buffer_gets_delta bufgetwaitdlt, disk_reads_delta dskrdwaitdlt, iowait_delta iowaitdlt, apwait_delta appwaitdlt, ccwait_delta concurwaitdlt from dba_hist_snapshot sn, dba_hist_sqlstat ss where ss.snap_id = sn.snap_id and begin_interval_time > (sysdate - 4/24) order by beginttm, ( executions_delta + buffer_gets_delta + disk_reads_delta + iowait_delta + apwait_delta + ccwait_delta ) desc / spool off clear break clear col < awr_high_cost_sql.sql col c1 heading ‘SQL|ID’ format a13 col c2 heading ‘Cost’ format 9,999,999 col c3 heading ‘SQL Text’ format a200 select p.sql_id c1, p.cost c2, to_char(s.sql_text) c3 from dba_hist_sql_plan p, dba_hist_sqltext s where p.id = 0 and p.sql_id = s.sql_id and p.cost is not null order by p.cost desc ; < awr_sql_object_char.sql col c1 heading ‘Owner’ format a13 col c2 heading ‘Object|Type’ format a15 col c3 heading ‘Object|Name’ format a25 col c4 heading ‘Average|CPU|Cost’ format 9,999,999 col c5 heading ‘Average|IO|Cost’ format 9,999,999 break on c1 skip 2 break on c2 skip 2 select p.object_owner c1, p.object_type c2, p.object_name c3, avg(p.cpu_cost ) c4, avg(p.io_cost ) c5 from dba_hist_sql_plan p where p.object_name is not null and p.object_owner <> 'SYS' group by p.object_owner, p.object_type, p.object_name order by 1,2,4 desc; < awr_sql_object_char_detail.sql accept tabname prompt ‘Enter Table Name:’ col c0 heading ‘Begin|Interval|time’ format a8 col c1 heading ‘Owner’ format a10 col c2 heading ‘Object|Type’ format a10 col c3 heading ‘Object|Name’ format a15 col c4 heading ‘Average|CPU|Cost’ format 9,999,999 col c5 heading ‘Average|IO|Cost’ format 9,999,999 break on c1 skip 2 break on c2 skip 2 select to_char(sn.begin_interval_time,'mm-dd hh24') c0, p.object_owner c1, p.object_type c2, p.object_name c3, avg(p.cpu_cost ) c4, avg(p.io_cost ) c5 from dba_hist_sql_plan p, dba_hist_sqlstat st, dba_hist_snapshot sn where p.object_name is not null and p.object_owner <> 'SYS' and p.object_name = 'CUSTOMER_DETS' and p.sql_id = st.sql_id and st.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'mm-dd hh24'), p.object_owner, p.object_type, p.object_name order by 1,2,3 desc; < awr_nested_join_alert.sql col c1 heading ‘Date’ format a20 col c2 heading ‘Nested|Loops|Count’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 col c4 heading ‘Disk|Reads’ format 99,999,999 col c5 heading ‘CPU|Time’ format 99,999,999 accept nested_thr char prompt ‘Enter Nested Join Threshold: ‘ ttitle ‘Nested Join Threshold|&nested_thr’ select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(*) c2, sum(st.rows_processed_delta) c3, sum(st.disk_reads_delta) c4, sum(st.cpu_time_delta) c5 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.operation = ‘NESTED LOOPS’ having count(*) > &hash_thr group by begin_interval_time; < awr_sql_index.sql col c0 heading ‘Begin|Interval|time’ format a8 col c1 heading ‘Index|Name’ format a20 col c2 heading ‘Disk|Reads’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 select to_char(s.begin_interval_time,'mm-dd hh24') c0, p.object_name c1, sum(t.disk_reads_total) c2, sum(t.rows_processed_total) c3 from dba_hist_sql_plan p, dba_hist_sqlstat t, dba_hist_snapshot s where p.sql_id = t.sql_id and t.snap_id = s.snap_id and p.object_type like '%INDEX%' group by to_char(s.begin_interval_time,'mm-dd hh24'), p.object_name order by c0,c1,c2 desc; < awr_sql_index_access.sql col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Index|Range|Scans’ format 999,999 col c3 heading ‘Index|Unique|Scans’ format 999,999 col c4 heading ‘Index|Full|Scans’ format 999,999 select r.c1 c1, r.c2 c2, u.c2 c3, f.c2 c4 from ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%RANGE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) r, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%UNIQUE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) u, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) f where r.c1 = u.c1 and r.c1 = f.c1; < awr_sql_object_avg_dy.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Week Day’ format a15 col c3 heading ‘Invocation|Count’ format 99,999,999 break on c1 skip 2 break on c2 skip 2 select decode(c2,1,'Monday',2,'Tuesday',3,'Wednesday',4,'Thursday',5,'Friday',6,'Saturday',7,'Sunday') c2, c1, c3 from ( select p.object_name c1, to_char(sn.end_interval_time,'d') c2, count(1) c3 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by p.object_name, to_char(sn.end_interval_time,'d') order by c2,c1 ) ; < awr_sql_details.sql accept sqlid prompt ‘Please enter SQL ID: ‘ col c1 heading ‘Operation’ format a20 col c2 heading ‘Options’ format a20 col c3 heading ‘Object|Name’ format a25 col c4 heading ‘Search Columns’ format 999,999 col c5 heading ‘Cardinality’ format 999,999 select operation c1, options c2, object_name c3, search_columns c4, cardinality c5 from dba_hist_sql_plan p where p.sql_id = '&sqlid' order by p.id; < awr_full_table_scans.sql ttitle ‘Large Full-table scans|Per Snapshot Period’ col c1 heading ‘Begin|Interval|time’ format a20 col c4 heading ‘FTS|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c4 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_segments o where p.object_owner <> 'SYS' and p.object_owner = o.owner and p.object_name = o.segment_name and o.blocks > 1000 and p.operation like '%TABLE ACCESS%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1; < awr_sql_access_hr.sql ttitle ‘Large Table Full-table scans|Averages per Hour’ col c1 heading ‘Day|Hour’ format a20 col c2 heading ‘FTS|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select to_char(sn.begin_interval_time,'hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_segments o where p.object_owner <> 'SYS' and p.object_owner = o.owner and p.object_name = o.segment_name and o.blocks > 1000 and p.operation like '%TABLE ACCESS%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'hh24') order by 1; < awr_sql_access_day.sql ttitle ‘Large Table Full-table scans|Averages per Week Day’ col c1 heading ‘Week|Day’ format a20 col c2 heading ‘FTS|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select to_char(sn.begin_interval_time,'day') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_segments o where p.object_owner <> 'SYS' and p.object_owner = o.owner and p.object_name = o.segment_name and o.blocks > 1000 and p.operation like '%TABLE ACCESS%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'day') order by 1; < awr_sql_scan_sums.sql col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Large|Table|Full Table|Scans’ format 999,999 col c3 heading ‘Small|Table|Full Table|Scans’ format 999,999 col c4 heading ‘Total|Index|Scans’ format 999,999 select f.c1 c1, f.c2 c2, s.c2 c3, i.c2 c4 from ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_segments o where p.object_owner <> 'SYS' and p.object_owner = o.owner and p.object_name = o.segment_name and o.blocks > 1000 and p.operation like '%TABLE ACCESS%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) f, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn, dba_segments o where p.object_owner <> 'SYS' and p.object_owner = o.owner and p.object_name = o.segment_name and o.blocks < 1000 and p.operation like '%INDEX%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) s, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) i where f.c1 = s.c1 and f.c1 = i.c1 ; < awr_sql_full_scans_avg_dy.sql col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Index|Table|Scans’ format 999,999 col c3 heading ‘Full|Table|Scans’ format 999,999 select i.c1 c1, i.c2 c2, f.c2 c3 from ( select to_char(sn.begin_interval_time,'day') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%TABLE ACCESS%' and p.options like '%INDEX%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'day') order by 1 ) i, ( select to_char(sn.begin_interval_time,'day') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%TABLE ACCESS%' and p.options = 'FULL' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'day') order by 1 ) f where i.c1 = f.c1; < awr_hash_join_alert.sql col c1 heading ‘Date’ format a20 col c2 heading ‘Hash|Join|Count’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 col c4 heading ‘Disk|Reads’ format 99,999,999 col c5 heading ‘CPU|Time’ format 99,999,999 accept hash_thr char prompt ‘Enter Hash Join Threshold: ‘ ttitle ‘Hash Join Threshold|&hash_thr’ select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(*) c2, sum(st.rows_processed_delta) c3, sum(st.disk_reads_delta) c4, sum(st.cpu_time_delta) c5 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.operation = 'HASH JOIN' having count(*) > &hash_thr group by begin_interval_time; < monitor_hash_join_ful_ram.sql select tempseg_size from v$sql_workarea_active; Chapter 11 < display_session_process_details.sql select a.sid, a.serial#, b.spid, b.pid, a.username, a.osuser, a.machine from v$session a, v$process b where a.username IS NOT NULL and a.paddr=b.addr; < create_10046_wait_table.sql create directory load_directory as 'c:\oracle\product\admin\BOOKTST\udump'; drop table ext_10046_table_wait_events; create table ext_10046_table_wait_events (event_type varchar2(10), cursor_number number, wait_event_name varchar2(60), total_elapsed_time number, p1 varchar2(100), p2 varchar2(100), p3 varchar2(100), trace_row_num number ) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY load_directory access parameters ( RECORDS DELIMITED BY NEWLINE badfile load_directory:'bad_10046.log' logfile load_directory:'load_10046.log' skip 24 LOAD WHEN event_type="WAIT" FIELDS RTRIM ( event_type CHAR terminated by '#', cursor_number CHAR terminated by ': nam=', wait_event_name CHAR terminated by 'ela=', total_elapsed_time CHAR terminated by 'p1=', p1 CHAR terminated by 'p2=', p2 CHAR terminated by 'p3=', p3 CHAR terminated by WHITESPACE, trace_row_num recnum ) ) location ('booktst_ora_3640.trc') ) reject limit unlimited; < create_10046_wait_format.sql drop table ext_10046_table_pef_events; create table ext_10046_table_pef_events (event_type varchar2(10), cursor_number number, pef_cpu_time number, pef_elap number, pef_blocks number, pef_blocks_cm number, pef_blocks_curmode number, pef_lib_cache_misses number, pef_rows_returned number, pef_depth number, pef_goal number, pef_tim number, trace_row_num number ) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY load_directory access parameters ( RECORDS DELIMITED BY NEWLINE badfile load_directory:'bad_10046.log' logfile load_directory:'load_10046.log' skip 24 LOAD WHEN ( event_type="EXEC" or event_type="FETCH" or event_type="PARSE" ) FIELDS RTRIM ( event_type CHAR terminated by '#', cursor_number CHAR terminated by ':c=', pef_cpu_time CHAR terminated by ',e=', pef_elap CHAR terminated by ',p=', pef_blocks CHAR terminated by ',cr=', pef_blocks_cm CHAR terminated by ',cu=', pef_blocks_curmode CHAR terminated by ',mis=', pef_lib_cache_misses CHAR terminated by ',r=', pef_rows_returned CHAR terminated by ',dep=', pef_depth CHAR terminated by ',og=', pef_goal CHAR terminated by ',tim=', pef_tim CHAR terminated by WHITESPACE, trace_row_num recnum ) ) location ('booktst_ora_3640.trc') ) reject limit unlimited; < view_10046_trace.sql create or replace view vw_10046_view as select trace_row_num, event_type, cursor_number, wait_event_name, to_char(total_elapsed_time) wait_time, -1 command from ext_10046_table_wait_events union select trace_row_num, event_type, cursor_number, null, to_char(pef_tim), -1 from ext_10046_table_pef_events union select distinct b.trace_row_num, null, null, null, sql_text, to_number(cur_oct) command from v$sql a, ext_10046_table_cursor_events b where upper(b.cur_ad)=a.address (+) order by 1; create table tab_10046 as select * from vw_10046_view; Create index ix_tab_10046_01 on tab_10046(trace_row_num); Create index ix_tab_10046_02 on tab_10046(command); Create index ix_tab_10046_03 on tab_10046(event_type); Create index ix_tab_10046_04 on tab_10046 (event_type, trace_row_num, cursor_number, wait_time); < trace_exec_parse_fetch_sql.sql column time_between_events heading “Time|Between|Events” column wait_time format 9999999999 select event_type, cursor_number, to_number(wait_time) wait_time, (wait_time/1000000)-lag(wait_time/1000000, 1) over (order by trace_row_num) "time_between_events" from tab_10046 where event_type in ('EXEC','FETCH','PARSE') order by trace_row_num; < filter_trace_file.sql select trace_row_num, event_type, cursor_number, to_number(wait_time) wait_time, event_time from (select trace_row_num, event_type, cursor_number, wait_time, (wait_time/1000000)-lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME" from tab_10046 where event_type in ('EXEC','FETCH','PARSE') order by trace_row_num ) where trace_row_num in ( select trace_row_num from (select trace_row_num, (wait_time/1000000)- lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME" from tab_10046 where event_type in ('EXEC','FETCH','PARSE') ) where event_time > .25 ); < filter_trace_file_range.sql select ’E’ operation, trace_row_num, event_type, cursor_number, wait_time, event_time from select trace_row_num, event_type, cursor_number, to_number(wait_time) wait_time, (wait_time/1000000)-lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME" from tab_10046 where event_type in ('EXEC','FETCH','PARSE') order by trace_row_num ) where trace_row_num in ( select trace_row_num from (select trace_row_num, (wait_time/1000000)- lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME" from tab_10046 where event_type in ('EXEC','FETCH','PARSE') ) where event_time > .25 ) UNION select ’B’ Operation, trace_row_num, event_type, cursor_number, to_number(wait_time) wait_time, event_time from (select trace_row_num, event_type, cursor_number, wait_time, (wait_time/1000000)-lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME“ from tab_10046 where event_type in ('EXEC','FETCH','PARSE') order by trace_row_num ) where rowid in (select q_rowid from (select trace_row_num, (wait_time/1000000)- lag(wait_time/1000000, 1) over (order by trace_row_num) "EVENT_TIME“, lag(rowid) over (order by trace_row_num) q_rowid from tab_10046 where event_type in ('EXEC','FETCH','PARSE') ) where event_time > .25 ) order by trace_row_num; < trace_detail.sql select trace_row_num, event_type, wait_event_name, cursor_number, wait_time/1000000 wait_time from tab_10046 where trace_row_num between 4851699 and 4851727 order by trace_row_num; create table test ( pkey number(15) not null, pdate date not null, pchar varchar2(4000) not null ); create sequence test_seq; create procedure pop_test(p_pass in number) as begin for i in 1 .. p_pass loop insert into test select test_seq.nextval, sysdate, object_name||'.'||object_type||'.'||owner from sys.dba_objects; commit; end loop; end; / exec pop_test(500); Chapter 12 < statspack_osstats_rollup.sql select * from (select snap_id, osstat_id, value from stats$osstat where snap_id in (10046, 10047)) – filter for desired snapshots pivot sum(value) for osstat; < display_os_stats.sql select sum(a.time_waited_micro)/sum(a.total_waits)/1000000 c1, sum(b.time_waited_micro)/sum(b.total_waits)/1000000 c2, ( sum(a.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c3, ( sum(b.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c4, ( sum(b.time_waited_micro) / sum(b.total_waits)) / (sum(a.time_waited_micro)/sum(a.total_waits) ) * 100 c5 from dba_hist_system_event a, dba_hist_system_event b where a.snap_id = b.snap_id and a.event_name = 'db file scattered read' and b.event_name = 'db file sequential read'; < awr_osstats.sql select e.stat_name "Statistic Name" , decode(e.stat_name, 'NUM_CPUS', e.value, e.value - b.value) "Total" , decode( instrb(e.stat_name, 'BYTES'), 0, to_number(null) , round((e.value - b.value)/( select avg( extract( day from (e1.end_interval_time-b1.end_interval_time) )*24*60*60+ extract( hour from (e1.end_interval_time-b1.end_interval_time) )*60*60+ extract( minute from (e1.end_interval_time-b1.end_interval_time) )*60+ extract( second from (e1.end_interval_time-b1.end_interval_time)) ) from dba_hist_snapshot b1 ,dba_hist_snapshot e1 where b1.snap_id = b.snap_id and e1.snap_id = e.snap_id and b1.dbid = b.dbid and e1.dbid = e.dbid and b1.instance_number = b.instance_number and e1.instance_number = e.instance_number and b1.startup_time = e1.startup_time and b1.end_interval_time < e1.end_interval_time ),2)) "Per Second" from dba_hist_osstat b, dba_hist_osstat e where b.snap_id = &pBgnSnap and e.snap_id = &pEndSnap and b.dbid = &pDbId order by 1 asc; < awr_os_stats_load_cpu_ram.sql select s1t0.snap_id, to_char(s0.BEGIN_INTERVAL_TIME,'YYYY-Mon-DD HH24:MI:SS') time, s1t1.value - s1t0.value as busy_time, s2t1.value as load, s3t1.value as num_cpus, s4t1.value as physical_memory_bytes from dba_hist_snapshot s0, dba_hist_snapshot s1, dba_hist_osstat s1t0, dba_hist_osstat s1t1, dba_hist_osstat s2t1, dba_hist_osstat s3t1, dba_hist_osstat s4t1 where s0.dbid = (select dbid from v$database) and s1t0.dbid = s0.dbid and s1t1.dbid = s0.dbid and s2t1.dbid = s0.dbid and s3t1.dbid = s0.dbid and s4t1.dbid = s0.dbid and s0.instance_number = 1 and s1t0.instance_number = s0.instance_number and s1t1.instance_number = s0.instance_number and s2t1.instance_number = s0.instance_number and s3t1.instance_number = s0.instance_number and s4t1.instance_number = s0.instance_number and s1.snap_id = s0.snap_id + 1 and s1t0.snap_id = s0.snap_id and s1t1.snap_id = s0.snap_id + 1 and s2t1.snap_id = s0.snap_id and s3t1.snap_id = s0.snap_id and s4t1.snap_id = s0.snap_id and s1t0.stat_name = 'BUSY_TIME' and s1t1.stat_name = s1t0.stat_name and s2t1.stat_name = 'LOAD' and s3t1.stat_name = 'NUM_CPUS' and s4t1.stat_name = 'PHYSICAL_MEMORY_BYTES' order by snap_id asc; < awr_stats_deltas.sql select to_char(s.end_interval_time,'DD-MON-YYYY HH24:MI') SNAP_TIME, os.stat_name, os.value, lag(os.value,1) over (PARTITION BY os.STAT_NAME order by os.snap_id) prev, case when os.stat_name = 'LOAD' then os.value when os.stat_name = 'PHYSICAL_MEMORY_BYTES' then os.value else os.value - lag(os.value,1) over (PARTITION BY os.STAT_NAME order by os.snap_id) end value from dba_hist_snapshot s, dba_hist_osstat os where s.snap_id = os.snap_id order by os.snap_id,os.stat_name; < cr_vmstat_tab.sql connect perfstat/perfstat; drop table stats$vmstat; create table stats$vmstat ( start_date date, duration number, server_name varchar2(20), runque_waits number, page_in number, page_out number, user_cpu number, system_cpu number, idle_cpu number, wait_cpu number ) tablespace perfstat; < get_vmstat.ksh (Linux version) #!/bin/ksh # This is the Linux version #!/bin/ksh # This is the Linux version ORACLE_HOME=/usr/app/oracle/admin/product/8/1/6 export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH export PATH SERVER_NAME=`uname -a|awk '{print $2}'` typeset -u SERVER_NAME export SERVER_NAME # sample every five minutes (300 seconds) . . . . SAMPLE_TIME=300 while true do vmstat ${SAMPLE_TIME} 2 > /tmp/msg$$ # run vmstat and direct the output into the Oracle table . . . cat /tmp/msg$$|sed 1,3d | awk '{ printf("%s %s %s %s %s %s\n", $1, $8, $9, 14, $15, $16) }' | while read RUNQUE PAGE_IN PAGE_OUT USER_CPU SYSTEM_CPU DLE_CPU do $ORACLE_HOME/bin/sqlplus -s perfstat/perfstat@testsys1</dev/null 2>&1 & fi < vmstat_exception_rpt.sql set lines 80; set pages 999; set feedback off; set verify off; column my_date heading 'date hour' format a20 column c2 heading runq format 999 column c3 heading pg_in format 999 column c4 heading pg_ot format 999 column c5 heading usr format 999 column c6 heading sys format 999 column c7 heading idl format 999 column c8 heading wt format 999 ttitle 'run queue > 2|May indicate an overloaded CPU|When runqueue exceeds the number of CPUs| on the server, tasks are waiting for service.'; select server_name, to_char(start_date,'YY/MM/DD HH24') my_date, avg(runque_waits) c2, avg(page_in) c3, avg(page_out) c4, avg(user_cpu) c5, avg(system_cpu) c6, avg(idle_cpu) c7 from perfstat.stats$vmstat WHERE runque_waits > 2 and start_date > sysdate-&&1 group by server_name, to_char(start_date,'YY/MM/DD HH24') ORDER BY server_name, to_char(start_date,'YY/MM/DD HH24') ; ttitle 'page_in > 1|May indicate overloaded memory|Whenever Unix performs a page-in, the RAM memory | on the server has been exhausted and swap pages are being used.'; select server_name, to_char(start_date,'YY/MM/DD HH24') my_date, avg(runque_waits) c2, avg(page_in) c3, avg(page_out) c4, avg(user_cpu) c5, avg(system_cpu) c6, avg(idle_cpu) c7 from perfstat.stats$vmstat WHERE page_in > 1 and start_date > sysdate-&&1 group by server_name, to_char(start_date,'YY/MM/DD HH24') ORDER BY server_name, to_char(start_date,'YY/MM/DD HH24') ; ttitle 'user+system CPU > 70%|Indicates periods with a fully-loaded CPU subssystem.|Periods of 100% utilization are only a | concern when runqueue values exceeds the number of CPs on the server.'; select server_name, to_char(start_date,'YY/MM/DD HH24') my_date, avg(runque_waits) c2, avg(page_in) c3, avg(page_out) c4, avg(user_cpu) c5, avg(system_cpu) c6, avg(idle_cpu) c7 from perfstat.stats$vmstat WHERE (user_cpu + system_cpu) > 70 and start_date > sysdate-&&1 group by server_name, to_char(start_date,'YY/MM/DD HH24') ORDER BY server_name, to_char(start_date,'YY/MM/DD HH24') ; < phys_reads.sql break on begin_interval_time skip 2 column phyrds format 999,999,999 column begin_interval_time format a25 select begin_interval_time, filename, phyrds from dba_hist_filestatxs natural join dba_hist_snapshot where phyrds > 10000; Chapter 13 < display_hot_cold_files.sql select dg.name diskgroup, t.name, t.stripe, t.redundancy, t.primary_region, t.mirror_region from v$asm_diskgroup dg, v$asm_template t where dg.group_number = t.group_number and dg.name = 'DATA' ORDER BY t.name; select dg.name diskgroup, f.file_number, f.primary_region, f.mirror_region, f.hot_reads, f.hot_writes, f.cold_reads, f.cold_writes from v$asm_diskgroup dg, v$asm_file f where dg.group_number = f.group_number and dg.name = 'DATA'; set serveroutput on declare lat integer; iops integer; mbps integer; begin dbms_resource_manager.calibrate_io (2, 10, iops, mbps, lat); dbms_output.put_line ('max_iops = ' || iops); dbms_output.put_line ('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); end; / drop table perfstat.stats$iostat; create table perfstat.stats$iostat ( snap_time date, elapsed_seconds number(4), hdisk varchar2(8), kb_read number(9,0), kb_write number(9,0) ) tablespace perfstat storage (initial 20m next 1m ); create index perfstat.stats$iostat_date_idx on perfstat.stats$iostat (snap_time) tablespace perfstat storage (initial 5m next 1m); create index perfstat.stats$iostat_hdisk_idx on perfstat.stats$iostat (hdisk) tablespace perfstat storage (initial 5m next 1m); < get_iostat_solaris.ksh #!/bin/ksh while true do iostat -x 300 1|\ sed 1,2d|\ awk '{ printf("%s %s %s\n", $1, $4, $5) }' |\ while read HDISK VMSTAT_IO_R VMSTAT_IO_W do if [ $VMSTAT_IO_R -gt 0 ] and [ $VMSTAT_IO_W -gt 0 ] then sqlplus -s perfstat/perfstat <<! insert into perfstat.stats\$iostat values (SYSDATE, 5, '$HDISK', $VMSTAT_IO_R,$VMSTAT_IO_W); exit ! fi done sleep 300 done #!/bin/ksh # First, we must set the environment . . . . ORACLE_SID=prodz1 ORACLE_HOME=`cat /var/opt/oracle/oratab|grep $ORACLE_SID|cut -f2 -d':'` PATH=$ORACLE_HOME/bin:$PATH MON=`echo ~oracle/iostat` #---------------------------------------- # If it is not running, then start it . . . #---------------------------------------- check_stat=`ps -ef|grep get_iostat|wc -l`; oracle_num=`expr $check_stat` if [ $oracle_num -ne 2 ] then nohup $MON/get_iostat_solaris.ksh > /dev/null 2>&1 & fi < rpt_disk.sql column hdisk format a10; column mydate format a15; column sum_kb_read format 999,999; column sum_kb_write format 999,999; set pages 999; break on hdisk skip 1; select hdisk, -- to_char(snap_time,'yyyy-mm-dd HH24:mi:ss') mydate, -- to_char(snap_time,'yyyy-mm-dd HH24') mydate, to_char(snap_time,'day') mydate, sum(kb_read) sum_kb_read, sum(kb_write) sum_kb_write from stats$iostat group by hdisk ,to_char(snap_time,'day') -- ,to_char(snap_time,'yyyy-mm-dd HH24:mi:ss') -- ,to_char(snap_time,'yyyy-mm-dd HH24'); < asm_disk_iostat.sql col instname format a08 heading 'inst|name' col dbname format a08 heading 'db name' col group_name format a08 heading 'disk|group|name' col disk_number format 9999 heading 'asm|disk|#' col reads format 99999999 heading 'disk|reads' col read_time format 999999 heading 'read|time|(s)' col read_errs format 999999 heading 'read|errors' col mb_read format 999999.9 heading 'bytes|read|(mb)' col writes format 99999999 heading 'disk|writes' col write_errs format 999999 heading 'write|errors' col write_time format 999999 heading 'write|time|(s)' col mb_wrtn format 999999.9 heading 'bytes|written|(mb)' ttitle 'ASM disk I/O statistics' select a.dbname, a.instname, b.name group_name, a.disk_number, a.reads, a.read_errs, a.read_time, ( a.bytes_read / (1024*1024)) mb_read, a.writes, a.write_errs, a.write_time, ( a.bytes_written / (1024*1024)) mb_wrtn, -- ************************** -- new data columns in 11gr2 -- ************************** (a.hot_bytes_read / (1024*1024)) hot_mb_read, (a.cold_bytes_read / (1024*1024)) cold_mb_read, (a.hot_bytes_written / (1024*1024)) hot_mb_wrtn, (a.cold_bytes_written / (1024*1024)) cold_mb_wrtn from v$asm_disk_iostat a, v$asm_diskgroup b where a.group_number = b.group_number order by a.dbname, a.instname, adg.name; < blocks_to_buffers.sql select decode( pd.bp_id, 1,'KEEP', 2,'RECYCLE', 3,'DEFAULT', 4,'2K SUBCACHE', 5,'4K SUBCACHE', 6,'8K SUBCACHE', 7,'16K SUBCACHE', 8,'32K SUBCACHE', 'UNKNOWN') subcache, bh.object_name, bh.blocks from x$kcbwds ds, x$kcbwbpd pd, (select /*+ use_hash(x) */ set_ds, o.name object_name, count(*) BLOCKS from obj$ o, x$bh x where o.dataobj# = x.obj and x.state !=0 and o.owner# !=0 group by set_ds,o.name) bh where ds.set_id >= pd.bp_lo_sid and ds.set_id <= pd.bp_hi_sid and pd.bp_size != 0 and ds.addr=bh.set_ds; < ora_phys_io.sql select d.name file_name, c.name tablespace_name, b.phyrds, b.phywrts, b.phyblkrd, b.phyblkwrt, b.readtim, b.writetim from sys.v_$datafile a, sys.v_$filestat b, sys.ts$ c, sys.v_$dbfile d, sys.file$ e where a.file# = b.file# and a.file# = d.file# and e.ts# = c.ts# and e.file# = d.file# union all select v.fnnam file_name, c.name tablespace_name, b.phyrds, b.phywrts, b.phyblkrd, b.phyblkwrt, b.readtim, b.writetim from sys.v_$tempfile a, sys.v_$tempstat b, sys.ts$ c, sys.x$kccfn v, sys.x$ktfthc hc where a.file# = b.file# and a.file# = hc.ktfthctfno and hc.ktfthctsn = c.ts# and v.fntyp = 7 and v.fnnam is not null and v.fnfno = hc.ktfthctfno and hc.ktfthctsn = c.ts# order by 3 desc; < io_overview.sql select name, value from sys.v_$sysstat where name in ('consistent changes', 'consistent gets', 'db block changes', 'db block gets', 'physical reads', 'physical writes', 'sorts (disk)', 'user commits', 'user rollbacks' ) order by 1; < v_dollar_phys_reads_ratio.sql select 100 - 100 * (round ((sum (decode (name, 'physical reads', value, 0)) - sum (decode (name, 'physical reads direct', value, 0)) - sum (decode (name, 'physical reads direct (lob)', value, 0))) / (sum (decode (name, 'session logical reads', value, 1)) ),3)) hit_ratio from sys.v_$sysstat where name in ('session logical reads', 'physical reads direct (lob)', 'physical reads', 'physical reads direct'); < fileio.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* rem rem NAME: fileio.sql rem rem FUNCTION: Reports on the file io status of all of the rem FUNCTION: datafiles in the database. rem column sum_io1 new_value st1 noprint column sum_io2 new_value st2 noprint column sum_io new_value divide_by noprint column Percent format 999.999 heading 'Percent|Of IO' column brratio format 999.99 heading 'Block|Read|Ratio' column bwratio format 999.99 heading 'Block|Write|Ratio' column phyrds heading 'Physical | Reads' column phywrts heading 'Physical | Writes' column phyblkrd heading 'Physical|Block|Reads' column phyblkwrt heading 'Physical|Block|Writes' column name format a45 heading 'File|Name' column file# format 9999 heading 'File' column dt new_value today noprint select to_char(sysdate,'ddmonyyyyhh24miss') dt from dual; set feedback off verify off lines 132 pages 60 sqlbl on trims on rem select nvl(sum(a.phyrds+a.phywrts),0) sum_io1 from sys.v_$filestat a; select nvl(sum(b.phyrds+b.phywrts),0) sum_io2 from sys.v_$tempstat b; select &st1+&st2 sum_io from dual; rem @title132 'File I/O Statistics Report' spool rep_out\&db\fileio&&today select a.file#,b.name, a.phyrds, a.phywrts, (100*(a.phyrds+a.phywrts)/÷_by) Percent, a.phyblkrd, a.phyblkwrt, (a.phyblkrd/greatest(a.phyrds,1)) brratio, (a.phyblkwrt/greatest(a.phywrts,1)) bwratio from sys.v_$filestat a, sys.v_$dbfile b where a.file#=b.file# union select c.file#,d.name, c.phyrds, c.phywrts, (100*(c.phyrds+c.phywrts)/÷_by) Percent, c.phyblkrd, c.phyblkwrt,(c.phyblkrd/greatest(c.phyrds,1)) brratio, (c.phyblkwrt/greatest(c.phywrts,1)) bwratio from sys.v_$tempstat c, sys.v_$tempfile d where c.file#=d.file# order by 1 / spool off pause Press enter to continue set feedback on verify on lines 80 pages 22 clear columns ttitle off < get_io.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set serveroutput on declare cursor get_io is select nvl(sum(a.phyrds+a.phywrts),0) sum_io1,to_number(null) sum_io2 from sys.gv_$filestat a union select to_number(null) sum_io1, nvl(sum(b.phyrds+b.phywrts),0) sum_io2 from sys.gv_$tempstat b; now date; elapsed_seconds number; sum_io1 number; sum_io2 number; sum_io12 number; sum_io22 number; tot_io number; tot_io_per_sec number; fixed_io_per_sec number; temp_io_per_sec number; begin open get_io; for i in 1..2 loop fetch get_io into sum_io1, sum_io2; if i = 1 then sum_io12:=sum_io1; else sum_io22:=sum_io2; end if; end loop; select sum_io12+sum_io22 into tot_io from dual; select sysdate into now from dual; select ceil((now-max(startup_time))*(60*60*24)) into elapsed_seconds from gv$instance; fixed_io_per_sec:=sum_io12/elapsed_seconds; temp_io_per_sec:=sum_io22/elapsed_seconds; tot_io_per_sec:=tot_io/elapsed_seconds; dbms_output.put_line('Elapsed Sec :'||to_char(elapsed_seconds, '9,999,999.99')); dbms_output.put_line('Fixed IO/SEC:'||to_char(fixed_io_per_sec,'9,999,999.99')); dbms_output.put_line('Temp IO/SEC :'||to_char(temp_io_per_sec, '9,999,999.99')); dbms_output.put_line('Total IO/SEC:'||to_char(tot_io_Per_Sec, '9,999,999.99')); end; / < wait_report.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* col event format a30 heading 'Event Name' col waits format 999,999,999 heading 'Total|Waits' col average_wait format 999,999,999 heading 'Average|Waits' col time_waited format 999,999,999 heading 'Time Waited' col total_time new_value divide_by noprint col value new_value val noprint col percent format 999.990 heading 'Percent|Of|Non-Idle Waits' col duration new_value millisec noprint col p_of_total heading 'Percent|of Total|Uptime' format 999.9999 set lines 132 feedback off verify off pages 50 select to_number(sysdate-startup_time)*86400*1000 duration from v$instance; select sum(time_waited) total_time from v$system_event where total_waits-total_timeouts>0 and event not like 'SQL*Net%' and event not like 'smon%' and event not like 'pmon%' and event not like 'rdbms%' and event not like 'PX%' and event not like 'sbt%' and event not in ('gcs remote message','ges remote message','virtual circuit status','dispatcher timer') ; select value from v$sysstat where name ='CPU used when call started'; @title132 'System Events Percent' break on report compute sum of time_waited on report spool rep_out/&db/sys_events select name event, 0 waits, 0 average_wait, value time_waited, value/(&÷_by+&&val)*100 Percent, value/&&millisec*100 p_of_total from v$sysstat where name ='CPU used when call started' union select event, total_waits-total_timeouts waits, time_waited/(total_waits-total_timeouts) average_wait, time_waited, time_waited/(&÷_by+&&val)*100 Percent, time_waited/&&millisec*100 P_of_total from v$system_event where total_waits-total_timeouts>0 and event not like 'SQL*Net%' and event not like 'smon%' and event not like 'pmon%' and event not like 'rdbms%' and event not like 'PX%' and event not like 'sbt%' and event not in ('gcs remote message','ges remote message','virtual circuit status','dispatcher timer') and time_waited>0 order by percent desc / spool off clear columns ttitle off clear computes clear breaks col instname format a08 heading 'inst|name' col dbname format a08 heading 'db name' col group_name format a08 heading 'disk|group|name' col disk_number format 9999 heading 'asm|disk|#' col reads format 99999999 heading 'disk|reads' col read_time format 999999 heading 'read|time|(s)' col read_errs format 999999 heading 'read|errors' col mb_read format 999999.9 heading 'bytes|read|(mb)' col writes format 99999999 heading 'disk|writes' col write_errs format 999999 heading 'write|errors' col write_time format 999999 heading 'write|time|(s)' col mb_wrtn format 999999.9 heading 'bytes|written|(mb)' ttitle 'ASM disk I/O statistics' select a.dbname, a.instname, b.name group_name, a.disk_number, a.reads, a.read_errs, a.read_time, ( a.bytes_read / (1024*1024)) mb_read, a.writes, a.write_errs, a.write_time, ( a.bytes_written / (1024*1024)) mb_wrtn, -- ************************** -- new data columns in 11gr2 -- ************************** (a.hot_bytes_read / (1024*1024)) hot_mb_read, (a.cold_bytes_read / (1024*1024)) cold_mb_read, (a.hot_bytes_written / (1024*1024)) hot_mb_wrtn, (a.cold_bytes_written / (1024*1024)) cold_mb_wrtn from v$asm_disk_iostat a, v$asm_diskgroup b where a.group_number = b.group_number order by a.dbname, a.instname, adg.name; select event, wait_time_milli, wait_count from v$event_histogram where event in (select name from v$event_name where wait_class not in ('Idle') ) order by 1,2; -- Sequential read wait times select wait_time_milli, wait_count from v$event_histogram where event = 'db file sequential read' order by wait_time_milli; -- Scattered read wait times (full scans) select wait_time_milli, wait_count from v$event_histogram where event = 'db file scattered read' order by wait_time_milli; < awr_waits_over_time.sql col c1 heading 'Average Waits for|Full Scan Read I/O' format 9999.999 col c2 heading 'Average Waits for|Index Read I/O' format 9999.999 col c3 heading 'Percent of| I/O Waits|for scattered|Full Scans' format 9.99 col c4 heading 'Percent of| I/O Waits|for sequential|Index Scans' format 9.99 col c5 heading 'Starting|Value|for|optimizer|index|cost|adj' format 999 select sum(a.time_waited_micro)/sum(a.total_waits)/1000000 c1, sum(b.time_waited_micro)/sum(b.total_waits)/1000000 c2, ( sum(a.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c3, ( sum(b.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c4, ( sum(b.time_waited_micro) / sum(b.total_waits)) / (sum(a.time_waited_micro)/sum(a.total_waits) ) * 100 c5 from dba_hist_system_event a, dba_hist_system_event b where a.snap_id = b.snap_id and a.event_name = 'db file scattered read' and b.event_name = 'db file sequential read'; < toptables.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select table_owner "table owner", table_name "table name", command "command issued", 0 - executions "executions", disk_reads "disk reads", gets "buffer gets", rows_processed "rows processed" from (select distinct executions, command, table_owner, table_name, gets, rows_processed, disk_reads from (select decode (a.command_type , 2, 'insert ' , 3,'select ', 6, 'update ' , 7, 'delete ' , 26,'table lock ') command , c.owner table_owner, c.name table_name , sum(a.disk_reads) disk_reads , sum(0 - a.executions) executions , sum(a.buffer_gets) gets , sum(a.rows_processed) rows_processed from sys.v_$sql a , sys.v_$object_dependency b , sys.v_$db_object_cache c where a.command_type in (2,3,6,7,26)and b.from_address = a.address and b.to_owner = c.owner and b.to_name= c.name and c.type = 'table' and c.owner not in ('SYS','SYSTEM') group by a.command_type , c.owner , c.name ) ) where rownum <= 100; < sql_to_tables.sql select table_owner, table_name, table_type, size_kb, statement_count, reference_count, executions, executions * reference_count total_scans from (select a.object_owner table_owner, a.object_name table_name, b.segment_type table_type, b.bytes / 1024 size_kb, sum(c.executions ) executions, count( distinct a.hash_value ) statement_count, count( * ) reference_count from sys.v_$sql_plan a, sys.dba_segments b, sys.v_$sql c where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type IN ('TABLE', 'TABLE PARTITION') and a.operation LIKE '%TABLE%' and a.options = 'FULL' and a.hash_value = c.hash_value and b.bytes / 1024 > 1024 group by a.object_owner, a.object_name, a.operation, b.bytes / 1024, b.segment_type order by 4 desc, 1, 2 ); select name, block_size, (1-(physical_reads/ decode(db_block_gets+consistent_gets, 0, .001, db_block_gets+consistent_gets)))*100 cache_hit_ratio from v$buffer_pool_statistics; < snapfileio_awr.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* rem FUNCTION: Reports on the file io status of all of the rem FUNCTION: datafiles in the database for a single snapshot. column sum_io1 new_value st1 noprint column sum_io2 new_value st2 noprint column sum_io new_value divide_by noprint column Percent format 999.999 heading 'Percent|Of IO' column brratio format 999.99 heading 'Block|Read|Ratio' column bwratio format 999.99 heading 'Block|Write|Ratio' column phyrds heading 'Physical | Reads' column phywrts heading 'Physical | Writes' column phyblkrd heading 'Physical|Block|Reads' column phyblkwrt heading 'Physical|Block|Writes' column filename format a45 heading 'File|Name' column file# format 9999 heading 'File' set feedback off verify off lines 132 pages 60 sqlbl on trims on select nvl(sum(a.phyrds+a.phywrts),0) sum_io1 from dba_hist_filestatxs a where snap_id=&&snap; select nvl(sum(b.phyrds+b.phywrts),0) sum_io2 from dba_hist_tempstatxs b where snap_id=&&snap; select &st1+&st2 sum_io from dual; rem @title132 'Snap&&snap File I/O Statistics Report' spool rep_out\&db\fileio&&snap select a.filename, a.phyrds, a.phywrts, (100*(a.phyrds+a.phywrts)/÷_by) Percent, a.phyblkrd, a.phyblkwrt, (a.phyblkrd/greatest(a.phyrds,1)) brratio, (a.phyblkwrt/greatest(a.phywrts,1)) bwratio from dba_hist_filestatxs a where a.snap_id=&&snap union select c.filename, c.phyrds, c.phywrts, (100*(c.phyrds+c.phywrts)/÷_by) Percent, c.phyblkrd, c.phyblkwrt,(c.phyblkrd/greatest(c.phyrds,1)) brratio, (c.phyblkwrt/greatest(c.phywrts,1)) bwratio from dba_hist_tempstatxs c where c.snap_id=&&snap order by 1 / spool off pause Press enter to continue set feedback on verify on lines 80 pages 22 clear columns ttitle off undef snap < snapdeltafileio_awr.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* rem FUNCTION: Reports on the file io status of all of rem FUNCTION: the datafiles in the database across rem FUNCTION: two snapshots. column sum_io1 new_value st1 noprint column sum_io2 new_value st2 noprint column sum_io new_value divide_by noprint column Percent format 999.999 heading 'Percent|Of IO' column brratio format 999.99 heading 'Block|Read|Ratio' column bwratio format 999.99 heading 'Block|Write|Ratio' column phyrds heading 'Physical | Reads' column phywrts heading 'Physical | Writes' column phyblkrd heading 'Physical|Block|Reads' column phyblkwrt heading 'Physical|Block|Writes' column filename format a45 heading 'File|Name' column file# format 9999 heading 'File' set feedback off verify off lines 132 pages 60 sqlbl on trims on select nvl(sum((b.phyrds-a.phyrds)+(b.phywrts-a.phywrts)),0) sum_io1 from dba_hist_filestatxs a, dba_hist_filestatxs b where a.snap_id=&&first_snap_id and b.snap_id=&&sec_snap_id and a.filename=b.filename; select nvl(sum((b.phyrds-a.phyrds)+(b.phywrts-a.phywrts)),0) sum_io2 from dba_hist_tempstatxs a, dba_hist_tempstatxs b where a.snap_id=&&first_snap_id and b.snap_id=&&sec_snap_id and a.filename=b.filename; select &st1+&st2 sum_io from dual; rem @title132 'Snap &&first_snap_id to &&sec_snap_id File I/O Statistics Report' spool rep_out\&db\fileio'&&first_snap_id'_to_'&&sec_snap_id' select a.filename, b.phyrds -a.phyrds phyrds, b.phywrts-a.phywrts phywrts, (100*((b.phyrds-a.phyrds)+(b.phywrts-a.phywrts))/÷_by) Percent, b.phyblkrd- a.phyblkrd phyblkrd, b.phyblkwrt-a.phyblkwrt phyblgwrt, ((b.phyblkrd-a.phyblkrd)/greatest((b.phyrds-a.phyrds),1)) brratio, ((b.phyblkwrt-a.phyblkwrt)/greatest((b.phywrts-a.phywrts),1)) bwratio from dba_hist_filestatxs a, dba_hist_filestatxs b where a.snap_id=&&first_snap_id and b.snap_id=&&sec_snap_id and a.filename=b.filename union select c.filename, d.phyrds-c.phyrds phyrds, d.phywrts-c.phywrts phywrts, (100*((d.phyrds-c.phyrds)+(d.phywrts-c.phywrts))/÷_by) Percent, d.phyblkrd-c.phyblkrd phyblkrd, d.phyblkwrt-c.phyblkwrt phyblgwrt, ((d.phyblkrd-c.phyblkrd)/greatest((d.phyrds-c.phyrds),1)) brratio, ((d.phyblkwrt-c.phyblkwrt)/greatest((d.phywrts-c.phywrts),1)) bwratio from dba_hist_tempstatxs c, dba_hist_tempstatxs d where c.snap_id=&&first_snap_id and d.snap_id=&&sec_snap_id and c.filename=d.filename order by 1 / spool off pause Press enter to continue set feedback on verify on lines 80 pages 22 clear columns ttitle off undef first_snap_id undef sec_snap_id; < avg_stats_doy.sql prompt Copyright 2004 by Donald K. Burleson prompt prompt prompt This will query the dba_hist_sysstat view to prompt display average values by hour of the day prompt set pages 999 break on snap_time skip 2 accept stat_name char prompt 'Enter Statistics Name: '; col snap_time format a19 col avg_value format 999,999,999 select decode(snap_time1,1,'Monday',2,'Tuesday',3,'Wednesday',4,'Thursday',5,'Friday',6,'Saturday',7,'Sunday') snap_time, avg_value from ( select to_char(begin_interval_time,'d') snap_time1, avg(value) avg_value from dba_hist_sysstat natural join dba_hist_snapshot where stat_name = 'physical reads' group by to_char(begin_interval_time,'d') order by to_char(begin_interval_time,'d') ); Chapter 14 < display_pga_size.sql set pages 999; column pga_size format 999,999,999 select 1048576+a.value+b.value pga_size from v$parameter a, v$parameter b where a.name = 'sort_area_size' and b.name = 'hash_area_size'; set pages 999; column pga_size format 999,999,999 accept hwm number prompt 'Enter high-water mark of connected users:' select &hwm*(2048576+a.value+b.value) pga_size from v$parameter a, v$parameter b where a.name = 'sort_area_size' and b.name = 'hash_area_size'; < track_hash_joins.sql col c1 heading ‘Date’ format a20 col c2 heading ‘Hash|join|Count’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 col c4 heading ‘Disk|Reads’ format 99,999,999 col c5 heading ‘CPU|Time’ format 99,999,999 accept nested_thr char prompt ‘Enter Nested Join Threshold: ‘ ttitle ‘Nested Join Threshold|&nested_thr’ select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(*) c2, sum(st.rows_processed_delta) c3, sum(st.disk_reads_delta) c4, sum(st.cpu_time_delta) c5 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and sn.dbid = st.dbid and p.operation like ‘%HASH%’ having count(*) > &hash_thr group by begin_interval_time; select 'alter session set hash_area_size='||trunc(sum(bytes)*1.6)||';' from dba_segments where segment_name = upper('&1'); spool off; @run_hash < ash__view_events.sql select ash.event, sum(ash.wait_time + ash.time_waited) ttl_wait_time from v$active_session_history ash where ash.sample_time between sysdate - 60/2880 and sysdate group by ash.event order by 2; < ash_session_details.sql col wait_time format 999,999,999 select sess.sid, sess.username, sum(ash.wait_time + ash.time_waited) wait_time from v$active_session_history ash, v$session sess where ash.sample_time > sysdate-1 and ash.session_id = sess.sid group by sess.sid, sess.username order by 3; < ash_display_sql_wait_time.sql select ash.user_id, u.username, sqla.sql_text, sum(ash.wait_time + ash.time_waited) wait_time from v$active_session_history ash, v$sqlarea sqla, dba_users u where ash.sample_time > sysdate-1 and ash.sql_id = sqla.sql_id and ash.user_id = u.user_id group by ash.user_id, sqla.sql_text, u.username order by 4; select obj.object_name, obj.object_type, ash.event, sum(ash.wait_time + ash.time_waited) wait_time from v$active_session_history ash, dba_objects obj where ash.sample_time > sysdate -1 and ash.current_obj# = obj.object_id group by obj.object_name, obj.object_type, ash.event order by 4 desc; select 1 - ((a.value - (b.value))/d.value) "Cache Hit Ratio" from v$sysstat a, v$sysstat b, v$sysstat d where a.name='physical reads' and b.name='physical reads direct' and d.name='session logical reads'; < rpt_bhr_all.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* column bhr format 9.99 column mydate heading 'yr. mo dy Hr.' select to_char(snap_time,'yyyy-mm-dd HH24') mydate, new.name buffer_pool_name, (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) bhr from dba_hist_buffer_pool_stat old, dba_hist_buffer_pool_stat new, dba_hist_sga sn where (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) < .90 and new.name = old.name and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 ; < rpt_bhr_all_awr.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* column bhr format 9.99 column mydate heading 'yr. mo dy Hr.' select to_char(end_interval_time,'yyyy-mm-dd HH24') mydate, new.name buffer_pool_name, (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) bhr from dba_hist_buffer_pool_stat old, dba_hist_buffer_pool_stat new, dba_hist_snapshot sn where (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) < .90 and new.name = old.name and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 ; < display_buffer_cache_advice.sql column c1 heading 'Cache Size (m)' format 999,999,999,999 column c2 heading 'Buffers' format 999,999,999 column c3 heading 'Estd Phys|Read Factor' format 999.90 column c4 heading 'Estd Phys| Reads' format 999,999,999 select size_for_estimate c1, buffers_for_estimate c2, estd_physical_read_factor c3, estd_physical_reads c4 from v$db_cache_advice where name = 'DEFAULT' and block_size = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size') and advice_status = 'ON'; < rpt_bhr_awr_hr.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set pages 999; column bhr format 9.99 column mydate heading 'yr. mo dy Hr.' select to_char(snap_time,'HH24') mydate, avg( (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) ) bhr from dba_hist_buffer_pool_stat old, dba_hist_buffer_pool_stat new, dba_hist_sga sn where new.name in ('DEFAULT','FAKE VIEW') and new.name = old.name and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 and new.consistent_gets > 0 and old.consistent_gets > 0 having avg( (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) ) < 1 group by to_char(snap_time,'HH24'); set pages 999; column bhr format 9.99 column mydate heading 'yr. mo dy Hr.' select to_char(end_interval_time,'day') mydate, avg( (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) ) bhr from dba_hist_buffer_pool_stat old, dba_hist_buffer_pool_stat new, dba_hist_snapshot sn where new.name in ('DEFAULT','FAKE VIEW') and new.name = old.name and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 and new.consistent_gets > 0 and old.consistent_gets > 0 having avg( (((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets))- (new.physical_reads-old.physical_reads)) / ((new.consistent_gets-old.consistent_gets)+ (new.db_block_gets-old.db_block_gets)) ) < 1 group by to_char(end_interval_time,'day') ; set lines 80; set pages 999; column mydate heading 'Yr. Mo Dy Hr.' format a16 column c1 heading "execs" format 9,999,999 column c2 heading "Cache Misses|While Executing" format 9,999,999 column c3 heading "Library Cache|Miss Ratio" format 999.99999 break on mydate skip 2; select to_char(snap_time,'yyyy-mm-dd HH24') mydate, sum(new.pins-old.pins) c1, sum(new.reloads-old.reloads) c2, sum(new.reloads-old.reloads)/ sum(new.pins-old.pins) library_cache_miss_ratio from stats$librarycache old, stats$librarycache new, stats$snapshot sn where new.snap_id = sn.snap_id and old.snap_id = new.snap_id-1 and old.namespace = new.namespace group by to_char(snap_time,'yyyy-mm-dd HH24'); SELECT obj object, dbarfil file#, dbablk block#, tch touches FROM x$bh WHERE tch > 10 ORDER BY tch desc; < buf_blocks.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set pages 999 set lines 92 ttitle 'Contents of Data Buffers' drop table t1; create table t1 as select o.owner owner, o.object_name object_name, o.subobject_name subobject_name, o.object_type object_type, count(distinct file# || block#) num_blocks from dba_objects o, v$bh bh where o.data_object_id = bh.objd and o.owner not in ('SYS','SYSTEM') and bh.status != 'free' group by o.owner, o.object_name, o.subobject_name, o.object_type order by count(distinct file# || block#) desc ; column c0 heading "Owner" format a12 column c1 heading "Object|Name" format a30 column c2 heading "Object|Type" format a8 column c3 heading "Number of|Blocks in|Buffer|Cache" format 99,999,999 column c4 heading "Percentage|of object|blocks in|Buffer" format 999 column c5 heading "Buffer|Pool" format a7 column c6 heading "Block|Size" format 99,999 select t1.owner c0, object_name c1, case when object_type = 'TABLE PARTITION' then 'TAB PART' when object_type = 'INDEX PARTITION' then 'IDX PART' else object_type end c2, sum(num_blocks) c3, (sum(num_blocks)/greatest(sum(blocks), .001))*100 c4, buffer_pool c5, sum(bytes)/sum(blocks) c6 from t1, dba_segments s where s.segment_name = t1.object_name and s.owner = t1.owner and s.segment_type = t1.object_type and nvl(s.partition_name,'-') = nvl(t1.subobject_name,'-') group by t1.owner, object_name, object_type, buffer_pool having sum(num_blocks) > 10 order by sum(num_blocks) desc; < all_vbh_status.sql set pages 50 @title80 'All Buffers Status' spool rep_out\&&db\all_vbh_status select '32k '||status as status, count(*) as num from v$bh where file# in( select file_id from dba_data_files where tablespace_name in ( select tablespace_name from dba_tablespaces where block_size=32768)) group by '32k '||status union select '16k '||status as status, count(*) as num from v$bh where file# in( select file_id from dba_data_files where tablespace_name in ( select tablespace_name from dba_tablespaces where block_size=16384)) group by '16k '||status union select '8k '||status as status, count(*) as num from v$bh where file# in( select file_id from dba_data_files where tablespace_name in ( select tablespace_name from dba_tablespaces where block_size=8192)) group by '8k '||status union select '4k '||status as status, count(*) as num from v$bh where file# in( select file_id from dba_data_files where tablespace_name in ( select tablespace_name from dba_tablespaces where block_size=4096)) group by '4k '||status union select '2k '||status as status, count(*) as num from v$bh where file# in( select file_id from dba_data_files where tablespace_name in ( select tablespace_name from dba_tablespaces where block_size=2048)) group by '2k '||status union select status, count(*) as num from v$bh where status='free' group by status order by 1 / spool off ttitle off < obj_xtab.sql -- Crosstab of object and statistic for an owner -- by Mike Ault www.oracle-script.com col "Object" format a20 set numwidth 12 set lines 132 set pages 50 @title132 'Object Wait Statistics' spool rep_out\&&db\obj_stat_xtab select * from ( select DECODE (GROUPING(a.object_name), 1, 'All Objects', a.object_name) AS "Object", sum(case when a.statistic_name = 'ITL waits' then a.value else null end) "ITL Waits", sum(case when a.statistic_name = 'buffer busy waits' then a.value else null end) "Buffer Busy Waits", sum(case when a.statistic_name = 'row lock waits' then a.value else null end) "Row Lock Waits", sum(case when a.statistic_name = 'physical reads' then a.value else null end) "Physical Reads", sum(case when a.statistic_name = 'logical reads' then a.value else null end) "Logical Reads" from v$segment_statistics a where a.owner like upper('&owner') group by rollup(a.object_name)) b where (b."ITL Waits">0 or b."Buffer Busy Waits">0) / spool off clear columns ttitle off < resize_sga.ksh #!/bin/ksh # First, we must set the environment . . . . ORACLE_SID=$1 export ORACLE_SID ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'` #ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'` export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH export PATH # ********************************************************* # # This will reduce the size of the data buffer # immediately preceding a large truncate or data purge # # ********************************************************* $ORACLE_HOME/bin/sqlplus –s /nologin<<! connect system/manager as sysdba; alter system set db_cache_size=10m; alter system flush buffer_cache; exit ! # ********************************************************* # Now we can invoke the specialty task. # ********************************************************* nohup purge_job.ksh > /tmp/purge.lst 2>&1 & $ORACLE_HOME/bin/sqlplus –s /nologin<<! connect system/manager as sysdba; alter system set db_cache_size=1500m; exit ! -- You MUST connect as SYS to run this script connect sys/manager; set lines 80; set pages 999; column avg_touches format 999 column myname heading 'Name' format a30 column mytype heading 'Type' format a10 column buffers format 999,999 SELECT object_type mytype, object_name myname, blocks, COUNT(1) buffers, AVG(tch) avg_touches FROM sys.x$bh a, dba_objects b, dba_segments s WHERE a.obj = b.object_id and b.object_name = s.segment_name and b.owner not in ('SYS','SYSTEM') GROUP BY object_name, object_type, blocks, obj HAVING AVG(tch) > 5 AND COUNT(1) > 20; < buf_keep_pool.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set pages 999 set lines 92 spool keep_syn.lst drop table t1; create table t1 as select o.owner owner, o.object_name object_name, o.subobject_name subobject_name, o.object_type object_type, count(distinct file# || block#) num_blocks from dba_objects o, v$bh bh where o.data_object_id = bh.objd and o.owner not in ('SYS','SYSTEM') and bh.status != 'free' group by o.owner, o.object_name, o.subobject_name, o.object_type order by count(distinct file# || block#) desc ; select 'alter '||s.segment_type||' '||t1.owner||'.'||s.segment_name||' storage (buffer_pool keep);' from t1, dba_segments s where s.segment_name = t1.object_name and s.owner = t1.owner and s.segment_type = t1.object_type and nvl(s.partition_name,'-') = nvl(t1.subobject_name,'-') and buffer_pool <> 'KEEP' and object_type in ('TABLE','INDEX') group by s.segment_type, t1.owner, s.segment_name having (sum(num_blocks)/greatest(sum(blocks), .001))*100 > 80 ; spool off; < get_keep_pool.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select 'alter table '||p.owner||'.'||p.name||' storage (buffer_pool keep);' from dba_tables t, dba_segments s, dba_hist_sqlstat a, (select distinct pl.sql_id, pl.object_owner owner, pl.object_name name from dba_hist_sql_plan pl where pl.operation = 'TABLE ACCESS' and pl.options = 'FULL') p where a.sql_id = p.sql_id and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') and t.buffer_pool <> 'KEEP' having s.blocks < 50 group by p.owner, p.name, t.num_rows, s.blocks UNION -- *********************************************************** -- Next, get the index names -- *********************************************************** select 'alter index '||owner||'.'||index_name||' storage (buffer_pool keep);' from dba_indexes where owner||'.'||table_name in ( select p.owner||'.'||p.name from dba_tables t, dba_segments s, dba_hist_sqlstat a, (select distinct pl.sql_id, pl.object_owner owner, pl.object_name name from dba_hist_sql_plan pl where pl.operation = 'TABLE ACCESS' and pl.options = 'FULL') p where a.sql_id = p.sql_id and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') and t.buffer_pool <> 'KEEP' having s.blocks < 50 group by p.owner, p.name, t.num_rows, s.blocks ) < keep_syn.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set pages 999 set lines 92 spool keep_syn.lst drop table t1; create table t1 as select o.owner owner, o.object_name object_name, o.subobject_name subobject_name, o.object_type object_type, count(distinct file# || block#) num_blocks from dba_objects o, v$bh bh where o.data_object_id = bh.objd and o.owner not in ('SYS','SYSTEM') and bh.status != 'free' group by o.owner, o.object_name, o.subobject_name, o.object_type order by count(distinct file# || block#) desc ; select 'alter '||s.segment_type||' '||t1.owner||'.'||s.segment_name||' storage (buffer_pool keep);' from t1, dba_segments s where s.segment_name = t1.object_name and s.owner = t1.owner and s.segment_type = t1.object_type and nvl(s.partition_name,'-') = nvl(t1.subobject_name,'-') and buffer_pool <> 'KEEP' and object_type in ('TABLE','INDEX') group by s.segment_type, t1.owner, s.segment_name having (sum(num_blocks)/greatest(sum(blocks), .001))*100 > 80 ; < size_keep_pool.ksh #!/bin/ksh # First, we must set the environment . . . . ORACLE_SID=mon1 export ORACLE_SID ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'` export ORACLE_HOME PATH=$ORACLE_HOME/bin:$PATH export PATH $ORACLE_HOME/bin/sqlplus system/manager<<! spool myfile.sql set heading off spool run.sql select ' alter system set db_keep_cache_size = '||trunc(sum(s.bytes)*1.5)||' scope=both;' from dba_segments s where s.buffer_pool = 'KEEP'; spool off; exit ! @run.sql < flash_cache_waits.sql select name, value from v$sysstat where name in ('physical read flash cache hits', 'physical reads', 'consistent gets', 'db block gets', 'flash cache inserts'); select owner||'.'||object_name from v$bh, dba_objects where v$bh.status like ('flash%'); < gen_recycle_syntax.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* set pages 999; set heading off; set feedback off; ttitle off; spool keep_syntax.sql -- *********************************************************** -- First, get the table list -- *********************************************************** select 'alter table '||p.owner||'.'||p.name||' storage (buffer_pool recycle);' from dba_tables t, dba_segments s, v$sqlarea a, (select distinct address, object_owner owner, object_name name from v$sql_plan where operation = 'TABLE ACCESS' and options = 'FULL') p where a.address = p.address and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') and t.buffer_pool <> 'RECYCLE' having s.blocks > 10000 group by p.owner, p.name, t.num_rows, s.blocks UNION -- *********************************************************** -- Next, get the index names -- *********************************************************** select 'alter index '||owner||'.'||index_name||' storage (buffer_pool recycle);' from dba_indexes where owner||'.'||table_name in ( select p.owner||'.'||p.name from dba_tables t, dba_segments s, v$sqlarea a, (select distinct address, object_owner owner, object_name name from v$sql_plan where operation = 'TABLE ACCESS' and options = 'FULL') p where a.address = p.address and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') and t.buffer_pool <> 'RECYCLE' having s.blocks > 10000 group by p.owner, p.name, t.num_rows, s.blocks ) ; spool off; set lines 80; set pages 999; column avg_touches format 999 column myname heading 'Name' format a30 column mytype heading 'Type' format a10 column buffers format 999,999 select object_type mytype, object_name myname, blocks, COUNT(1) buffers, 100*(COUNT(1)/totsize) pct_cache from sys.x$bh a, dba_objects b, dba_segments s, (select value totsize from v$parameter where name = 'db_cache_size') where a.obj = b.object_id and tch=1 -- This line only works in 8.1.6 and above and b.object_name = s.segment_name and b.owner not in ('SYS','SYSTEM') group by object_type, object_name, blocks, totsize having 100*(COUNT(1)/totsize) > 5 ; break on begin_interval_time skip 2 column phyrds format 999,999,999 column begin_interval_time format a25 select begin_interval_time, filename, phyrds from dba_hist_filestatxs natural join dba_hist_snapshot ; set lines 80; set pages 999; column mydate heading 'Yr. Mo Dy Hr.' format a16 column c1 heading "execs" format 9,999,999 column c2 heading "Cache Misses|While Executing" format 9,999,999 column c3 heading "Library Cache|Miss Ratio" format 999.99999 break on mydate skip 2; select to_char(snap_time,'yyyy-mm-dd HH24') mydate, sum(new.pins-old.pins) c1, sum(new.reloads-old.reloads) c2, sum(new.reloads-old.reloads)/ sum(new.pins-old.pins) library_cache_miss_ratio from stats$librarycache old, stats$librarycache new, stats$snapshot sn where new.snap_id = sn.snap_id and old.snap_id = new.snap_id-1 and old.namespace = new.namespace group by to_char(snap_time,'yyyy-mm-dd HH24') ; set lines 80; set pages 999; column mydate heading 'Yr. Mo Dy Hr.' format a16 column c1 heading "execs" format 9,999,999 column c2 heading "Cache Misses|While Executing" format 9,999,999 column c3 heading "Library Cache|Miss Ratio" format 999.99999 break on mydate skip 2; select to_char(sn.end_interval_time,'yyyy-mm-dd HH24') mydate, sum(new.pins-old.pins) c1, sum(new.reloads-old.reloads) c2, sum(new.reloads-old.reloads)/ sum(new.pins-old.pins) library_cache_miss_ratio from dba_hist_librarycache old, dba_hist_librarycache new, dba_hist_snapshot sn where new.snap_id = sn.snap_id and old.snap_id = new.snap_id-1 and old.namespace = new.namespace group by to_char(sn.end_interval_time,'yyyy-mm-dd HH24') ; set lines 100 set pages 999 column c1 heading 'Pool |Size(M)' column c2 heading 'Size|Factor' column c3 heading 'Est|LC(M) ' column c4 heading 'Est LC|Mem. Obj.' column c5 heading 'Est|Time|Saved|(sec)' column c6 heading 'Est|Parse|Saved|Factor' column c7 heading 'Est|Object Hits' format 999,999,999 SELECT shared_pool_size_for_estimate c1, shared_pool_size_factor c2, estd_lc_size c3, estd_lc_memory_objects c4, estd_lc_time_saved c5, estd_lc_time_saved_factor c6, estd_lc_memory_object_hits c7 FROM v$shared_pool_advice; < pga_program_used_ram.sql col c1 heading 'Program|Name' format a30 col c2 heading 'PGA|Used|Memory' format 999,999,999 col c3 heading 'PGA|Allocated|Memory' format 999,999,999 col c4 heading 'PGA|Maximum|Memory' format 999,999,999 select program c1, pga_used_mem c2, pga_alloc_mem c3, pga_max_mem c4 from v$process order by c4 desc; column name format a40 column value format 999,999,999 select name, value from v$pgastat order by value desc; < pga_workareas.sql col c1 heading 'Workarea|Profile' format a35 col c2 heading 'Count' format 999,999,999 col c3 heading 'Percentage' format 99 select name c1, cnt c2, decode(total, 0, 0, round(cnt*100/total)) c3 from ( select name,value cnt,(sum(value) over ()) total from v$sysstat where name like 'workarea exec%' ); < show_pga_ram_details.sql select to_number(decode(SID, 65535, NULL, SID)) sid, operation_type OPERATION, trunc(WORK_AREA_SIZE/1024) WSIZE, trunc(EXPECTED_SIZE/1024) ESIZE, trunc(ACTUAL_MEM_USED/1024) MEM, trunc(MAX_MEM_USED/1024) "MAX MEM", number_passes PASS from v$sql_workarea_active order by 1,2; < track_hash_joins.sql select to_char( sn.begin_interval_time, 'yy-mm-dd hh24' ) snap_time, count(*) ct, sum(st.rows_processed_delta) row_ct, sum(st.disk_reads_delta) disk, sum(st.cpu_time_delta) cpu from dba_hist_snapshot sn, dba_hist_sqlstat st, dba_hist_sql_plan sp where st.snap_id = sn.snap_id and st.dbid = sn.dbid and st.instance_number = sn.instance_number and sp.sql_id = st.sql_id and sp.dbid = st.dbid and sp.plan_hash_value = st.plan_hash_value and sp.operation = 'HASH JOIN' group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') having count(*) > &hash_thr; < show_ram_plan.sql select operation, options, object_name name, trunc(bytes/1024/1024) "input(MB)", trunc(last_memory_used/1024) last_mem, trunc(estimated_optimal_size/1024) opt_mem, trunc(estimated_onepass_size/1024) onepass_mem, decode(optimal_executions, null, null, optimal_executions||'/'||onepass_executions||'/'|| multipasses_exections) "O/1/M" from v$sql_plan p, v$sql_workarea w where p.address=w.address(+) and p.hash_value=w.hash_value(+) and p.id=w.operation_id(+) and p.address='88BB460C'; select * from v$system_event where event like ‘%wait%’; select p1 "File #". p2 "Block #", p3 "Reason Code" from v$session_wait where event = 'buffer busy waits'; select owner, segment_name, segment_type from dba_extents where file_id = &P1 and &P2 between block_id and block_id + blocks -1; select object_name, statistic_name, value from V$SEGMENT_STATISTICS where object_name = 'SOURCE$'; select h.p3 "Reason Code", h.time_waited "Time Waited", o.object_name "Object", f.file_name "Datafile", h.current_block# "Block Waited" from v$active_session_history h, dba_objects o, dba_data_files f where h.event = 'buffer busy waits' and h.current_obj# = o.object_id and h.current_file# = f.file_id and h.session_state = 'WAITING'; Chapter 15 < block_count.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* Set serveroutput on DECLARE v_unformatted_blocks number; v_unformatted_bytes number; v_fs1_blocks number; v_fs1_bytes number; v_fs2_blocks number; v_fs2_bytes number; v_fs3_blocks number; v_fs3_bytes number; v_fs4_blocks number; v_fs4_bytes number; v_full_blocks number; v_full_bytes number; BEGIN dbms_space.space_usage ('SYSTEM', 'TEST', 'TABLE', v_unformatted_blocks, v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes, v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes); dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks); dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks); dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks); dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks); dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks); dbms_output.put_line('Full Blocks = '||v_full_blocks); end; The script yields the following output: Unformatted Blocks = 0 FS1 Blocks = 0 FS2 Blocks = 0 FS3 Blocks = 0 FS4 Blocks = 1 Full Blocks = 9 Where: FS1 means 0-25% free space within a block FS2 means 25-50% free space within a block FS3 means 50-75% free space within a block FS4 means 75-100% free space within a block < tsfrag.sql select tablespace_name, count(*) free_chunks, decode(round((max(bytes) / 1024000),2),null,0, round((max(bytes) / 1024000),2)) largest_chunk, nvl(round(sqrt(max(blocks)/sum(blocks))* (100/sqrt(sqrt(count(blocks)) )),2),0) fragmentation _index from sys.dba_free_space group by tablespace_name order by 2 desc, 1; < dffrag.sql select b.file_name, b.tablespace_name, nvl(round(sqrt(max(a.blocks)/ sum(a.blocks))*(100/sqrt(sqrt(count(a.blocks)) )),2),0) fragmentation_index, decode(c.inc,null,'no','yes') autoextend , count (*) free_chunks, decode ( round ((max (a.bytes) / 1024000), 2), null, 0, round ((max (a.bytes) / 1024000), 2)) largest_chunk from sys.dba_free_space a, sys.dba_data_files b, sys.filext$ c where b.tablespace_name = a.tablespace_name (+) and c.file# (+)= a.file_id and b.file_id = a.file_id (+) group by b.file_name, decode(c.inc,null,'no','yes'), b.tablespace_name order by 5 desc, 1; < tsmap.sql select 'free space' object_owner, ' ' object_type, ' ' object_name, file_id, block_id, bytes / 1024 size_kb, blocks from sys.dba_free_space where tablespace_name = '&tablespacename' union all select owner, segment_type, decode (partition_name,null,segment_name,segment_name || '.' || partition_name), file_id, block_id, bytes / 1024, blocks from sys.dba_extents where tablespace_name = '&tablespacename' order by 4,5; Chapter 16 < pctused.sql set heading off; set pages 9999; set feedback off; spool pctused.lst; define spare_rows = 2; define blksz = 8192; select ‘ alter table ‘||owner||’.’||table_name|| ‘ pctused ‘||least(round(100-((&spare_rows*avg_row_len)/(&blksz/10))),95)|| ‘ ‘|| ‘ pctfree ‘||greatest(round((&spare_rows*avg_row_len)/(&blksz/10)),5)|| ‘;’ from dba_tables where avg_row_len > 1 and avg_row_len < 2000 and table_name not in (select table_name from dba_tab_columns b where data_type in (‘RAW’,’LONG RAW’, ‘CLOB’, ‘BLOB’, ‘XMLTYPE’) ) order by owner, table_name ; spool off; column table_fetch_continued_row format 999,999,999 select to_char(snap_time,'yyyy-mm-dd hh24'), avg(newmem.value-oldmem.value)table_fetch_continued_row from perfstat.stats$sysstat oldmem, perfstat.stats$sysstat newmem, perfstat.stats$snapshot sn where snap_time > sysdate-&1 and newmem.snap_id = sn.snap_id and oldmem.snap_id = sn.snap_id-1 and oldmem.name = 'table fetch continued row' and newmem.name = 'table fetch continued row' and newmem.value-oldmem.value > 0 having avg(newmem.value-oldmem.value) > 10000 group by to_char(snap_time,'yyyy-mm-dd hh24'); < chained_row.sql -- ******************************************** -- This script relies on current CBO statistics -- ******************************************** spool chain.lst; set pages 9999; column c1 heading "Owner" format a9; column c2 heading "Table" format a12; column c3 heading "PCTFREE" format 99; column c4 heading "PCTUSED" format 99; column c5 heading "avg row" format 99,999; column c6 heading "Rows" format 999,999,999; column c7 heading "Chains" format 999,999,999; column c8 heading "Pct" format .99; set heading off; select 'Tables with migrated/chained rows and no BLOB columns.' from dual; set heading on; select owner c1, table_name c2, pct_free c3, pct_used c4, avg_row_len c5, num_rows c6, chain_cnt c7, chain_cnt/num_rows c8 from dba_tables where owner not in ('SYS','SYSTEM') and table_name not in (select table_name from dba_tab_columns where data_type in ('RAW','LONG RAW', 'BLOB', 'CLOB') ) and chain_cnt > 0 order by chain_cnt desc ; < awr_list_seg_block_space.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* drop type BlckFreeSpaceSet; drop type BlckFreeSpace; create type BlckFreeSpace as object ( seg_owner varchar2(30), seg_type varchar2(30), seg_name varchar2(100), fs1 number, fs2 number, fs3 number, fs4 number, fb number ); create type BlckFreeSpaceSet as table of BlckFreeSpace; create or replace function BlckFreeSpaceFunc (seg_owner IN varchar2, seg_type in varchar2 default null) return BlckFreeSpaceSet pipelined is outRec BlckFreeSpace := BlckFreeSpace(null,null,null,null,null,null,null,null); fs1_b number; fs2_b number; fs3_b number; fs4_b number; fs1_bl number; fs2_bl number; fs3_bl number; fs4_bl number; fulb number; fulbl number; u_b number; u_bl number; begin for rec in (select s.owner,s.segment_name,s.segment_type from dba_segments s where owner = seg_owner and segment_type = nvl(seg_type,segment_type) ) loop dbms_space.space_usage ( segment_owner => rec.owner, segment_name => rec.segment_name, segment_type => rec.segment_type, fs1_bytes => fs1_b, fs1_blocks => fs1_bl, fs2_bytes => fs2_b, fs2_blocks => fs2_bl, fs3_bytes => fs3_b, fs3_blocks => fs3_bl, fs4_bytes => fs4_b, fs4_blocks => fs4_bl, full_bytes => fulb, full_blocks => fulbl, unformatted_blocks => u_bl, unformatted_bytes => u_b ); outRec.seg_owner := rec.owner; outRec.seg_type := rec.segment_type; outRec.seg_name := rec.segment_name; outRec.fs1 := fs1_bl; outRec.fs2 := fs2_bl; outRec.fs3 := fs3_bl; outRec.fs4 := fs4_bl; outRec.fb := fulbl; Pipe Row (outRec); end loop; return; end; / col seg_owner heading 'Segment|Owner' format a10 col seg_type heading 'Segment|Type' format a10 col seg_name heading 'Segment|Name' format a30 col fs1 heading '0-25%|Free Space' format 9,999 col fs2 heading '25-50%|Free Space' format 9,999 col fs3 heading '50-75%|Free Space' format 9,999 col fs4 heading '75-100%|Free Space' format 9,999 col fb heading 'Full|Blocks' format 9,999 accept user_name prompt ‘Enter Segment Owner: ‘ break on seg_owner select * from Table ( BlckFreeSpaceFunc ('&user_name', 'TABLE' ) ) order by fs4 desc ; create cluster orders_cluster ( ordor_nbr number, ordor_date date, customer_nbr number sort ) hashkeys 10000 hash is ora_hash(customer_nbr) size 256; create table ordor ( ordor_nbr number, ordor_date date, customer_nbr number sort ) cluster ordor_cluster ( customer_nbr, transdate ); create table emp_ext ( empno number(4), ename varchar2(10), job varchar2(9), mgr number(4), hiredate date, sal number(7,2), comm number(7,2), deptno number(2) ) organization external ( type oracle_loader default directory testdir access parameters ( records delimited by newline fields terminated by ‘,’ ) location (‘emp_ext.csv’) ) reject limit 1000; ttitle 'Employee Salary|Cubic Rollup' col deptno heading 'Department|Number' col job heading 'Job|Title' col num_emps heading 'Number of|Employees' format 9,999 col sum_sal heading 'Total|Salary' format $99,999 select deptno, job, count(*) num_emps, sum(sal) sum_sal from emp_ext group by rollup ( deptno, job ); select bp.name pool_name, ob.name object, ob.subname sub_name, sum(buf_count) buffer_blocks from (select set_ds, obj, count(*) buf_count from x$bh group by set_ds, obj) bh, obj$ ob, x$kcbwds ws, v$buffer_pool bp where ob.dataobj# = bh.obj and ob.owner# > 0 and bh.set_ds = ws.addr and ws.set_id between bp.lo_setid and bp.hi_setid group by bp.name, ob.name, ob.subname order by bp.name, ob.name, ob.subname ; Chapter 17 col table_bytes format 999,999,999,999 col index_bytes format 999,999,999,999 select sum(bytes) table_bytes from user_segments where segment_type = 'TABLE'; select sum(bytes) index_bytes from user_segments where segment_type = 'INDEX'; < index_range_scans.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Option’ format a15 col c3 heading ‘Index|Usage|Count’ format 999,999 select p.object_name c1, p.options c2, count(1) c3 from dba_hist_sql_plan p, dba_hist_sqlstat s where p.object_owner <> 'SYS' and p.options like '%RANGE SCAN%' and p.operation like ‘%INDEX%’ and p.sql_id = s.sql_id group by p.object_name, p.operation, p.options order by 1,2,3; < busy_table_io.sql col c0 heading ‘Begin|Interval|time’ format a8 col c1 heading ‘Table|Name’ format a20 col c2 heading ‘Disk|Reads’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 select * from ( select to_char(s.begin_interval_time,'mm-dd hh24') c0, p.object_name c1, sum(t.disk_reads_total) c2, sum(t.rows_processed_total) c3, DENSE_RANK() OVER (PARTITION BY to_char(s.begin_interval_time,'mm-dd hh24') ORDER BY SUM(t.disk_reads_total) desc) AS rnk from dba_hist_sql_plan p, dba_hist_sqlstat t, dba_hist_snapshot s where p.sql_id = t.sql_id and t.snap_id = s.snap_id and p.object_type like '%TABLE%' group by to_char(s.begin_interval_time,'mm-dd hh24'), p.object_name order by c0 desc, rnk ) where rnk <= 5 ; < count_table_access.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Operation’ format a15 col c3 heading ‘Option’ format a15 col c4 heading ‘Object|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select p.object_name c1, p.operation c2, p.options c3, count(1) c4 from dba_hist_sql_plan p, dba_hist_sqlstat s where p.object_owner <> 'SYS' and p.sql_id = s.sql_id group by p.object_name, p.operation, p.options order by 1,2,3; Set heading off; Set pages 9999; Spool run_rebuild.sql; select 'alter index sapr3.'|| index_name|| ' rebuild tablespace '|| tablespace_name||';' from dba_indexes where owner = ‘SAPR3’; spool off; @run_rebuild The ALTER INDEX index_name REBUILD command is very safe way to rebuild indexes. Here is the syntax of the command: alter index index_name rebuild tablespace tablespace_name storage (initial new_initial next new_next freelists new_freelist_number ) create table emp_iot ( emp_id number, ename varchar2(20), sal number(9,2), deptno number, constraint pk_emp_iot_index primary key (emp_id) ) organization index tablespace demo_ts_01 pcthreshold 20 including ename ; < find_bif.sql set lines 2000; select sql_text, disk_reads, executions, parse_calls from v$sqlarea where lower(sql_text) like '% substr%' or lower(sql_text) like '% to_char%' or lower(sql_text) like '% decode%' order by disk_reads desc ; < awr_sql_index_access.sql col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Index|Range|Scans’ format 999,999 col c3 heading ‘Index|Unique|Scans’ format 999,999 col c4 heading ‘Index|Full|Scans’ format 999,999 select r.c1 c1, r.c2 c2, u.c2 c3, f.c2 c4 from ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%RANGE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) r, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%UNIQUE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) u, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) f where r.c1 = u.c1 and r.c1 = f.c1 ; < awr_count_index_details.sql col c1 heading ‘Begin|Interval|time’ format a20 col c2 heading ‘Search Columns’ format 999 col c3 heading ‘Invocation|Count’ format 99,999,999 break on c1 skip 2 accept idxname char prompt ‘Enter Index Name: ‘ ttitle ‘Invocation Counts for index|&idxname’ select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, p.search_columns c2, count(*) c3 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.object_name = ‘&idxname' group by begin_interval_time,search_columns; < index_range_scans.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Option’ format a15 col c3 heading ‘Index|Usage|Count’ format 999,999 select p.object_name c1, p.options c2, count(1) c3 from dba_hist_sql_plan p, dba_hist_sqlstat s where p.object_owner <> 'SYS' and p.options like '%RANGE SCAN%' and p.operation like ‘%INDEX%’ and p.sql_id = s.sql_id group by p.object_name, p.operation, p.options order by 1,2,3; < busy_table_io.sql col c0 heading ‘Begin|Interval|time’ format a8 col c1 heading ‘Table|Name’ format a20 col c2 heading ‘Disk|Reads’ format 99,999,999 col c3 heading ‘Rows|Processed’ format 99,999,999 select * from ( select to_char(s.begin_interval_time,'mm-dd hh24') c0, p.object_name c1, sum(t.disk_reads_total) c2, sum(t.rows_processed_total) c3, DENSE_RANK() OVER (PARTITION BY to_char(s.begin_interval_time,'mm-dd hh24') ORDER BY SUM(t.disk_reads_total) desc) AS rnk from dba_hist_sql_plan p, dba_hist_sqlstat t, dba_hist_snapshot s where p.sql_id = t.sql_id and t.snap_id = s.snap_id and p.object_type like '%TABLE%' group by to_char(s.begin_interval_time,'mm-dd hh24'), p.object_name order by c0 desc, rnk ) where rnk <= 5 ; < count_table_access.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Operation’ format a15 col c3 heading ‘Option’ format a15 col c4 heading ‘Object|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select p.object_name c1, p.operation c2, p.options c3, count(1) c4 from dba_hist_sql_plan p, dba_hist_sqlstat s where p.object_owner <> 'SYS' and p.sql_id = s.sql_id group by p.object_name, p.operation, p.options order by 1,2,3; < awr_sql_index_freq.sql col c1 heading ‘Object|Name’ format a30 col c2 heading ‘Operation’ format a15 col c3 heading ‘Option’ format a15 col c4 heading ‘Index|Usage|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select p.object_name c1, p.operation c2, p.options c3, count(1) c4 from dba_hist_sql_plan p, dba_hist_sqlstat s where p.object_owner <> 'SYS' and p.operation like ‘%INDEX%’ and p.sql_id = s.sql_id group by p.object_name, p.operation, p.options order by 1,2,3; < awr_access_counts.sql ttile ‘Table Access|Operation Counts|Per Snapshot Period’ col c1 heading ‘Begin|Interval|time’ format a20 col c2 heading ‘Operation’ format a15 col c3 heading ‘Option’ format a15 col c4 heading ‘Object|Count’ format 999,999 break on c1 skip 2 break on c2 skip 2 select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, p.operation c2, p.options c3, count(1) c4 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24'), p.operation, p.options order by 1,2,3; < awr_sql_index_access.sql col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Index|Range|Scans’ format 999,999 col c3 heading ‘Index|Unique|Scans’ format 999,999 col c4 heading ‘Index|Full|Scans’ format 999,999 select r.c1 c1, r.c2 c2, u.c2 c3, f.c2 c4 from ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%RANGE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) r, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%UNIQUE%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) u, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%INDEX%' and p.options like '%FULL%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) f where r.c1 = u.c1 and r.c1 = f.c1 ; < awr_sql_full_scans.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* col c1 heading ‘Begin|Interval|Time’ format a20 col c2 heading ‘Index|Table|Scans’ format 999,999 col c3 heading ‘Full|Table|Scans’ format 999,999 select i.c1 c1, i.c2 c2, f.c2 c3 from ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%TABLE ACCESS%' and p.options like '%INDEX%' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) i, ( select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, count(1) c2 from dba_hist_sql_plan p, dba_hist_sqlstat s, dba_hist_snapshot sn where p.object_owner <> 'SYS' and p.operation like '%TABLE ACCESS%' and p.options = 'FULL' and p.sql_id = s.sql_id and s.snap_id = sn.snap_id group by to_char(sn.begin_interval_time,'yy-mm-dd hh24') order by 1 ) f where i.c1 = f.c1 ; < find_full_scans.sql To download this script, please do a web search for “plan9i.sql” < get_sql.sql set lines 2000; select sql_text, disk_reads, executions, parse_calls from v$sqlarea where lower(sql_text) like '% page %' order by disk_reads desc ; < get_sub_optimal_cached_sql.sql set linesize 80 pagesize 80 trimspool on ttitle "Top 10 Expensive SQL | Consistent Gets per Rows Fetched" column sql_id heading "SQL ID" column c2 heading "Avg Gets per Row" column c3 heading "Total Gets" column c4 heading "Total Rows" select * from (select sq.sql_id, round(sum(buffer_gets_delta) / decode(sum(rows_processed_delta), 0, 1, sum(rows_processed_delta))) c2, sum(buffer_gets_delta) c3, sum(rows_processed_delta) c4 from dba_hist_snapshot sn, dba_hist_sqlstat sq, dba_hist_sqltext st where sn.snap_id = sq.snap_id and sn.dbid = sq.dbid and sn.instance_number = sq.instance_number and sn.dbid = st.dbid and sq.sql_id = st.sql_id and lower(sql_text) not like '%sum(%' and lower(sql_text) not like '%min(%' and lower(sql_text) not like '%max(%' and lower(sql_text) not like '%avg(%' and lower(sql_text) not like '%count(%' and sn.snap_id between &beginsnap and &endsnap and sq.parsing_schema_name not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') group by sq.sql_id order by 2 desc) where rownum < 11 / < awr_expensive_sql.sql set linesize 80 pagesize 80 trimspool on ttitle "Top 10 Expensive SQL | Disk Reads per Rows Fetched" column sql_id heading "SQL ID" column c2 heading "Avg Reads per Row" column c3 heading "Total Reads" column c4 heading "Total Rows" select * from (select sq.sql_id, round(sum(disk_reads_delta) / decode(sum(rows_processed_delta), 0, 1, sum(rows_processed_delta))) c2, sum(disk_reads_delta) c3, sum(rows_processed_delta) c4 from dba_hist_snapshot sn, dba_hist_sqlstat sq, dba_hist_sqltext st where sn.snap_id = sq.snap_id and sn.dbid = sq.dbid and sn.instance_number = sq.instance_number and sn.dbid = st.dbid and sq.sql_id = st.sql_id and lower(sql_text) not like '%sum(%' and lower(sql_text) not like '%min(%' and lower(sql_text) not like '%max(%' and lower(sql_text) not like '%avg(%' and lower(sql_text) not like '%count(%' and sn.snap_id between &beginsnap and &endsnap and sq.parsing_schema_name not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') group by sq.sql_id order by 2 desc) where rownum < 11 / < statspack_unused_indexes.sql ttitle "Unused Indexes by Time Period" col owner heading "Index Owner" format a30 col index_name heading "Index Name" format a30 set linesize 95 trimspool on pagesize 80 select * from (select owner, index_name from dba_indexes di where di.index_type != 'LOB' and owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') minus select index_owner owner, index_name from dba_constraints dc where index_owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') minus select p.object_owner owner, p.object_name index_name from stats$snapshot sn, stats$sql_plan p, stats$sql_summary st, stats$sql_plan_usage spu where st.sql_id = spu.sql_id and spu.plan_hash_value = p.plan_hash_value and st.hash_value = p.plan_hash_value and sn.snap_id = st.snap_id and sn.dbid = st.dbid and sn.instance_number = st.instance_number and sn.snap_id = spu.snap_id and sn.dbid = spu.snap_id and sn.instance_number = spu.instance_number and sn.snap_id between &begin_snap and &end_snap and p.object_type = 'INDEX' ) where owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') order by 1, 2 / < awr_unused_indexes.sql ttitle "Unused Indexes by Time Period" col owner heading "Index Owner" format a30 col index_name heading "Index Name" format a30 set linesize 95 trimspool on pagesize 80 select * from (select owner, index_name from dba_indexes di where di.index_type != 'LOB' minus select index_owner owner, index_name from dba_constraints dc minus select p.object_owner owner, p.object_name index_name from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and sn.dbid = st.dbid and sn.instance_number = st.instance_number and sn.snap_id between &begin_snap and &end_snap and p.object_type = 'INDEX' ) where owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN') order by 1, 2 / < awr_infrequent_indexes.sql ttitle "Infrequently-used indexes by month" col c1 heading "Month" format a20 col c2 heading "Index Owner" format a30 col c3 heading "Index Name" format a30 col c4 heading "Invocation|Count" format 99 set linesize 95 trimspool on pagesize 80 select to_char(sn.begin_interval_time,'Month') c1, p.object_owner c2, p.object_name c3, sum(executions_delta) c4 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and sn.dbid = st.dbid and sn.instance_number = st.instance_number and p.object_type = 'INDEX' and p.object_owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP') group by to_char(sn.begin_interval_time, 'Month'), p.object_owner, p.object_name having sum(executions_delta) < 50 order by 1, 4 desc, 2, 3 / < Find_duplicate_index_columns.sql set linesize 150 trimspool on pagesize 80 column index_owner format a20 column column_name format a30 column position format 9 column nextcol format a18 heading "Next Column Match?" select a.index_owner, a.column_name, a.index_name index_name1, b.index_name index_name2, a.column_position position, (select 'YES' from dba_ind_columns x, dba_ind_columns y where x.index_owner = a.index_owner and y.index_owner = b.index_owner and x.index_name = a.index_name and y.index_name = b.index_name and x.column_position = 2 and y.column_position = 2 and x.column_name = y.column_name) nextcol from dba_ind_columns a, dba_ind_columns b where a.index_owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP') and a.index_owner = b.index_owner and a.column_name = b.column_name and a.table_name = b.table_name and a.index_name != b.index_name and a.column_position = 1 and b.column_position = 1; < display_composite_index_columns.sql -- ******************************* -- Display composite indexes -- ******************************* break on index_name skip 1 col index_name format a30 col column_name format a30 select index_name, column_position, column_name from user_ind_columns i where (select count(*) from user_ind_columns u where u.index_name = i.index_name) > 1 group by index_name, column_position, column_name order by index_name, column_position; < display_composite_index_overall_usage.sql -- ********************************* -- Are composite indexes being used? -- ********************************* select to_char(sn.begin_interval_time,'yyyy-mm') c1, p.object_name c2, p.search_columns c3, count(*) from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where -- ************************************************** -- Only show data for multi-column composite indexes -- ************************************************** (select count(*) from user_ind_columns u where u.index_name = p.object_name) > 1 and st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.object_owner = 'PUBS' and -- ************************************************ -- This is supposed to just show the last 30 days -- ************************************************ sysdate > sysdate - 30 group by begin_interval_time, object_name, search_columns; Once we see if composite indexes are being used, we can drill-down an look at a list of all multi-column indexes. -- *********************************************** -- Show frequency of use of multi-column indexes -- *********************************************** with composite_index_name_list as (select i.index_name from user_ind_columns i where (select count(*) from user_ind_columns u where u.index_name = i.index_name) > 1 group by index_name order by index_name) select to_char(sn.begin_interval_time,'yyyy-mm') c1, p.object_name c2, p.search_columns c3, count(*) from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st, composite_index_name_list i where -- **************************************************** -- Only show multi-column indexes from the WITH clause -- **************************************************** i.index_name = p.object_name and st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.object_owner = 'PUBS' and -- ************************************************ -- only for the last 30 days . . . -- ************************************************ sysdate > sysdate - 30 group by begin_interval_time, object_name, search_columns; < display_composite_index_columns_invocation.sql col c1 heading ‘Begin|Interval|time’ format a20 col c2 heading ‘Search Columns’ format 999 col c3 heading ‘Invocation|Count’ format 99,999,999 break on c1 skip 2 accept idxname char prompt ‘Enter Index Name: ‘ ttitle ‘Invocation Counts for index|&idxname’ select to_char(sn.begin_interval_time,'yy-mm-dd hh24') c1, p.search_columns c2, count(*) c3 from dba_hist_snapshot sn, dba_hist_sql_plan p, dba_hist_sqlstat st where st.sql_id = p.sql_id and sn.snap_id = st.snap_id and p.object_name = ‘&idxname' group by begin_interval_time,search_columns; < find_sparse_indexes.sql select ‘exec analyzedb.reorg_a_table4(’||””||rtrim(t.table_owner)||””||’,'||””|| rtrim(t.table_name)||””||’);’, t.table_owner||’.'||t.table_name name, a.num_rows, sum(t.inserts) ins, sum(t.updates) upd, sum(t.deletes) del, sum(t.updates)+sum(t.inserts)+sum(t.deletes) tot_chgs, to_char((sum(t.deletes)/(decode(a.num_rows,0,1,a.num_rows)))*100.0,’999999.99′) per_del, round(((sum(t.updates)+sum(t.inserts)+sum(t.deletes))/(decode(a.num_rows,0,1,a.num_rows)) *100.0),2) per_chg from analyzedb.table_modifications t, all_tables a where t.timestamp >= to_date(’&from_date’,'dd-mon-yyyy’) and t.table_owner = a.owner and t.table_owner not in (’SYS’,'SYSTEM’) and t.table_name=a.table_name having (sum(t.deletes)/(decode(a.num_rows,0,1,a.num_rows)))*100.0 >=5 group by t.table_owner, t.table_name, a.num_rows order by num_rows desc, t.table_owner, t.table_name; select sum(a.time_waited_micro)/sum(a.total_waits)/1000000 c1, sum(b.time_waited_micro)/sum(b.total_waits)/1000000 c2, ( sum(a.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c3, ( sum(b.total_waits) / sum(a.total_waits + b.total_waits) ) * 100 c4, ( sum(b.time_waited_micro) / sum(b.total_waits)) / (sum(a.time_waited_micro)/sum(a.total_waits) ) * 100 c5 from dba_hist_system_event a, dba_hist_system_event b where a.snap_id = b.snap_id and a.event_name = 'db file scattered read' and b.event_name = 'db file sequential read'; Chapter 18 < session.sql script rem session.sql - displays all connected sessions set echo off; set termout on; set linesize 80; set pagesize 60; set newpage 0; select rpad(c.name||':',11)||rpad(' current logons='|| (to_number(b.sessions_current)),20)||'cumulative logons='|| rpad(substr(a.value,1,10),10)||'highwater mark='|| b.sessions_highwater Information from v$sysstat a, v$license b, v$database c where a.name = 'logons cumulative' ; ttitle "dbname Database|UNIX/Oracle Sessions"; set heading off; select 'Sessions on database '||substr(name,1,8) from v$database; set heading on; select substr(a.spid,1,9) pid, substr(b.sid,1,5) sid, substr(b.serial#,1,5) ser#, substr(b.machine,1,6) box, substr(b.username,1,10) username, -- b.server, substr(b.osuser,1,8) os_user, substr(b.program,1,30) program from v$session b, v$process a where b.paddr = a.addr and type='USER' order by spid; ttitle off; set heading off; select 'To kill, enter SQLPLUS> ALTER SYSTEM KILL SESSION', ''''||'SID, SER#'||''''||';' from dual; spool off; < awr_quick.ksh (partial) -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* spool rpt_last.lst set pages 9999; set feedback on; set verify off; column reads format 999,999,999 column writes format 999,999,999 select to_char(sn.end_interval_time,'yyyy-mm-dd HH24'), (newreads.value-oldreads.value) reads, (newwrites.value-oldwrites.value) writes from dba_hist_sysstat oldreads, dba_hist_sysstat newreads, dba_hist_sysstat oldwrites, dba_hist_sysstat newwrites, dba_hist_snapshot sn where newreads.snap_id = (select max(sn.snap_id) from dba_hist_snapshot) and newwrites.snap_id = (select max(sn.snap_id) from dba_hist_snapshot) and oldreads.snap_id = sn.snap_id-1 and oldwrites.snap_id = sn.snap_id-1 and oldreads.stat_name = 'physical reads' and newreads.stat_name = 'physical reads' and oldwrites.stat_name = 'physical writes' and newwrites.stat_name = 'physical writes' ; prompt *********************************************************** prompt This will identify any single file who's read I/O prompt is more than 10% of the total read I/O of the database. prompt prompt The "hot" file should be examined, and the hot table/index prompt should be identified using STATSPACK. prompt prompt - The busy file should be placed on a disk device with prompt "less busy" files to minimize read delay and channel prompt contention. prompt prompt - If small file has a hot small table, place the table prompt in the KEEP pool prompt prompt - If the file has a large-table full-table scan, place prompt the table in the RECYCLE pool and turn on parallel query prompt for the table. prompt *********************************************************** column mydate format a16 column file_name format a40 column reads format 999,999,999 select to_char(sn.end_interval_time,'yyyy-mm-dd HH24') mydate, new.filename file_name, new.phyrds-old.phyrds reads from dba_hist_filestatxs old, dba_hist_filestatxs new, dba_hist_snapshot snwhere sn.snap_id = (select max(snap_id) from dba_hist_snapshot) and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 and new.filename = old.filename --and -- new.phyrds-old.phyrds > 10000 and (new.phyrds-old.phyrds)*10 > ( select (newreads.value-oldreads.value) reads from dba_hist_sysstat oldreads, dba_hist_sysstat newreads, dba_hist_snapshot sn1 where sn.snap_id = sn1.snap_id and newreads.snap_id = sn.snap_id and oldreads.snap_id = sn.snap_id-1 and oldreads.stat_name = 'physical reads' and newreads.stat_name = 'physical reads' and (newreads.value-oldreads.value) > 0) ; prompt *********************************************************** prompt This will identify any single file who's write I/O prompt is more than 10% of the total write I/O of the database. prompt prompt The "hot" file should be examined, and the hot table/index prompt should be identified using STATSPACK. prompt prompt - The busy file should be placed on a disk device with prompt "less busy" files to minimize write delay and channel prompt channel contention. prompt prompt - If small file has a hot small table, place the table prompt in the KEEP pool prompt prompt *********************************************************** select 100 - 100 * (round((sum (decode (name, 'physical reads', value, 0)) - sum (decode (name, 'physical reads direct', value, 0))) / (sum (decode (name, 'db block gets', value, 1)) + sum (decode (name, 'consistent gets', value, 0))),3)) from sys.v_$sysstat where name in ('db block gets', 'consistent gets', 'physical reads', 'physical reads direct') < syswaits.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select event, total_waits, round(100 * (total_waits / sum_waits),2) pct_tot_waits, time_wait_sec, round(100 * (time_wait_sec / sum_secs),2) pct_secs_waits, total_timeouts, avg_wait_sec from (select event, total_waits, round((time_waited / 100),2) time_wait_sec, total_timeouts, round((average_wait / 100),2) avg_wait_sec from sys.v_$system_event where event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data to client ', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep') and event not like 'DFS%' and event not like 'KXFX%'), (select sum(total_waits) sum_waits, sum(round((time_waited / 100),2)) sum_secs from sys.v_$system_event where event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data to client ', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep') and event not like 'DFS%' and event not like 'KXFX%') order by 2 desc; < sesswaits.sql select b.sid, decode(b.username,NULL,c.name,b.username) process_name, event, a.a.total_waits, round((a.time_waited / 100),2) time_wait_sec,a.total_timeouts, round((average_wait / 100),2) average_wait_sec, round((a.max_wait / 100),2) max_wait_sec from sys.v_$session_event a, sys.v_$session b, sys.v_$bgprocess c where a.event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data to client ', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep' ) and a.event not like 'DFS%' and a.event not like 'KXFX%' and a.sid = b.sid and b.paddr = c.paddr (+) order by 4 desc; < csesswaits.sql select a.sid, decode(b.username,null,c.name,b.username) process_name, a.event, a.seconds_in_wait, a.wait_time, a.state, a.p1text, a.p1, a.p1raw, a.p2text, a.p2, a.p2raw, a.p3text, a.p3, a.p3raw from sys.v_$session_wait a, sys.v_$session b, sys.v_$bgprocess c where a.event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data to client ', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep' ) and a.event not like 'DFS%' and a.event not like 'KXFX%' and a.sid = b.sid and b.paddr = c.paddr (+) order by 4 desc; < objwaits.sql select sid, username, machine, program, b.owner, b.object_type, b.object_name, c.file_name from sys.v_$session a, sys.dba_objects b, sys.dba_data_files c where a.row_wait_obj# > 0 and a.row_wait_obj# = b.object_id and a.row_wait_file# = c.file_id order by sid; < spacesum.sql select tablespace_name, autoextend , round ((total_space / 1024 / 1024), 2) as total_space, round ((total_free_space / 1024 / 1024), 2) as total_free, round (((total_space - total_free_space) / 1024 / 1024), 2) as used_space, to_char ( nvl ( round ( (100 * sum_free_blocks / sum_alloc_blocks),2),0)) || '%' as pct_free from (select tablespace_name, max (autoextensible) autoextend, sum (blocks) sum_alloc_blocks, sum (bytes) as total_space from dba_data_files group by tablespace_name), (select b.tablespace_name fs_ts_name, nvl (sum (bytes), 0) as total_free_space, sum (blocks) as sum_free_blocks from dba_free_space a, dba_tablespaces b where a.tablespace_name (+) = b.tablespace_name group by b.tablespace_name, status) where tablespace_name = fs_ts_name union all select d.tablespace_name, autoextend, round ((a.bytes / 1024 / 1024), 2), round ((a.bytes / 1024 / 1024) - (nvl (t.bytes, 0) / 1024 / 1024), 2), round (nvl (t.bytes, 0) / 1024 / 1024, 2), to_char (100 - (nvl (t.bytes / a.bytes * 100, 0)), '990.00') from sys.dba_tablespaces d, (select tablespace_name, max (autoextensible) autoextend, sum (bytes) bytes from dba_temp_files group by tablespace_name) a, (select tablespace_name, sum (bytes_cached) bytes from sys.v_$temp_extent_pool group by tablespace_name) t where d.tablespace_name = a.tablespace_name (+) and d.tablespace_name = t.tablespace_name (+) and d.extent_management like 'LOCAL' and d.contents like 'TEMPORARY' order by 1; < datafileae.sql select b.file_name, b.tablespace_name, decode(c.inc,null,'no','yes') autoextend from sys.dba_data_files b, sys.filext$ c where c.file# (+)= b.file_id order by 2, 1; < maxext.sql select owner, decode(partition_name,NULL,segment_name,segment_name || '.' || partition_name) segment_name, segment_type, extents, max_extents, initial_extent, next_extent, tablespace_name from sys.dba_segments where max_extents - extents <= 5 and segment_type <> 'CACHE' order by 1,2,3; < objdef.sql select a.owner, a.segment_name, a.segment_type, a.tablespace_name, a.next_extent, max(c.bytes) max_contig_space from sys.dba_segments a, sys.dba_free_space c where a.tablespace_name = c.tablespace_name and a.next_extent > (select max(bytes) from sys.dba_free_space b where a.tablespace_name = b.tablespace_name and b.tablespace_name = c.tablespace_name) group by a.owner, a.segment_name, a.tablespace_name, a.segment_type, a.next_extent; < tabreorg.sql select /*+ RULE */ owner, segment_name table_name, segment_type, round(bytes/1024,2) table_kb, num_rows, blocks, empty_blocks, hwm highwater_mark, avg_used_blocks, greatest(round(100 * (nvl(hwm - avg_used_blocks,0) / greatest(nvl(hwm,1),1) ),2),0) block_inefficiency, chain_pct, max_extent_pct, extents, max_extents, decode(greatest(max_free_space - next_extent,0),0,'n','y') can_extend_space, next_extent, max_free_space, o_tablespace_name tablespace_name from (select a.owner owner, segment_name, segment_type, bytes, num_rows, a.blocks blocks, b.empty_blocks empty_blocks, a.blocks - b.empty_blocks - 1 hwm, decode(round((b.avg_row_len * num_rows * (1 + (pct_free/100))) / c.blocksize,0),0,1,round((b.avg_row_len * num_rows * (1 + (pct_free/100))) / c.blocksize,0)) + 2 avg_used_blocks, round(100 * (nvl(b.chain_cnt,0) / greatest(nvl(b.num_rows,1),1)),2) chain_pct, a.extents extents, round(100 * (a.extents / a.max_extents),2) max_extent_pct, a.max_extents max_extents, b.next_extent next_extent, b.tablespace_name o_tablespace_name from sys.dba_segments a, sys.dba_all_tables b, sys.ts$ c where ( a.owner = b.owner ) and ( segment_name = table_name ) and ( ( segment_type = 'TABLE' ) ) and b.tablespace_name = c.name union all select a.owner owner, segment_name || '.' || b.partition_name, segment_type, bytes, b.num_rows, a.blocks blocks, b.empty_blocks empty_blocks, a.blocks - b.empty_blocks - 1 hwm, decode(round((b.avg_row_len * b.num_rows * (1 + (b.pct_free/100))) / c.blocksize,0),0,1,round((b.avg_row_len * b.num_rows * (1 + (b.pct_free/100))) / c.blocksize,0)) + 2 avg_used_blocks, round(100 * (nvl(b.chain_cnt,0) / greatest(nvl(b.num_rows,1),1)),2) chain_pct, a.extents extents, round(100 * (a.extents / a.max_extents),2) max_extent_pct, a.max_extents max_extents, b.next_extent, b.tablespace_name o_tablespace_name from sys.dba_segments a, sys.dba_tab_partitions b, sys.ts$ c, sys.dba_tables d where ( a.owner = b.table_owner ) and ( segment_name = b.table_name ) and ( ( segment_type = 'TABLE PARTITION' ) ) and b.tablespace_name = c.name and d.owner = b.table_owner and d.table_name = b.table_name and a.partition_name = b.partition_name), ( select tablespace_name f_tablespace_name, max(bytes) max_free_space from sys.dba_free_space group by tablespace_name) where f_tablespace_name = o_tablespace_name and greatest(round(100 * (nvl(hwm - avg_used_blocks,0) / greatest(nvl(hwm,1),1) ),2),0) > 25 order by 10 desc, 1 asc,2 asc; < idxreorg.sql select /*+ RULE */ owner, segment_name index_name, segment_type, round(bytes/1024,2) index_kb, num_rows, clustering_factor, blevel, blocks, max_extent_pct, extents, max_extents, decode(greatest(max_free_space - next_extent,0),0,'n','y') can_extend_space, next_extent, max_free_space, o_tablespace_name from (select a.owner owner, segment_name, segment_type, bytes, num_rows, b.clustering_factor, b.blevel, a.blocks blocks, a.extents extents, round(100 * (a.extents / a.max_extents),2) max_extent_pct, a.max_extents max_extents, b.next_extent next_extent, b.tablespace_name o_tablespace_name from sys.dba_segments a, sys.dba_indexes b, sys.ts$ c where ( a.owner = b.owner ) and ( segment_name = index_name ) and ( ( segment_type = 'INDEX' ) ) and b.tablespace_name = c.name union all select a.owner owner, segment_name || '.' || b.partition_name, segment_type, bytes, b.num_rows, b.clustering_factor, b.blevel, a.blocks blocks, a.extents extents, round(100 * (a.extents / a.max_extents),2) max_extent_pct, a.max_extents max_extents, b.next_extent, b.tablespace_name o_tablespace_name from sys.dba_segments a, sys.dba_ind_partitions b, sys.ts$ c, sys.dba_indexes d where ( a.owner = b.index_owner ) and ( segment_name = b.index_name ) and ( ( segment_type = 'INDEX PARTITION' ) ) and b.tablespace_name = c.name and d.owner = b.index_owner and d.index_name = b.index_name and a.partition_name = b.partition_name), ( select tablespace_name f_tablespace_name, max(bytes) max_free_space from sys.dba_free_space group by tablespace_name) where f_tablespace_name = o_tablespace_name order by 1,2; < sgasize.sql select db_size_in_mb - db_caches db_buffers_in_mb, db_caches db_caches_mb, fixed_size_in_mb, lb_size_in_mb, sp_size_in_mb, lp_size_in_mb, jp_size_in_mb from (select round (max(a.bytes) / 1024 / 1024, 2) db_size_in_mb from sys.v_$sgastat a where (a.name = 'db_block_buffers ' or a.name = 'buffer_cache')), (select nvl(round (sum (b.value) / 1024 / 1024, 2),0) db_caches from sys.v_$parameter b where b.name like '%k_cache_size'), (select round (sum (b.bytes) / 1024 / 1024, 2) fixed_size_in_mb from sys.v_$sgastat b where b.name = 'fixed_sga'), (select round (sum (c.bytes) / 1024 / 1024, 2) lb_size_in_mb from sys.v_$sgastat c where c.name= 'log_buffer ' ), (select round (sum (d.value) / 1024 / 1024, 2) sp_size_in_mb from sys.v_$parameter d where d.name = 'shared_pool_size '), (select round (sum (e.value) / 1024 / 1024, 2) lp_size_in_mb from sys.v_$parameter e where e.name = 'large_pool_size ' ), (select round (sum (f.value) / 1024 / 1024, 2) jp_size_in_mb from sys.v_$parameter f where f.name = 'java_pool_size '); < memsnap.sql select buffer_hit_ratio, percent_shared_pool_free, lib_cache_hit_ratio, object_reloads, dd_cache_hit_ratio, redo_log_space_waits, redo_log_space_wait_time, mem_sort_ratio, parse_execute_ratio, buffer_busy_waits, latch_miss_ratio from (select 100 - 100 * (round ((sum (decode (name, 'physical reads', value, 0)) - sum (decode (name, 'physical reads direct', value, 0)) - sum (decode (name, 'physical reads direct (lob)', value, 0))) / (sum (decode (name, 'session logical reads', value, 1))),3)) buffer_hit_ratio from sys.v_$sysstat where name in ('session logical reads', 'physical reads direct (lob)', 'physical reads', 'physical reads direct')), (select round (100 * (free_bytes / shared_pool_size ), 2) percent_shared_pool_free from (select sum (bytes) free_bytes from sys.v_$sgastat where name = 'free memory' and pool = 'shared pool '), (select value shared_pool_size from sys.v_$parameter where name = 'shared_pool_size')), (select 100 - round ((sum (reloads) / sum (pins)) * 100, 2) lib_cache_hit_ratio from sys.v_$librarycache), (select 100 - round ((sum (getmisses) / (sum (gets) + sum (getmisses)) * 100), 2) dd_cache_hit_ratio from sys.v_$rowcache), (select round ( (100 * b.value) / decode ((a.value + b.value), 0, 1, (a.value + b.value)), 2)mem_sort_ratio from v$sysstat a, v$sysstat b where a.name = 'sorts (disk)' and b.name = 'sorts (memory)'), (select round(100 * (sum (sys.v_$latch.misses) / sum (sys.v_$latch.gets)),2) latch_miss_ratio from sys.v_$latch), (select round (100 * (a.value - b.value) / decode (a.value, 0, 1, a.value), 2) parse_execute_ratio from sys.v_$sysstat a, sys.v_$sysstat b where a.name = 'execute count' and b.name = 'parse count (hard)'), (select nvl(sum(total_waits),0) buffer_busy_waits from sys.v_$system_event a, sys.v_$event_name b where a.event = 'buffer busy waits' and a.event (+) = b.name), (select sum(reloads) object_reloads from sys.v_$librarycache), (select value redo_log_space_waits from sys.v_$sysstat where name = 'redo log space requests'), (select value redo_log_space_wait_time from sys.v_$sysstat where name = 'redo log space wait time'); < poolhit.sql select name, 100 * (1 - (physical_reads / (db_block_gets + consistent_gets))) hit_ratio from sys.v$buffer_pool_statistics where db_block_gets + consistent_gets > 0; < sesshitrate.sql select b.sid sid, decode (b.username,null,e.name,b.username) user_name, d.spid os_id, b.machine machine_name, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') logon_time, 100 - 100 * (round ((sum (decode (c.name, 'physical reads', value, 0)) - sum (decode (c.name, 'physical reads direct', value, 0)) – sum(decode (c.name, 'physical reads direct (lob)', value, 0))) / (sum (decode (c.name, 'db block gets', value, 1)) + sum (decode (c.name, 'consistent gets', value, 0))),3)) hit_ratio from sys.v_$sesstat a, sys.v_$session b, sys.v_$statname c, sys.v_$process d, sys.v_$bgprocess e where a.statistic#=c.statistic# and b.sid=a.sid and d.addr = b.paddr and e.paddr (+) = b.paddr and c.name in ('physical reads', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)', 'db block gets', 'consistent gets') group by b.sid, d.spid, decode (b.username,null,e.name,b.username), b.machine, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') order by 6 desc; < sqlhitrate.sql select sql_text , b.username , 100 - round(100 * a.disk_reads/greatest(a.buffer_gets,1),2) hit_ratio from sys.v_$sqlarea a, sys.all_users b where a.parsing_user_id=b.user_id and b.username not in ('SYS','SYSTEM') order by 3 desc; < cacheobjcnt.sql select decode(cachehint, 0, 'default', 1, 'keep', 2, 'recycle', null) cache, count(*) objects from sys.seg$ s where s.user# in (select user# from sys.user$ where name not in ('sys','system')) group by decode(cachehint, 0, 'default', 1, 'keep', 2, 'recycle', null) order by 1; < buffutl.sql select 'free' buffer_state, nvl(sum(blocksize) / 1024 ,0) amt_kb from sys.x$bh a, sys.ts$ b where state = 0 and a.ts# = b.ts# union all select 'read/mod' buffer_state, nvl(sum(blocksize) / 1024 ,0) amt_kb from sys.x$bh a, sys.ts$ b where state = 1 and a.ts# = b.ts# union all select 'read/notmod', nvl(sum(blocksize) / 1024 ,0) amt_kb from sys.x$bh a, sys.ts$ b where state = 2 and a.ts# = b.ts# union all select 'being read' buffer_state, nvl(sum(blocksize) / 1024 ,0) amt_kb from sys.x$bh a, sys.ts$ b where state = 3 and a.ts# = b.ts# order by 1; < libdet.sql select namespace, gets, round(gethitratio*100,2) gethitratio, pins, round(pinhitratio*100,2) pinhitratio, reloads, invalidations from sys.v_$librarycache order by 1; < libwait.sql select b.name, nvl(max(a.total_waits),0) from sys.v_$system_event a, sys.v_$event_name b where a.event (+) = b.name and b.name in ('latch free ','library cache load lock', 'library cache lock','library cache pin') group by b.name < libobj.sql select owner, name, type, sharable_mem, loads, executions, locks, pins, kept from sys.v_$db_object_cache order by type asc; < dictdet.sql select parameter, usage, gets, getmisses, 100 - round((getmisses/ (gets + getmisses) * 100),2) hit_ratio from sys.v_$rowcache where gets + getmisses <> 0 order by 5 desc; < memhog.sql select sid, username, round(total_user_mem/1024,2) mem_used_in_kb, round(100 * total_user_mem/total_mem,2) mem_percent from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_mem from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('session pga memory','session uga memory') group by b.sid, nvl(b.username,p.name)), (select sum(value) total_mem from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name in ('session pga memory','session uga memory')) order by 3 desc; < bufobjwaits.sql select owner, object_name, object_type, value waits from sys.v_$segment_statistics where (statistic_name = 'buffer busy waits' and value > 0) order by 1,2; < latchdet.sql select name, gets, round(misses*100/decode(gets,0,1,gets),2) misses, round(spin_gets*100/decode(misses,0,1,misses),2) spins, immediate_gets igets, round(immediate_misses*100/ decode(immediate_gets,0,1,immediate_gets),2) imisses, sleeps from sys.v_$latch order by 2 desc; < currlwaits.sql select a.sid, username, a.event, a.p1text, a.p1, a.p2text, a.p2, a.seq#, a.wait_time, a.state from sys.v_$session_wait a, sys.v_$session b, sys.v_$latchname c where a.sid = b.sid and a.p2 = c.latch# and a.event in (select name from sys.v_$event_name where name like '%latch%') order by 1; < globiostats.sql select name, value from sys.v_$sysstat where name in ('consistent changes', 'consistent gets', 'db block changes', 'db block gets', 'physical reads', 'physical writes', 'sorts (disk)', 'user commits', 'user rollbacks' ) order by 1; < syswaits.sql select event, total_waits, round(100 * (total_waits / sum_waits),2) pct_waits, time_wait_sec, round(100 * (time_wait_sec / greatest(sum_time_waited,1)),2) pct_time_waited, total_timeouts, round(100 * (total_timeouts / greatest(sum_timeouts,1)),2) pct_timeouts, average_wait_sec from (select event, total_waits, round((time_waited / 100),2) time_wait_sec, total_timeouts, round((average_wait / 100),2) average_wait_sec from sys.v_$system_event where event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'rdbms ipc reply', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data from client', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep') and event not like 'DFS%' and event not like 'KXFX%'), (select sum(total_waits) sum_waits, sum(total_timeouts) sum_timeouts, sum(round((time_waited / 100),2)) sum_time_waited from sys.v_$system_event where event not in ('lock element cleanup ', 'pmon timer ', 'rdbms ipc message ', 'rdbms ipc reply', 'smon timer ', 'SQL*Net message from client ', 'SQL*Net break/reset to client ', 'SQL*Net message to client ', 'SQL*Net more data from client', 'dispatcher timer ', 'Null event ', 'parallel query dequeue wait ', 'parallel query idle wait - Slaves ', 'pipe get ', 'PL/SQL lock timer ', 'slave wait ', 'virtual circuit status ', 'WMON goes to sleep') and event not like 'DFS%' and event not like 'KXFX%') order by 2 desc, 1 asc; < globaccpatt.sql select name, value from sys.v_$sysstat where name in ('table scans (cache partitions)', 'table scans (direct read)', 'table scans (long tables)', 'table scans (rowid ranges)', 'table scans (short tables)', 'table fetch by rowid', 'table fetch continued row ') order by 1; < fileio.sql select d.name file_name, c.name tablespace_name, b.phyrds, b.phywrts, b.phyblkrd, b.phyblkwrt, b.readtim, b.writetim from sys.v_$datafile a, sys.v_$filestat b, sys.ts$ c, sys.v_$dbfile d, sys.file$ e where a.file# = b.file# and a.file# = d.file# and e.ts# = c.ts# and e.file# = d.file# union all select v.fnnam file_name, c.name tablespace_name, b.phyrds, b.phywrts, b.phyblkrd, b.phyblkwrt, b.readtim, b.writetim from sys.v_$tempfile a, sys.v_$tempstat b, sys.ts$ c, sys.x$kccfn v, sys.x$ktfthc hc where a.file# = b.file# and a.file# = hc.ktfthctfno and hc.ktfthctsn = c.ts# and v.fntyp = 7 and v.fnnam is not null and v.fnfno = hc.ktfthctfno and hc.ktfthctsn = c.ts# order by 3 desc; < toptables.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select table_owner "table owner", table_name "table name", command "command issued", 0 - executions "executions", disk_reads "disk reads", gets "buffer gets", rows_processed "rows processed" from (select distinct executions, command, table_owner, table_name, gets, rows_processed, disk_reads from (select decode (a.command_type , 2, 'insert ' , 3,'select ', 6, 'update ' , 7, 'delete ' , 26,'table lock ') command , c.owner table_owner, c.name table_name , sum(a.disk_reads) disk_reads , sum(0 - a.executions) executions , sum(a.buffer_gets) gets , sum(a.rows_processed) rows_processed from sys.v_$sql a , sys.v_$object_dependency b , sys.v_$db_object_cache c where a.command_type in (2,3,6,7,26)and b.from_address = a.address and b.to_owner = c.owner and b.to_name= c.name and c.type = 'table' and c.owner not in ('SYS','SYSTEM') group by a.command_type , c.owner , c.name ) ) where rownum <= 100; < largescan.sql select table_owner, table_name, table_type, size_kb, statement_count, reference_count, executions, executions * reference_count total_scans from (select a.object_owner table_owner, a.object_name table_name, b.segment_type table_type, b.bytes / 1024 size_kb, sum(c.executions ) executions, count( distinct a.hash_value ) statement_count, count( * ) reference_count from sys.v_$sql_plan a, sys.dba_segments b, sys.v_$sql c where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type IN ('TABLE', 'TABLE PARTITION') and a.operation LIKE '%TABLE%' and a.options = 'FULL' and a.hash_value = c.hash_value and b.bytes / 1024 > 1024 group by a.object_owner, a.object_name, a.operation, b.bytes / 1024, b.segment_type order by 4 desc, 1, 2 ); < physpctio.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select sid, username, round(100 * total_user_io/total_io,2) tot_io_pct from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_io from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('physical reads', 'physical writes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)') group by b.sid, nvl(b.username,p.name)), (select sum(value) total_io from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name in ('physical reads', 'physical writes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)')) order by 3 desc; < totpctio.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* SELECT SID, USERNAME, ROUND(100 * TOTAL_USER_IO/TOTAL_IO,2) TOT_IO_PCT FROM (SELECT b.SID SID, nvl(b.USERNAME,p.NAME) USERNAME, SUM(VALUE) TOTAL_USER_IO FROM sys.V_$STATNAME c, sys.V_$SESSTAT a, sys.V_$SESSION b, sys.v_$bgprocess p WHERE a.STATISTIC#=c.STATISTIC# and p.paddr (+) = b.paddr and b.SID=a.SID and c.NAME in ('physical reads','physical writes', 'consistent changes','consistent gets', 'db block gets','db block changes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)') GROUP BY b.SID, nvl(b.USERNAME,p.name)), (select sum(value) TOTAL_IO from sys.V_$STATNAME c, sys.V_$SESSTAT a WHERE a.STATISTIC#=c.STATISTIC# and c.NAME in ('physical reads','physical writes', 'consistent changes', 'consistent gets','db block gets', 'db block changes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)')) ORDER BY 3 DESC; < topiousers.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select b.sid sid, decode (b.username,null,e.name,b.username) user_name, d.spid os_id, b.machine machine_name, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') logon_time, (sum(decode(c.name,'physical reads',value,0)) + sum(decode(c.name,'physical writes',value,0)) + sum(decode(c.name, 'physical writes direct',value,0)) + sum(decode(c.name, 'physical writes direct (lob)',value,0)) + sum(decode(c.name, 'physical reads direct (lob)',value,0)) + sum(decode(c.name, 'physical reads direct',value,0))) total_physical_io, (sum(decode(c.name,'db block gets',value,0)) + sum(decode(c.name, 'db block changes',value,0)) + sum(decode(c.name,'consistent changes',value,0)) + sum(decode(c.name,'consistent gets',value,0)) ) total_logical_io, 100 – 100 *(round ((sum (decode (c.name, 'physical reads', value, 0)) – sum (decode (c.name, 'physical reads direct', value, 0))) / (sum (decode (c.name, 'db block gets', value, 1)) + sum (decode (c.name, 'consistent gets', value, 0))),3)) hit_ratio, sum(decode(c.name,'sorts (disk)',value,0)) disk_sorts, sum(decode(c.name,'sorts (memory)',value,0)) memory_sorts, sum(decode(c.name,'sorts (rows)',value,0)) rows_sorted, sum(decode(c.name,'user commits',value,0)) commits, sum(decode(c.name,'user rollbacks',value,0)) rollbacks, sum(decode(c.name,'execute count',value,0)) executions, sum(decode(c.name,'physical reads',value,0)) physical_reads, sum(decode(c.name,'db block gets',value,0)) db_block_gets, sum(decode(c.name,'consistent gets',value,0)) consistent_gets, sum(decode(c.name,'consistent changes',value,0)) consistent_changes from sys.v_$sesstat a, sys.v_$session b, sys.v_$statname c, sys.v_$process d, sys.v_$bgprocess e where a.statistic#=c.statistic# and b.sid=a.sid and d.addr = b.paddr and e.paddr (+) = b.paddr and c.name in ('physical reads', 'physical writes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)', 'db block gets', 'db block changes', 'consistent changes', 'consistent gets', 'sorts (disk)', 'sorts (memory)', 'sorts (rows)', 'user commits', 'user rollbacks', 'execute count' ) group by b.sid, d.spid, decode (b.username,null,e.name,b.username), b.machine, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') order by 6 desc; < bgact.sql select name, value from sys.v_$sysstat where (name like '%DBWR %' or name in ('dirty buffers inspected', 'summed dirty queue length', 'write requests')) or (name like '%redo%') order by 1; < archhist.sql select to_char(completion_time,'mm/dd/yy') completion_time, count(*) log_count from sys.v_$archived_log where sysdate - completion_time < 31 group by to_char(completion_time,'mm/dd/yy') order by 1 desc; < rolldet.sql select name, round ((rssize / 1024), 2) size_kb, shrinks, extends, gets, waits, writes, xacts, status, round ((hwmsize / 1024), 2) hw_kb from sys.v_$rollstat a, sys.v_$rollname b where (a.usn = b.usn) order by name; < totuserspace.sql select owner, round((byte_count / 1024 / 1024),2) space_used_mb, round(100 * (byte_count / tot_bytes),2) pct_of_database from (select owner , sum(bytes) as byte_count from sys.dba_segments where segment_type not in ('TEMPORARY','CACHE') group by owner order by 2 desc), (select sum(bytes) as tot_bytes from sys.dba_segments); < sortusage.sql select tablespace_name, current_users, total_extents, used_extents, free_extents, max_used_size, max_sort_size from sys.v_$sort_segment order by 1; < sortdet.sql select sql_text, sid, c.username, machine, tablespace, extents, blocks from sys.v_$sort_usage a, sys.v_$sqlarea b, sys.v_$session c where a.sqladdr = b.address and a.sqlhash = b.hash_value and a.session_addr = c.saddr order by sid; < topsess.sql select 'top physical i/o process' category, sid, username, total_user_io amt_used, round(100 * total_user_io/total_io,2) pct_used from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_io from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('physical reads','physical writes', 'physical reads direct', 'physical reads direct (lob)', 'physical writes direct', 'physical writes direct (lob)') group by b.sid, nvl(b.username,p.name) order by 3 desc), (select sum(value) total_io from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name in ('physical reads','physical writes', 'physical reads direct', 'physical reads direct (lob)', 'physical writes direct', 'physical writes direct (lob)')) where rownum < 2 union all select 'top logical i/o process', sid, username, total_user_io amt_used, round(100 * total_user_io/total_io,2) pct_used from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_io from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('consistent gets','db block gets') group by b.sid, nvl(b.username,p.name) order by 3 desc), (select sum(value) total_io from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name in ('consistent gets','db block gets')) where rownum < 2 union all select 'top memory process', sid, username, total_user_mem, round(100 * total_user_mem/total_mem,2) from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_mem from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('session pga memory','session uga memory') group by b.sid, nvl(b.username,p.name) order by 3 desc), (select sum(value) total_mem from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name in ('session pga memory','session uga memory') ) where rownum < 2 union all select 'top cpu process', sid, username, total_user_cpu, round(100 * total_user_cpu/greatest(total_cpu,1),2) from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_cpu from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name = 'CPU used by this session' group by b.sid, nvl(b.username,p.name) order by 3 desc), (select sum(value) total_cpu from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name = 'CPU used by this session' ) where rownum < 2; < topsessdet.sql -- ************************************************* -- Copyright © 2005 by Rampant TechPress -- This script is free for non-commercial purposes -- with no warranties. Use at your own risk. -- -- To license this script for a commercial purpose, -- contact info@rampant.cc -- ************************************************* select * from (select b.sid sid, decode (b.username,null,e.name,b.username) user_name, d.spid os_id, b.machine machine_name, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') logon_time, (sum(decode(c.name,'physical reads',value,0)) + sum(decode(c.name,'physical writes',value,0)) + sum(decode(c.name,'physical writes direct',value,0)) + sum(decode(c.name,'physical writes direct (lob)',value,0)) + sum(decode(c.name,'physical reads direct (lob)',value,0)) + sum(decode(c.name,'physical reads direct',value,0))) total_physical_io, (sum(decode(c.name,'db block gets',value,0)) + sum(decode(c.name,'db block changes',value,0)) + sum(decode(c.name,'consistent changes',value,0)) + sum(decode(c.name,'consistent gets',value,0)) ) total_logical_io, 100 - 100 * (round ((sum (decode (c.name, 'physical reads', value, 0)) - sum (decode (c.name, 'physical reads direct', value, 0))) / (sum (decode (c.name, 'db block gets', value, 1)) + sum (decode (c.name, 'consistent gets', value, 0)) ),3)) hit_ratio, (sum(decode(c.name,'session pga memory',value,0))+ sum(decode(c.name,'session uga memory',value,0)) ) total_memory_usage, sum(decode(c.name,'parse count (total)',value,0)) parses, sum(decode(c.name,'CPU used by this session',value,0)) total_cpu, sum(decode(c.name,'parse time cpu',value,0)) parse_cpu, sum(decode(c.name,'recursive cpu usage',value,0)) recursive_cpu, sum(decode(c.name,'CPU used by this session',value,0)) - sum(decode(c.name,'parse time cpu',value,0)) - sum(decode(c.name,'recursive cpu usage',value,0)) other_cpu, sum(decode(c.name,'sorts (disk)',value,0)) disk_sorts, sum(decode(c.name,'sorts (memory)',value,0)) memory_sorts, sum(decode(c.name,'sorts (rows)',value,0)) rows_sorted, sum(decode(c.name,'user commits',value,0)) commits, sum(decode(c.name,'user rollbacks',value,0)) rollbacks, sum(decode(c.name,'execute count',value,0)) executions, sum(decode(c.name,'physical reads',value,0)) physical_reads, sum(decode(c.name,'db block gets',value,0)) db_block_gets, sum(decode(c.name,'consistent gets',value,0)) consistent_gets, sum(decode(c.name,'consistent changes',value,0)) consistent_changes from sys.v_$sesstat a, sys.v_$session b, sys.v_$statname c, sys.v_$process d, sys.v_$bgprocess e where a.statistic#=c.statistic# and b.sid=a.sid and d.addr = b.paddr and e.paddr (+) = b.paddr and c.name in ('physical reads', 'physical writes', 'physical writes direct', 'physical reads direct', 'physical writes direct (lob)', 'physical reads direct (lob)', 'db block gets', 'db block changes', 'consistent changes', 'consistent gets', 'session pga memory', 'session uga memory', 'parse count (total)', 'CPU used by this session', 'parse time cpu', 'recursive cpu usage', 'sorts (disk)', 'sorts (memory)', 'sorts (rows)', 'user commits', 'user rollbacks', 'execute count' ) group by b.sid, d.spid, decode (b.username,null,e.name,b.username), b.machine, to_char(logon_time,'mm/dd/yy hh:mi:ss pm') order by 6 desc); < userscans.sql select sid, username, total_user_scans, round(100 * total_user_scans/total_scans,2) pct_scans from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_scans from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name = 'table scans (long tables)' group by b.sid, nvl(b.username,p.name) order by 3 desc), (select sum(value) total_scans from sys.v_$statname c, sys.v_$sesstat a where a.statistic#=c.statistic# and c.name = 'table scans (long tables)'); < scatwait.sql select b.sid, nvl(b.username,c.name) username, b.machine, a.total_waits, round((a.time_waited / 100),2) time_wait_sec,a.total_timeouts, round((average_wait / 100),2) average_wait_sec, round((a.max_wait / 100),2) max_wait_sec from sys.v_$session_event a, sys.v_$session b, sys.v_$bgprocess c where a.event = 'db file scattered read ' and a.sid = b.sid and c.paddr (+) = b.paddr order by 3 desc, 1 asc; < large_scanusers.sql select c.username username, count(a.hash_value) scan_count from sys.v_$sql_plan a, sys.dba_segments b, sys.dba_users c, sys.v_$sql d where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type in ('TABLE', 'TABLE PARTITION') and a.operation like '%TABLE%' and a.options = 'FULL' and c.user_id = d.parsing_user_id and d.hash_value = a.hash_value and b.bytes / 1024 > 1024 group by c.username order by 2 desc; < lockcnt.sql select count(*) from sys.v_$session where lockwait is not null; The return of any non-zero number indicates a current blocking lock situation and can be investigated further by running this query: select a.username blocked_user, b.username blocking_user, w.sid waiting_session, h.sid holding_session, w.type, decode(h.lmode, 1,'no lock', 2,'row share', 3,'row exclusive', 4,'share', 5,'share row exclusive', 6,'exclusive','none') lmode, decode(w.request, 1,'no lock', 2,'row share', 3,'row exclusive', 4,'share', 5,'share row exclusive', 6,'exclusive','none') request, a.row_wait_row# row_waited_on, w.id1, w.id2, w.ctime blocked_user_wait_secs, u1.name || '.' || t1.name locked_object from sys.v_$lock w, sys.v_$lock h, sys.v_$session a, sys.v_$session b, sys.v_$locked_object o, sys.user$ u1, sys.obj$ t1 where h.lmode != 0 and w.request != 0 and w.type = h.type and w.id1 = h.id1 and w.id2 = h.id2 and b.sid = h.sid and a.sid = w.sid and h.sid = o.session_id and o.object_id = t1.obj# and u1.user# = t1.owner# order by 4,3; < curriosql.sql select sid, username, sql_text from sys.v_$sqltext a, sys.v_$session b where b.sql_address = a.address and b.sid = (select sid from (select b.sid sid, nvl(b.username,p.name) username, sum(value) total_user_io from sys.v_$statname c, sys.v_$sesstat a, sys.v_$session b, sys.v_$bgprocess p where a.statistic#=c.statistic# and p.paddr (+) = b.paddr and b.sid=a.sid and c.name in ('physical reads','physical writes', 'physical reads direct', 'physical reads direct (lob)', 'physical writes direct', 'physical writes direct (lob)') group by b.sid, nvl(b.username,p.name) order by 3 desc) where rownum < 2) order by a.piece; < cartsession.sql select username, count(distinct c.hash_value) nbr_stmts from sys.v_$sql a, sys.dba_users b, sys.v_$sql_plan c where a.parsing_user_id = b.user_id and options = 'cartesian' and operation like '%join%' and a.hash_value = c.hash_value group by username order by 2 desc; < cartsql.sql select * from sys.v_$sql where hash_value in (select hash_value from sys.v_$sql_plan where options = 'CARTESIAN' and operation LIKE '%JOIN%' ) order by hash_value; < topsql.sql select sql_text , username , disk_reads_per_exec, buffer_gets_per_exec, buffer_gets , disk_reads, parse_calls , sorts , executions , loads, rows_processed , hit_ratio, first_load_time , sharable_mem , persistent_mem , runtime_mem, cpu_time_secs, cpu_time_secs_per_execute, elapsed_time_secs, elapsed_time_secs_per_execute, address, hash_value from (select sql_text , b.username , round((a.disk_reads/ decode(a.executions,0,1,a.executions)),2) disk_reads_per_exec, a.disk_reads , a.buffer_gets , round((a.buffer_gets/ decode(a.executions,0,1,a.executions)),2) buffer_gets_per_exec, a.parse_calls , a.sorts , a.executions , a.loads, a.rows_processed , 100 - round(100 * a.disk_reads/ greatest(a.buffer_gets,1),2) hit_ratio, a.first_load_time , sharable_mem , persistent_mem , runtime_mem, round(cpu_time / 1000000,3) cpu_time_secs, round((cpu_time / 1000000)/ decode(a.executions,0,1,a.executions),3) cpu_time_secs_per_execute, round(elapsed_time / 1000000,3) elapsed_time_secs, round((elapsed_time / 1000000)/decode(a.executions,0,1,a.executions),3) elapsed_time_secs_per_execute, address, hash_value from sys.v_$sqlarea a, sys.all_users b where a.parsing_user_id=b.user_id and b.username not in ('SYS','SYSTEM') order by 3 desc) where rownum < 21; < tabscan.sql select sql_text, total_large_scans, executions, executions * total_large_scans sum_large_scans from (select sql_text, count(*) total_large_scans, executions from sys.v_$sql_plan a, sys.dba_segments b, sys.v_$sql c where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type in ('TABLE', 'TABLE PARTITION') and a.operation like '%TABLE%' and a.options = 'FULL' and c.hash_value = a.hash_value and b.bytes / 1024 > 1024 group by sql_text, executions) order by 4 desc; < planstats.sql select operation, options, object_owner, object_name, executions, last_output_rows, last_cr_buffer_gets, last_cu_buffer_gets, last_disk_reads, last_disk_writes, last_elapsed_time from sys.v_$sql_plan a, sys.v_$sql_plan_statistics b where a.sql_id = b.sql_id and a.id = b.operation_id and a.sql_id = '&sql_id' order by a.id; < tabscan.sql select table_owner, table_name, table_type, size_kb, statement_count, reference_count, executions, executions * reference_count total_scans from (select a.object_owner table_owner, a.object_name table_name, b.segment_type table_type, b.bytes / 1024 size_kb, sum(c.executions ) executions, count( distinct a.hash_value ) statement_count, count( * ) reference_count from sys.v_$sql_plan a, sys.dba_segments b, sys.v_$sql c where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type in ('TABLE', 'TABLE PARTITION') and a.operation like '%TABLE%' and a.options = 'FULL' and a.hash_value = c.hash_value and b.bytes / 1024 > 1024 group by a.object_owner, a.object_name, a.operation, b.bytes / 1024, b.segment_type order by 4 desc, 1, 2 ); < unused_indx.sql select distinct a.object_owner table_owner, a.object_name table_name, b.segment_type table_type, b.bytes / 1024 size_kb, d.index_name from sys.v_$sql_plan a, sys.dba_segments b, sys.dba_indexes d where a.object_owner (+) = b.owner and a.object_name (+) = b.segment_name and b.segment_type in ('TABLE', 'TABLE PARTITION') and a.operation like '%TABLE%' and a.options = 'FULL' and b.bytes / 1024 > 1024 and b.segment_name = d.table_name and b.owner = d.table_owner order by 1, 2; < ash_spikes.sql select to_char(round(subline.sample_time, ‘HH24′), ‘YYYY-MM-DD HH24:MI’) as sample_hour, round(avg(subline.on_cpu),1) as cpu_avg, round(avg(subline.waiting),1) as wait_avg, round(avg(subline.active_sessions),1) as act_avg, round((variance(subline.active_sessions)/avg(subline.active_sessions)),1) as act_var_mean from ( select sample_id, sample_time, sum(decode(session_state, ‘ON CPU’, 1, 0)) as on_cpu, sum(decode(session_state, ‘WAITING’, 1, 0)) as waiting, count(*) as active_sessions from dba_hist_active_sess_history where sample_time > sysdate – (&hours/24) group by sample_id, sample_time ) subline group by round(subline.sample_time, ‘HH24′) order by round(subline.sample_time, ‘HH24′); < session_waits.sql select se.event, sum(se.total_waits), sum(se.total_timeouts), sum(se.time_waited/100) time_waited from v$session_event se, v$session sess where sess.username = 'SAPR3' and sess.sid = se.sid group by se.event order by 2 DESC; < ash_user_wait_time.sql select s.sid, s.username, sum(h.wait_time + h.time_waited ) "total wait time" from v$active_session_history h, v$session s, v$event_name e where h.session_id = s.sid and e.event_id = h.event_id and e.wait_class <> 'Idle' and s.username IS NOT NULL group by s.sid, s.username order by 3; < ash_event_rollup.sql title 'High waits on events|Rollup by hour' column mydate heading 'Yr. Mo Dy Hr' format a13; column event format a30; column total_waits heading 'tot waits' format 999,999; column time_waited heading 'time wait' format 999,999; column total_timeouts heading 'timeouts' format 9,999; break on to_char(snap_time,'yyyy-mm-dd') skip 1; select to_char(e.sample_time,'yyyy-mm-dd HH24') mydate, e.event, count(e.event) total_waits, sum(e.time_waited) time_waited from v$active_session_history e where e.event not like '%timer' and e.event not like '%message%' and e.event not like '%slave wait%' having count(e.event) > 100 group by to_char(e.sample_time,'yyyy-mm-dd HH24'), e.event order by 1 ; < ash_object_wait_time.sql select o.owner, o.object_name, o.object_type, sum(h.wait_time + h.time_waited ) "total wait time" from v$active_session_history h, dba_objects o, v$event_name e where h.current_obj# = o.object_id and e.event_id = h.event_id and e.wait_class <> 'Idle' group by o.owner, o.object_name, o.object_type order by 4 DESC; < hot_files_ash.sql select f.file_name “Data File”, count(*) “Wait Number”, sum(h.time_waited) “Total Time Waited” from v$active_session_history h, dba_data_files f where h.current_file# = f.file_id group by f.file_name order by 3 desc < events_waits_hr_ash.sql select h.event "Wait Event", sum(h.wait_time + h.time_waited) "Total Wait Time" from v$active_session_history h, v$event_name e where h.sample_time between sysdate - 1/24 and sysdate and h.event_id = e.event_id and e.wait_class <> 'Idle' group by h.event order by 2 desc < ash_sql_counts.sql col c1 heading “invocation|count” format 9,999 col c2 heading “percentage|of|load” format 99 select sql_id, count(*) c1, round(count(*)/sum(count(*)) over (), 2) c2 from v$active_session_history where sample_time > sysdate - 1/24/60 and session_type <> ‘BACKGROUND’ group by sql_id order by count(*) desc; < ash_sql_waiting_io.sql select ash.sql_id, count(*) from v$active_session_history ash, v$event_name evt where ash.sample_time > sysdate – 1/24/60 and ash.session_state = ‘WAITING’ and ash.event_id = evt.event_id and evt.wait_class = ‘User I/O’ group by sql_id order by count(*) desc; < ash_high_wait_events.sql ttitle 'High waits on events|Rollup by hour' column mydate heading 'Yr. Mo Dy Hr' format a13; column event format a30; column total_waits heading 'tot waits' format 999,999; column time_waited heading 'time wait' format 999,999; column total_timeouts heading 'timeouts' format 9,999; break on to_char(snap_time,'yyyy-mm-dd') skip 1; select to_char(e.sample_time,'yyyy-mm-dd HH24') mydate, e.event, count(e.event) total_waits, sum(e.time_waited) time_waited from v$active_session_history e where e.event not like '%timer' and e.event not like '%message%' and e.event not like '%slave wait%' having count(e.event) > 100 group by to_char(e.sample_time,'yyyy-mm-dd HH24'), e.event order by 1 ; < ash_count_table_usage.sql select h.sql_id, count(*) from dba_hist_active_sess_history h, v$sql s where h.sql_id = s.sql_id and s.sql_fulltext like ‘%orders%’ having count(*) > 1 group by h.sql_id order by 2 desc; < session_wait_history_events.sql select swh.seq# seq_nbr, sess.sid sid, sess.username username, swh.event event, swh.p1, swh.p2 from v$session sess, v$session_wait_history swh where sess.sid = 74 and sess.sid = swh.sid order by swh.seq#; < ash_display_table_index_wait_counts.sql set pages 999 set lines 80 break on snap_time skip 2 col snap_time heading 'Snap|Time' format a20 col file_name heading 'File|Name' format a40 col object_type heading 'Object|Type' format a10 col object_name heading 'Object|Name' format a20 col wait_count heading 'Wait|Count' format 999,999 col time heading 'Time' format 999,999 select to_char(begin_interval_time,'yyyy-mm-dd hh24:mi') snap_time, -- file_name, object_type, object_name, wait_count, time from dba_hist_waitstat wait, dba_hist_snapshot snap, dba_hist_active_sess_history ash, dba_data_files df, dba_objects obj where wait.snap_id = snap.snap_id and wait.snap_id = ash.snap_id and df.file_id = ash.current_file# and obj.object_id = ash.current_obj# and wait_count > 50 order by to_char(begin_interval_time,'yyyy-mm-dd hh24:mi'), file_name ; < ash_cpu_foregound_events.sql select TO_CHAR(h.sample_time,'HH24') "Hour", Sum(h.wait_time/100) "Total Wait Time (Sec)" from v$active_session_history h, v$event_name n where h.session_state = 'ON CPU' and h.session_type = 'FOREGROUND' and h.event_id = n.EVENT_ID and n.wait_class <> 'Idle' group by TO_CHAR(h.sample_time,'HH24'); < ash_cpu_foregound_events_dow.sql select TO_CHAR(h.sample_time,'Day') "Hour", sum(h.wait_time/100) "Total Wait Time (Sec)" from v$active_session_history h, v$event_name n where h.session_state = 'ON CPU' and h.session_type = 'FOREGROUND' and h.event_id = n.EVENT_ID and n.wait_class <> 'Idle' group by TO_CHAR(h.sample_time,'Day'); < ash_total_event_wait_time.sql select h.event "Wait Event", SUM(h.wait_time/100) "Wait Time (Sec)" from v$active_session_history h, v$event_name n where h.session_state = 'ON CPU' and h.session_type = 'FOREGROUND' and h.event_id = n.EVENT_ID and to_char(h.sample_time,'HH24') = '12' and n.wait_class <> 'Idle' group by h.event order by 2 DESC; < ash_datafile_waits.sql select f.file_name “Data File”, COUNT(*) “Wait Number”, SUM(h.time_waited) “Total Time Waited” from v$active_session_history h, dba_data_files f where h.current_file# = f.file_id group by f.file_name order by 3 DESC; select e.name "Wait Event", sum(h.wait_time + h.time_waited) "Total Wait Time" from v$active_session_history h, v$event_name e where h.event_id = e.event_id and e.wait_class <> 'Idle' group by e.name order by 2 DESC; select s.sid, s.username, sum(h.wait_time + h.time_waited) "total wait time" from v$active_session_history h, v$session s, v$event_name e where h.session_id = s.sid and e.event_id = h.event_id and e.wait_class <> 'Idle' and s.username IS NOT NULL group by s.sid, s.username order by 3; < ash_object_wait_time.sql select o.owner, o.object_name, o.object_type, SUM(h.wait_time + h.time_waited) "total wait time" from v$active_session_history h, dba_objects o, v$event_name e where h.current_obj# = o.object_id and e.event_id = h.event_id and e.wait_class <> 'Idle' group by o.owner, o.object_name, o.object_type order by 4 DESC;
Search This Blog
Total Pageviews
Wednesday, 30 October 2024
RamPant scripts
From RamPant web
Subscribe to:
Posts (Atom)
Oracle DBA
anuj blog Archive
- ► 2011 (362)