Essential Oracle Monitoring Queries for Performance Tuning
This article compiles a comprehensive set of Oracle SQL queries that monitor wait events, rollback segment contention, tablespace and file system I/O ratios, SGA hit rates, dictionary cache efficiency, MTS activity, fragmentation, and other critical performance metrics, often with recommended threshold values.
1. Wait Event Monitoring
select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,count(*) from v$session_wait group by event order by 4;Lists each wait event with counts of previous and current wait times, helping identify spikes.
2. Rollback Segment Contention
select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn=b.usn;Shows wait-to-get ratios for rollback segments to spot contention.
3. Tablespace I/O Ratio
select df.tablespace_name name,df.file_name "ile",f.phyrds pyr,f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw from v$filestat f,dba_data_files df where f.file#=df.file_id;Provides physical reads and writes per tablespace file.
4. File System I/O Ratio
select substr(a.file#,1,2) "#",substr(a.name,1,30) "name",a.status,a.bytes, b.phyrds,b.phywrts from v$datafile a,v$filestat b where a.file#=b.file#;Shows I/O statistics for each data file.
5. Indexes Owned by a User
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name from user_ind_columns, user_indexes where user_ind_columns.index_name = user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type, user_indexes.table_name, user_indexes.index_name, column_position;Lists all indexes and their columns for a specific user.
6. SGA Logical vs Physical Reads (Buffer Hit Ratio)
select a.value + b.value "logical_reads", c.value "phys_reads", round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a, v$sysstat b, v$sysstat c where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40;Calculates the overall SGA buffer hit ratio.
7. Dictionary Cache Hit Ratio
select parameter, gets, Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses;Shows miss and hit percentages for the dictionary cache.
8. Library Cache Hit Ratio (Target < 1%)
select sum(pins) "Total Pins", sum(reloads) "Total Reloads", sum(reloads)/sum(pins) *100 libcache from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio", sum(reloads)/sum(pins) "reload percent" from v$librarycache;Evaluates library cache efficiency; a low reload percentage indicates good performance.
9. Object Size Summary
select count(name) num_instances ,type ,sum(source_size) source_size , sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required from dba_object_size group by type order by 2;Aggregates size metrics for all database objects by type.
10. Redo Log Buffer Cache Hit Ratio (Target < 1%)
SELECT name, gets, misses, immediate_gets, immediate_misses, Decode(gets,0,0,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,0,0, immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch WHERE name IN ('redo allocation', 'redo copy');Measures redo allocation and copy latch efficiency.
11. Sort Area Ratio (Target < 0.10)
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');Helps decide whether to increase sort_area_size.
12. Active SQL Sessions
SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece;Shows which users are executing which SQL statements.
13. Dictionary Buffer Statistics
SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE; SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE; SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;Low ratios (< 1 %) indicate healthy cache performance.
14. Oracle Character Set
select * from sys.props$ where name='NLS_CHARACTERSET';Retrieves the database character set.
15. MTS (Multi‑Threaded Server) Monitoring
select busy/(busy+idle) "shared servers busy" from v$dispatcher;If the value exceeds 0.5, increase the dispatchers parameter.
select sum(wait)/sum(totalq) "ispatcher waits" from v$queue where type='dispatcher'; select count(*) from v$dispatcher; select servers_highwater from v$mts;When servers_highwater approaches mts_max_servers, raise the MTS limit.
16. Tablespace Fragmentation
select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name having count(tablespace_name)>10;Identifies tablespaces with many free fragments.
alter tablespace name coalesce; alter table name deallocate unused;Reclaims space.
create or replace view ts_blocks_v as select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space union all select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents; select * from ts_blocks_v; select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space group by tablespace_name;Shows free space distribution.
SELECT segment_name table_name , COUNT(*) extents FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);Finds tables with the highest fragmentation.
17. Table and Index Storage Checks
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner' group by segment_name;Analyzes storage consumption for tables and indexes.
18. Sessions Consuming High CPU
Statistic #12 represents CPU used by a session.
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value;Orders sessions by CPU usage.
19. Recently Executed SQL Statements
SELECT SQL_TEXT FROM V$SQL;Retrieves the text of SQL statements that have been run.
20. Log Buffer Usage (Target < 1%)
select rbar.name,rbar.value,re.name,re.value, (rbar.value*100)/re.value||'%' "radio" from v$sysstat rbar,v$sysstat re where rbar.name='redo buffer allocation retries' and re.name='redo entries';If the ratio exceeds 1 %, increase log_buffer size.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
ITPUB
Official ITPUB account sharing technical insights, community news, and exciting events.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
