Session Statistics
Here are some scripts related to Session Statistics .
Session I/O By User
SESSION I/O BY USER NOTES:
select nvl(ses.USERNAME,'ORACLE PROC') username, OSUSER os_user, PROCESS pid, ses.SID sid, SERIAL#, PHYSICAL_READS, BLOCK_GETS, CONSISTENT_GETS, BLOCK_CHANGES, CONSISTENT_CHANGES from v$session ses, v$sess_io sio where ses.SID = sio.SID order by PHYSICAL_READS, ses.USERNAME
CPU Usage By Session
CPU USAGE BY SESSION NOTES:
select nvl(ss.USERNAME,'ORACLE PROC') username, se.SID, VALUE cpu_usage from v$session ss, v$sesstat se, v$statname sn where se.STATISTIC# = sn.STATISTIC# and NAME like '%CPU used by this session%' and se.SID = ss.SID order by VALUE desc
Resource Usage By User
RESOURCE USAGE BY USER NOTES:
select ses.SID, nvl(ses.USERNAME,'ORACLE PROC') username, sn.NAME statistic, sest.VALUE from v$session ses, v$statname sn, v$sesstat sest where ses.SID = sest.SID and sn.STATISTIC# = sest.STATISTIC# and sest.VALUE is not null and sest.VALUE != 0 order by ses.USERNAME, ses.SID, sn.NAME
Session Stats By Session
SESSION STAT NOTES:
select nvl(ss.USERNAME,'ORACLE PROC') username, se.SID, sn.NAME stastic, VALUE usage from v$session ss, v$sesstat se, v$statname sn where se.STATISTIC# = sn.STATISTIC# and se.SID = ss.SID and se.VALUE > 0 order by sn.NAME, se.SID, se.VALUE desc
Cursor Usage By Session
CURSOR USAGE BY SESSION NOTES:
select user_process username, "Recursive Calls", "Opened Cursors", "Current Cursors" from ( select nvl(ss.USERNAME,'ORACLE PROC')||'('||se.sid||') ' user_process, sum(decode(NAME,'recursive calls',value)) "Recursive Calls", sum(decode(NAME,'opened cursors cumulative',value)) "Opened Cursors", sum(decode(NAME,'opened cursors current',value)) "Current Cursors" from v$session ss, v$sesstat se, v$statname sn where se.STATISTIC# = sn.STATISTIC# and (NAME like '%opened cursors current%' or NAME like '%recursive calls%' or NAME like '%opened cursors cumulative%') and se.SID = ss.SID and ss.USERNAME is not null group by nvl(ss.USERNAME,'ORACLE PROC')||'('||se.SID||') ' ) orasnap_user_cursors order by USER_PROCESS,"Recursive Calls"
User Hit Ratios
USER HIT RATIO NOTES:
=================================================================================
select USERNAME, CONSISTENT_GETS, BLOCK_GETS, PHYSICAL_READS, ((CONSISTENT_GETS+BLOCK_GETS-PHYSICAL_READS) / (CONSISTENT_GETS+BLOCK_GETS)) Ratio from v$session, v$sess_io where v$session.SID = v$sess_io.SID and (CONSISTENT_GETS+BLOCK_GETS) > 0 and USERNAME is not null order by ((CONSISTENT_GETS+BLOCK_GETS-PHYSICAL_READS) / (CONSISTENT_GETS+BLOCK_GETS))
Full Table Scans
Here are some scripts related to Full Table Scans .
System Statistics (Table)
SYSTEM STATISTICS (TABLE) NOTES:
select NAME, VALUE from v$sysstat where NAME like '%table'
Process Table Scans
PROCESS TABLE SCAN NOTES:
select ss.username||'('||se.sid||') ' "User Process", sum(decode(name,'table scans (short tables)',value)) "Short Scans", sum(decode(name,'table scans (long tables)', value)) "Long Scans", sum(decode(name,'table scan rows gotten',value)) "Rows Retreived" from v$session ss, v$sesstat se, v$statname sn where se.statistic# = sn.statistic# and (name like '%table scans (short tables)%' or name like '%table scans (long tables)%' or name like '%table scan rows gotten%') and se.sid = ss.sid and ss.username is not null group by ss.username||'('||se.sid||') '
Process Table Scans (Avg)
PROCESS TABLE SCAN (AVERAGE) NOTES:
select ss.username||'('||se.sid||') ' "User Process", sum(decode(name,'table scans (short tables)',value)) "Short Scans", sum(decode(name,'table scans (long tables)', value)) "Long Scans", sum(decode(name,'table scan rows gotten',value)) "Rows Retreived", round((sum(decode(name,'table scan rows gotten',value)) - (sum(decode(name,'table scans (short tables)',value)) * 5)) / (sum(decode(name,'table scans (long tables)', value))),2) "Long Scans Length" from v$session ss, v$sesstat se, v$statname sn where se.statistic# = sn.statistic# and (name like '%table scans (short tables)%' or name like '%table scans (long tables)%' or name like '%table scan rows gotten%') and se.sid = ss.sid and ss.username is not null group by ss.username||'('||se.sid||') ' having sum(decode(name,'table scans (long tables)', value)) != 0 order by 3 desc
=======================================================================
Shared Pool Information
Here are some scripts related to Shared Pool Information .
Quick Check
SHARED POOL QUICK CHECK NOTES:
select 'You may need to increase the SHARED_POOL_RESERVED_SIZE' Description, 'Request Failures = '||REQUEST_FAILURES Logic from v$shared_pool_reserved where REQUEST_FAILURES > 0 and 0 != ( select to_number(VALUE) from v$parameter where NAME = 'shared_pool_reserved_size') union select 'You may be able to decrease the SHARED_POOL_RESERVED_SIZE' Description, 'Request Failures = '||REQUEST_FAILURES Logic from v$shared_pool_reserved where REQUEST_FAILURES < 5 and 0 != ( select to_number(VALUE) from v$parameter where NAME = 'shared_pool_reserved_size')
Memory Usage
SHARED POOL MEMORY USAGE NOTES:
select OWNER, NAME||' - '||TYPE object, SHARABLE_MEM from v$db_object_cache where SHARABLE_MEM > 10000 and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE') order by SHARABLE_MEM desc
Loads
LOADS INTO SHARED POOL NOTES:
select OWNER, NAME||' - '||TYPE object, LOADS from v$db_object_cache where LOADS > 3 and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE') order by LOADS desc
Executions
SHARED POOL EXECUTION NOTES:
select OWNER, NAME||' - '||TYPE object, EXECUTIONS from v$db_object_cache where EXECUTIONS > 100 and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE') order by EXECUTIONS desc
Details
SHARED POOL DETAIL NOTES:
select OWNER, NAME, DB_LINK, NAMESPACE, TYPE, SHARABLE_MEM, LOADS, EXECUTIONS, LOCKS, PINS from v$db_object_cache order by OWNER, NAME
Library Cache Statistics
SHARED POOL V$LIBRARYCACHE STATISTIC NOTES:
select NAMESPACE, GETS, GETHITS, round(GETHITRATIO*100,2) gethit_ratio, PINS, PINHITS, round(PINHITRATIO*100,2) pinhit_ratio, RELOADS, INVALIDATIONS from v$librarycache
Reserve Pool Settings
SHARED POOL RESERVED SIZE NOTES:
select NAME, VALUE from v$parameter where NAME like '%reser%'
Pinned Objects
PINNED OBJECT NOTES:
select NAME, TYPE, KEPT from v$db_object_cache where KEPT = 'YES'
======================================================================
Cursor/SQL Processing
Here are some scripts related to Cursor/SQL Processing .
Disk Intensive SQL
SQL WITH MOST DISK READ NOTES:
select a.USERNAME, DISK_READS, EXECUTIONS, round(DISK_READS / decode(EXECUTIONS, 0, 1, EXECUTIONS)) "Reads/Execs", SQL_TEXT from dba_users a, v$session, v$sqlarea where PARSING_USER_ID=USER_ID and ADDRESS=SQL_ADDRESS(+) and DISK_READS > 10000 order by DISK_READS desc, EXECUTIONS desc
Buffer Intensive SQL
SQL WITH MOST BUFFER SCAN NOTES:
select EXECUTIONS, BUFFER_GETS, round(DISK_READS / decode(EXECUTIONS, 0, 1, EXECUTIONS) / 400,2) "Gets/Execs", SQL_TEXT from v$sqlarea where BUFFER_GETS / decode(EXECUTIONS,0,1, EXECUTIONS) / 400 > 10 order by EXECUTIONS desc
Buffer SQL w/ Most Loads
SQL WITH MOST LOAD NOTES:
select LOADS, FIRST_LOAD_TIME, SORTS, SQL_TEXT from v$sqlarea where LOADS > 50 order by EXECUTIONS desc
Open Cursors By User
OPEN CURSORS BY USER NOTES:
select nvl(USERNAME,'ORACLE PROC')||'('||s.SID||')' username, SQL_TEXT from v$open_cursor oc, v$session s where s.SADDR = oc.SADDR order by 1
Running Cursors By User
RUNNING CURSORS BY USER NOTES:
select nvl(USERNAME,'ORACLE PROC')||'('||s.SID||')' username, SQL_TEXT from v$open_cursor oc, v$session s where s.SQL_ADDRESS = oc.ADDRESS and s.SQL_HASH_VALUE = oc.HASH_VALUE order by 1
LR Open Cursors
OPEN CURSORS WITH LOW HIT RATIO NOTES:
select nvl(se0.USERNAME,'ORACLE PROC')||'('||se0.SID||')' username, SQL_TEXT from v$open_cursor oc0, v$session se0 where se0.SADDR = oc0.SADDR and se0.USERNAME != 'SYS' and 60 < ( select "Hit Ratio" from ( select nvl(se.USERNAME,'ORACLE PROC')||'('|| se.SID||')' "User Session", sum(decode(NAME, 'consistent gets',value, 0)) "Consistent Gets", sum(decode(NAME, 'db block gets',value, 0)) "DB Block Gets", sum(decode(NAME, 'physical reads',value, 0)) "Physical Reads", ( (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0)) - sum(decode(NAME, 'physical reads',value, 0))) / (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0))) * 100) "Hit Ratio" from v$sesstat ss, v$statname sn, v$session se where ss.SID = se.SID and sn.STATISTIC# = ss.STATISTIC# and VALUE != 0 and sn.NAME in ('db block gets', 'consistent gets', 'physical reads') group by se.USERNAME, se.SID ) XX where nvl(se0.USERNAME,'ORACLE PROC')||'('||se0.SID||')' = "User Session") order by nvl(se0.USERNAME,'ORACLE'), se0.SID
LR Running Cursors
RUNNING CURSORS WITH LOW HIT RATIO NOTES:
select nvl(se0.USERNAME,'ORACLE PROC')||'('|| se0.SID||'), SQL_TEXT from v$open_cursor oc0, v$session se0 where se0.SQL_ADDRESS = oc0.ADDRESS and se0.SQL_HASH_VALUE = oc0.HASH_VALUE and se0.username != 'SYS' and 60 > ( select "Hit Ratio" from ( select nvl(se.USERNAME,'ORACLE PROC')||'('|| se.SID||')' "User Session", sum(decode(NAME, 'consistent gets',value, 0)) "Consistent Gets", sum(decode(NAME, 'db block gets',value, 0)) "DB Block Gets", sum(decode(NAME, 'physical reads',value, 0)) "Physical Reads", ( (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0)) - sum(decode(NAME, 'physical reads',value, 0))) / (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0))) * 100) "Hit Ratio" from v$sesstat ss, v$statname sn, v$session se where ss.SID = se.SID and sn.STATISTIC# = ss.STATISTIC# and VALUE != 0 and sn.NAME in ('db block gets', 'consistent gets', 'physical reads') group by se.USERNAME, se.SID ) where nvl(se0.username,'ORACLE PROC')||'('||se0.sid||')' = "User Session") order by nvl(se0.username,'ORACLE'), se0.sid
LR Objects Access
OBJECTS BEING USED BY USERS WITH LOW HIT RATIO NOTES:
select nvl(se0.USERNAME,'ORACLE PROC')||'('|| se0.SID||')' username, OWNER, OBJECT from v$access ac, v$session se0 where ac.SID = se0.SID and ac.TYPE = 'TABLE' and 60 < ( select "Hit Ratio" from ( select nvl(se.USERNAME,'ORACLE PROC')||'('|| se.SID||')' "User Session", sum(decode(NAME, 'consistent gets',value, 0)) "Consistent Gets", sum(decode(NAME, 'db block gets',value, 0)) "DB Block Gets", sum(decode(NAME, 'physical reads',value, 0)) "Physical Reads", ( (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0)) - sum(decode(NAME, 'physical reads',value, 0))) / (sum(decode(NAME, 'consistent gets',value, 0)) + sum(decode(NAME, 'db block gets',value, 0))) * 100) "Hit Ratio" from v$sesstat ss, v$statname sn, v$session se where ss.SID = se.SID and sn.STATISTIC# = ss.STATISTIC# and VALUE != 0 and sn.NAME in ('db block gets', 'consistent gets', 'physical reads') group by se.USERNAME, se.SID ) where nvl(se0.USERNAME,'ORACLE PROC')||'('|| se0.SID||')' = "User Session") order by USERNAME,se0.SID,OWNER
=======================================================================
Tables/Indexes
Here are some scripts related to Tables/Indexes .
Tabs w/ Questionable Inds
TABLES WITH QUESTIONABLE INDEX(ES) NOTES:
select TABLE_OWNER, TABLE_NAME, COLUMN_NAME from dba_ind_columns where COLUMN_POSITION=1 and TABLE_OWNER not in ('SYS','SYSTEM') group by TABLE_OWNER, TABLE_NAME, COLUMN_NAME having count(*) > 1
Tabs With More Than 5 Inds
TABLES WITH MORE THAN 5 INDEXES NOTES:
select OWNER, TABLE_NAME, COUNT(*) index_count from dba_indexes where OWNER not in ('SYS','SYSTEM') group by OWNER, TABLE_NAME having COUNT(*) > 5 order by COUNT(*) desc, OWNER, TABLE_NAME
Tables With No Indexes
TABLES WITHOUT INDEXES NOTES:
select OWNER, TABLE_NAME from ( select OWNER, TABLE_NAME from dba_tables minus select TABLE_OWNER, TABLE_NAME from dba_indexes ) orasnap_noindex where OWNER not in ('SYS','SYSTEM') order by OWNER,TABLE_NAME
Tables With No PK
NO PRIMARY KEY NOTES:
select OWNER, TABLE_NAME from dba_tables dt where not exists ( select 'TRUE' from dba_constraints dc where dc.TABLE_NAME = dt.TABLE_NAME and dc.CONSTRAINT_TYPE='P') and OWNER not in ('SYS','SYSTEM') order by OWNER, TABLE_NAME
Disabled Constraints
DISABLED CONSTRAINT NOTES:
select OWNER, TABLE_NAME, CONSTRAINT_NAME, decode(CONSTRAINT_TYPE, 'C','Check', 'P','Primary Key', 'U','Unique', 'R','Foreign Key', 'V','With Check Option') type, STATUS from dba_constraints where STATUS = 'DISABLED' order by OWNER, TABLE_NAME, CONSTRAINT_NAME
FK Constraints
FOREIGN KEY CONSTRAINTS NOTES:
select c.OWNER, c.TABLE_NAME, c.CONSTRAINT_NAME, cc.COLUMN_NAME, r.TABLE_NAME, rc.COLUMN_NAME, cc.POSITION from dba_constraints c, dba_constraints r, dba_cons_columns cc, dba_cons_columns rc where c.CONSTRAINT_TYPE = 'R' and c.OWNER not in ('SYS','SYSTEM') and c.R_OWNER = r.OWNER and c.R_CONSTRAINT_NAME = r.CONSTRAINT_NAME and c.CONSTRAINT_NAME = cc.CONSTRAINT_NAME and c.OWNER = cc.OWNER and r.CONSTRAINT_NAME = rc.CONSTRAINT_NAME and r.OWNER = rc.OWNER and cc.POSITION = rc.POSITION order by c.OWNER, c.TABLE_NAME, c.CONSTRAINT_NAME, cc.POSITION
FK Index Problems
FK CONSTRAINTS WITHOUT INDEX ON CHILD TABLE NOTES:
select acc.OWNER, acc.CONSTRAINT_NAME, acc.COLUMN_NAME, acc.POSITION, 'No Index' Problem from dba_cons_columns acc, dba_constraints ac where ac.CONSTRAINT_NAME = acc.CONSTRAINT_NAME and ac.CONSTRAINT_TYPE = 'R' and acc.OWNER not in ('SYS','SYSTEM') and not exists ( select 'TRUE' from dba_ind_columns b where b.TABLE_OWNER = acc.OWNER and b.TABLE_NAME = acc.TABLE_NAME and b.COLUMN_NAME = acc.COLUMN_NAME and b.COLUMN_POSITION = acc.POSITION) order by acc.OWNER, acc.CONSTRAINT_NAME, acc.COLUMN_NAME, acc.POSITION
Inconsistent Column Names
INCONSISTENT COLUMN DATATYPE NOTES:
select OWNER, COLUMN_NAME, TABLE_NAME, decode(DATA_TYPE, 'NUMBER', DATA_PRECISION, DATA_LENGTH) datatype from dba_tab_columns where (COLUMN_NAME, OWNER) in (select COLUMN_NAME, OWNER from dba_tab_columns group by COLUMN_NAME, OWNER having min(decode(DATA_TYPE, 'NUMBER', DATA_PRECISION, DATA_LENGTH)) < max(decode(DATA_TYPE, 'NUMBER', DATA_PRECISION, DATA_LENGTH)) ) and OWNER not in ('SYS', 'SYSTEM') order by COLUMN_NAME,DATA_TYPE
Object Extent Warning
TABLES THAT CANNOT EXTEND NOTES:
select OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, NEXT_EXTENT from ( select seg.OWNER, seg.SEGMENT_NAME, seg.SEGMENT_TYPE, seg.TABLESPACE_NAME, t.NEXT_EXTENT from dba_segments seg, dba_tables t where (seg.SEGMENT_TYPE = 'TABLE' and seg.SEGMENT_NAME = t.TABLE_NAME and seg.owner = t.OWNER and NOT EXISTS ( select TABLESPACE_NAME from dba_free_space free where free.TABLESPACE_NAME = t.TABLESPACE_NAME and BYTES >= t.NEXT_EXTENT)) union select seg.OWNER, seg.SEGMENT_NAME, seg.SEGMENT_TYPE, seg.TABLESPACE_NAME, c.NEXT_EXTENT from dba_segments seg, dba_clusters c where (seg.SEGMENT_TYPE = 'CLUSTER' and seg.SEGMENT_NAME = c.CLUSTER_NAME and seg.OWNER = c.OWNER and NOT EXISTS ( select TABLESPACE_NAME from dba_free_space free where free.TABLESPACE_NAME = c.TABLESPACE_NAME and BYTES >= c.NEXT_EXTENT)) union select seg.OWNER, seg.SEGMENT_NAME, seg.SEGMENT_TYPE, seg.TABLESPACE_NAME, i.NEXT_EXTENT from dba_segments seg, dba_indexes i where (seg.SEGMENT_TYPE = 'INDEX' and seg.SEGMENT_NAME = i.INDEX_NAME and seg.OWNER = i.OWNER and NOT EXISTS ( select TABLESPACE_NAME from dba_free_space free where free.TABLESPACE_NAME = i.TABLESPACE_NAME and BYTES >= i.NEXT_EXTENT)) union select seg.OWNER, seg.SEGMENT_NAME, seg.SEGMENT_TYPE, seg.TABLESPACE_NAME, r.NEXT_EXTENT from dba_segments seg, dba_rollback_segs r where (seg.SEGMENT_TYPE = 'ROLLBACK' and seg.SEGMENT_NAME = r.SEGMENT_NAME and seg.OWNER = r.OWNER and NOT EXISTS ( select TABLESPACE_NAME from dba_free_space free where free.TABLESPACE_NAME = r.TABLESPACE_NAME and BYTES >= r.NEXT_EXTENT)) ) orasnap_objext_warn order by OWNER,SEGMENT_NAME
Segment Fragmentation
OBJECTS WITH MORE THAN 50% OF MAXEXTENTS NOTES:
select OWNER, TABLESPACE_NAME, SEGMENT_NAME, SEGMENT_TYPE, BYTES, EXTENTS, MAX_EXTENTS, (EXTENTS/MAX_EXTENTS)*100 percentage from dba_segments where SEGMENT_TYPE in ('TABLE','INDEX') and EXTENTS > MAX_EXTENTS/2 order by (EXTENTS/MAX_EXTENTS) desc
Extents reaching maximum
TABLES AND EXTENTS WITHIN 3 EXTENTS OF MAXIMUM :
select owner "Owner", segment_name "Segment Name", segment_type "Type", tablespace_name "Tablespace", extents "Ext", max_extents "Max" from dba_segments where ((max_extents - extents) <= 3) and owner not in ('SYS','SYSTEM') order by owner, segment_name
Analyzed Tables
ANALYZED TABLE NOTES:
select OWNER, sum(decode(nvl(NUM_ROWS,9999), 9999,0,1)) analyzed, sum(decode(nvl(NUM_ROWS,9999), 9999,1,0)) not_analyzed, count(TABLE_NAME) total from dba_tables where OWNER not in ('SYS', 'SYSTEM') group by OWNER
Recently Analyzed Tables
LAST ANALYZED TABLE NOTES:
select OWNER, TABLE_NAME, to_char(LAST_ANALYZED,'MM/DD/YYYY HH24:MI:SS') last_analyzed from dba_tab_columns where OWNER not in ('SYS','SYSTEM') and LAST_ANALYZED is not null and COLUMN_ID=1 and (SYSDATE-LAST_ANALYZED) < 30 order by (SYSDATE-LAST_ANALYZED)
Cached Tables
CACHED TABLE NOTES:
========================================================================================
select OWNER, TABLE_NAME, CACHE from dba_tables where OWNER not in ('SYS','SYSTEM') and CACHE like '%Y' order by OWNER,TABLE_NAME
Comments
Post a Comment
Oracle DBA Information