REM REM Author: Mohit Dubey REM Visit http://www.geocities.com/md_seraphin for more goodies! REM REM This program is distributed under the GNU Public License Version 2 REM with the additional privisio that the original author's name and REM contact details must be retained as-is in any modified or copied REM versions of this program. REM set lines 132 termout off echo off feedback off sqlnumber off sqlprompt "" trimspool on escape \ column owner format a10 heading 'Owner' column segment_name format a30 heading 'Segment Name' column tablespace_name format a18 heading 'Tablespace Name' column segment_type format a10 heading 'Type' column bytes format 999,999,999,990 heading 'Size' column extents format 990 heading 'Exts' column next_extent format 999,999,990 heading 'Next' column pct_increase format 990 heading 'PCT' column ratio format 90.999 heading 'Ratio' column count format 9,990 heading 'Count' column addr format 9,990 heading 'Addr' column indx format 9,990 heading 'Indx' column gets format 999,999,990 heading 'Gets' column waits format 999,999,990 heading 'Waits' column bytes format 9,999,999,990 heading 'Bytes' column value format 9,999,999,990 heading 'Value' column total_gets format 99,999,990 heading 'Total Gets' column misses format 99,999,990 heading 'Misses' column immediate_gets format 999,999,990 heading 'Immediate|Gets' column immediate_misses format 999,999,990 heading 'Immediate|Misses' column class format A24 heading 'Class' column name format A24 heading 'Name' column phyrds format 999,999,990 heading 'Physical|Reads' column phywrts format 999,999,990 heading 'Physical|Writes' column CACHE# format 99,999,990 heading 'Cache No' column TYPE format A11 heading 'Type' column SUBORDINATE# format 99,999,990 heading 'Subordinate No' column PARAMETER format A20 heading 'Parameter' column COUNT format 99,999,990 heading 'Count' column USAGE format 99,999,990 heading 'Usage' column FIXED format 99,999,990 heading 'Fixed' column GETMISSES format 9,999,990 heading 'Get|Misses' column SCANS format 9,999,990 heading 'Scans' column SCANMISSES format 9,999,990 heading 'Scan|Misses' column SCANCOMPLETES format 9,999,990 heading 'Scan|Completes' column MODIFICATIONS format 9,999,990 heading 'Modifications' column FLUSHES format 99,999,990 heading 'Flushes' column sum(pins) format 999,999,990 heading 'Executions' column sum(value) format 999,999,999,990 heading 'Total Value' column sum(reloads) format 999,999,990 heading 'Cache misses|while executing' break on today column today new_value _date column dbnam new_value _dbname select to_char(sysdate,'dd Mon yyyy hh24:mi:ss') today, name dbnam from v$database; set echo off feedback off termout off header on ttitle off pages 0 spool dbstat.log PROMPT PROMPT ***************************************************************** PROMPT * Tuning: SGA Statistics select name, sgasize/1024/1024 "Allocated (M)", bytes/1024 "Free (K)", round(bytes/sgasize*100, 2) "% Free" from (select sum(bytes) sgasize from v$sgastat) s, v$sgastat f where f.name = 'free memory'; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: buffer cache select 'Buffer Hit Ratio' "Statistic", (1-(p.value/(d.value+c.value)))*100 ratio from v$sysstat d,v$sysstat c,v$sysstat p where d.name ='db block gets' and c.name ='consistent gets' and p.name ='physical reads'; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: library cache select 'Library Cache ' "Statistic",sum(pins) "Pins", sum(reloads) "Reloads" , (sum(reloads)*100) / sum(pins) "Ratio" from v$librarycache group by 'Library Cache '; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: library cache hash table size select least(8, ceil(log(2, ceil(count(*) / 509)))) "INDEX" from -- sys.x$kglob o sys.p_x$kglob o where o.inst_id = userenv('Instance') and o.kglhdadr = o.kglhdpar; PROMPT PROMPT ***************************************************************** PROMPT * INFORMATIONAL: "HOT" latches column object_name format a60 select /*+ ordered */ l.child# latch#, o.kglnaobj object_name from ( select count(*) latches, avg(sleeps) sleeps from v$latch_children where name = 'library cache' ) a, v$latch_children l, ( select s.buckets * power( 2, least( 8, ceil(log(2, ceil(count(*) / s.buckets))) ) ) buckets from ( select decode(y.ksppstvl, 0, 509, 1, 1021, 2, 2039, 3, 4093, 4, 8191, 5, 16381, 6, 32749, 7, 65521, 8, 131071, 509 ) buckets from -- sys.x$ksppi x, -- sys.x$ksppcv y sys.p_x$ksppi x, sys.p_x$ksppcv y where x.inst_id = userenv('Instance') and y.inst_id = userenv('Instance') and x.ksppinm = '_kgl_bucket_count' and y.indx = x.indx ) s, -- sys.x$kglob c sys.p_x$kglob c where c.inst_id = userenv('Instance') and c.kglhdadr = c.kglhdpar group by s.buckets ) b, -- sys.x$kglob o sys.p_x$kglob o where l.name = 'library cache' and l.sleeps > 2 * a.sleeps and mod(mod(o.kglnahsh, b.buckets), a.latches) + 1 = l.child# and o.inst_id = userenv('Instance') and o.kglhdadr = o.kglhdpar; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: data dictionary cache break on report set pages 40 compute sum of gets on report compute sum of getmisses on report select parameter , gets , getmisses , scans , scanmisses from v$rowcache where getmisses !=0 or scanmisses !=0 ; clear break break on report compute sum of phyrds on report compute sum of phywrts on report column name format A38 heading 'Name' PROMPT PROMPT ***************************************************************** PROMPT * INFORMATIONAL: Disk I/O select name , phyrds , phywrts from v$datafile df , v$filestat fs where df.file# = fs.file# order by name; PROMPT * PROMPT * Waits by file... SELECT name, count -- FROM x$kcbfwait, v$datafile FROM sys.p_x$kcbfwait, v$datafile WHERE indx + 1 = file#; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: Rollback Segment Contention select class , count from v$waitstat where upper(class) like '%UNDO%'; PROMPT PROMPT ***************************************************************** PROMPT * INFORMATIONAL: Total requests for Data select sum(value) from v$sysstat where name in ('db block gets','consistent gets'); PROMPT PROMPT ***************************************************************** PROMPT * INFORMATIONAL: Dynamic extension SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME='RECURSIVE CALLS' ; column name format A24 heading 'Name' PROMPT PROMPT ***************************************************************** PROMPT * Tuning: Free List Contention select class , count waits from v$waitstat where class = 'free list'; PROMPT PROMPT ***************************************************************** PROMPT * Tuning: Redo Log Contention column name format A24 heading 'Name' select name , value from v$sysstat where name ='redo log space requests'; PROMPT PROMPT ***************************************************************** PROMPT * Redo Log Buffer Latches select name latch_name, gets, misses, round(decode(gets-misses,0,1,gets-misses)/ decode(gets,0,1,gets),3) hit_ratio from v$latch where name = 'redo allocation'; column latch_name format a20 select name latch_name, immediate_gets, immediate_misses, round(decode(immediate_gets-immediate_misses,0,1, immediate_gets-immediate_misses)/ decode(immediate_gets,0,1,immediate_gets),3) hit_ratio from v$latch where name = 'redo copy'; PROMPT PROMPT * Current values for associated parameters are: column name format a30 column value format a10 select name,value from v$parameter where name in ('log_small_entry_max_size','log_simultaneous_copies', 'cpu_count'); PROMPT PROMPT * INFORMATIONAL: Redo log buffer latches PROMPT * Two types of latches control the access of the log buffer, PROMPT * 'redo allocation latch' and 'redo copy latch'. select ln.name , gets ,misses , immediate_gets , immediate_misses from v$latch l , v$latchname ln where ln.name in ( 'redo allocation' , 'redo copy' ) and ln.latch# = l.latch#; col value format 999,999,999,999 PROMPT PROMPT ***************************************************************** PROMPT * Tuning: Sort Areas select name , value from v$sysstat where name in ('sorts (memory)' , 'sorts (disk)'); PROMPT PROMPT * The number of disk sorts that have been performed, their average size, PROMPT * and the peak number of concurrent disk sorts are as below... column average_size format a12 select /*+ ordered */ s.disk_sorts, decode(s.disk_sorts, 0, 'n/a', lpad( ceil((nvl(w1.kwrites, 0) + nvl(w2.kwrites, 0)) / s.disk_sorts) || 'K', 12 ) ) average_size, least(s.disk_sorts, p.peak) peak_concurrent from ( select value disk_sorts from v$sysstat where name = 'sorts (disk)' ) s, ( select /*+ ordered */ sum(i.kcfiopbw * e.febsz) / 1024 kwrites from ( select distinct tempts# from -- sys.user$ sys.p_user$ where type# = 1 ) u, -- sys.file$ f, -- sys.x$kcfio i, -- sys.x$kccfe e sys.p_file$ f, sys.p_x$kcfio i, sys.p_x$kccfe e where i.inst_id = userenv('Instance') and e.inst_id = userenv('Instance') and f.ts# = u.tempts# and i.kcfiofno = f.file# and e.fenum = i.kcfiofno ) w1, ( select /*+ ordered use_nl(h) */ sum(i.kcftiopbw * e.tfbsz) / 1024 kwrites from ( select distinct tempts# from -- sys.user$ sys.p_user$ where type# = 1 ) u, -- sys.x$ktfthc h, -- sys.x$kcftio i, -- sys.x$kcctf e sys.p_x$ktfthc h, sys.p_x$kcftio i, sys.p_x$kcctf e where h.inst_id = userenv('Instance') and i.inst_id = userenv('Instance') and e.inst_id = userenv('Instance') and h.ktfthctsn = u.tempts# and i.kcftiofno = h.ktfthctfno and e.tfnum = i.kcftiofno ) w2, ( select /*+ ordered */ sum(l.max_utilization) peak from ( select /*+ ordered */ distinct t.contents$ from ( select distinct tempts# from -- sys.user$ sys.p_user$ where type# = 1 ) u, -- sys.ts$ t sys.p_ts$ t where t.ts# = u.tempts# ) y, v$resource_limit l where (y.contents$ = 0 and l.resource_name = 'temporary_table_locks') or (y.contents$ = 1 and l.resource_name = 'sort_segment_locks') ) p; select username, sid, ktssoses sess_addr, ktssosno sess_num, prev_sql_addr sqladdr, prev_hash_value sqlhash, ktssotsn tablespace, decode(ktssocnt, 0, 'PERMANENT', 1, 'TEMPORARY' ) type, decode(ktssosegt, 1, 'SORT', 2, 'HASH', 3, 'DATA', 4, 'INDEX', 5, 'LOB_DATA', 6, 'LOB_INDEX' , 'UNDEFINED' ) segtype, ktssofno segfile#, ktssobno segblock#, ktssoexts extents, ktssoblks blocks, ktssorfno segrelf# from -- sys.x$ktsso, sys.p_x$ktsso, v$session where ktssoses = v$session.saddr and ktssosno = v$session.serial# -- and sys.x$ktsso.inst_id = sys_context('userenv','instance') and sys.p_x$ktsso.inst_id = sys_context('userenv','instance'); PROMPT break on owner skip 1 on segment_type skip 1 set autocommit on pages 1000 create table calc_space (tablespace_name,space,type) as select tablespace_name,sum(bytes) ,'Allocated' from dba_data_files group by tablespace_name; insert into calc_space select tablespace_name,sum(bytes) , 'Free' from dba_free_space group by tablespace_name; ttitle '**>> Fragmentation report for '_dbname' on '_date set lines 75 pages 66 head on feed off select owner,segment_type,segment_name,extents,bytes from dba_segments where extents > 2 and owner not like 'SYS%' order by 1,2,3; ttitle '**>> Report on Data File Sizes for '_dbname' on '_date break on tablespace_name skip 1 column type format a10 heading 'Type' column space format 9,999,999,990 heading 'Space' column allocated format 9,999,999,990 heading 'Space' column free format 9,999,999,990 heading 'Space' select tablespace_name , type,space from calc_space order by 1,2; clear break ttitle '**>> Report on Actual Space Used for '_dbname' on '_date break on owner skip 1 column segment_type format a15 select owner,tablespace_name,segment_type,sum(bytes) "Bytes" from dba_segments group by owner,tablespace_name,segment_type; drop table calc_space; ttitle '**>> Report on tables with Increase > 0% for '_dbname' on '_date select owner,segment_name,segment_type,pct_increase,extents,next_extent from dba_segments where pct_increase > 0 and owner not like 'SYS%' order by 1,2; column owner format a10 heading 'Owner' column object_type format a21 heading 'Object Type' column status format a10 heading 'Status' column total format 99990 heading 'No|Obj' break on owner skip 1 ttitle '**>> Reconciliation report for '_dbname' on '_date select owner,object_type,status,count(*) "total" from dba_objects group by owner,object_type,status; ttitle '**>> Constraint Status Report for '_dbname' on '_date select owner,CONSTRAINT_TYPE,status,count(*) from dba_constraints group by owner,CONSTRAINT_TYPE,status; spool off set sqlnumber on sqlprompt "SQL>" set pages 40 head on feed on echo on lines 120 termout on exit;