Skip to content

Oracle Performance Tuning Cheat Sheet — Key Parameters, Wait Events & SQL Tuning

Quick reference for Oracle database performance tuning. Key parameters, diagnostic shortcuts, and tuning formulas.


ParameterDefaultRecommendationNotes
MEMORY_TARGET0Physical RAM × 60-70%AMM — manages SGA + PGA together
SGA_TARGET0Physical RAM × 40-50%ASMM — auto-tunes SGA components
PGA_AGGREGATE_TARGET10MBPhysical RAM × 20-25%Target PGA for all sessions
PGA_AGGREGATE_LIMIT2× PGA target2-3× PGA targetHard PGA limit (12c+)
SHARED_POOL_SIZEAutoMin 300MB-1GBSet minimum if using ASMM
DB_CACHE_SIZEAutoLargest componentBuffer cache minimum
LARGE_POOL_SIZEAuto50-200MBRMAN, parallel, shared server
ParameterDefaultRecommendationNotes
OPTIMIZER_MODEALL_ROWSALL_ROWSOLTP: consider FIRST_ROWS_n
CURSOR_SHARINGEXACTEXACTUse FORCE only as last resort
OPEN_CURSORS50300-1000Per session cursor limit
SESSION_CACHED_CURSORS50100-200Soft-parsed cursor cache
OPTIMIZER_INDEX_COST_ADJ10020-50Lower = prefer indexes
DB_FILE_MULTIBLOCK_READ_COUNTAuto16-128Full scan read size
RESULT_CACHE_MAX_SIZEAuto1-5% of shared poolQuery result caching (11g+)
ParameterDefaultRecommendationNotes
UNDO_RETENTION9001800-3600Seconds to keep undo (for ORA-01555)
UNDO_TABLESPACESized for workloadAuto-extensible recommended
TEMP_UNDO_ENABLEDFALSETRUE (12c+)Undo for temp tables in temp TS

Wait EventMeaningTuning Action
db file sequential readSingle-block I/O (index reads)Better indexes, reduce LIO
db file scattered readMulti-block I/O (full scans)Add indexes, tune SQL
log file syncRedo write at commitBatch commits, faster redo disk
log file parallel writeBackground redo writesFaster redo disk, fewer log switches
direct path readDirect reads bypassing cacheNormal for large scans, parallel
direct path writeDirect writes (CTAS, sorts)More temp space, PGA
Wait EventMeaningTuning Action
enq: TX - row lock contentionRow-level lockApplication design, kill blocker
enq: TM - contentionTable-level lock (DDL)Schedule DDL in maintenance windows
buffer busy waitsHot block contentionReverse-key index, hash partition
latch: shared poolHard parsingUse bind variables
latch: cache buffers chainsBuffer chain contentionReduce logical I/O
library cache: mutex XLibrary cache contentionReduce hard parsing
Wait EventMeaningTuning Action
gc buffer busy acquireWaiting for remote blockReduce cross-instance access
gc cr/current block busyBlock held by remote nodePartition data by instance
gc cr/current grant 2-wayNormal RAC block transferAcceptable, monitor volume
Wait EventMeaningTuning Action
free buffer waitsNo free buffers in cacheIncrease DB_CACHE_SIZE
latch: shared poolShared pool fragmentationIncrease SHARED_POOL_SIZE

Scripts for wait analysis:


SELECT ROUND(1 - (phys.value / (consist.value + dbblk.value)), 4) * 100 hit_ratio
FROM v$sysstat phys, v$sysstat consist, v$sysstat dbblk
WHERE phys.name = 'physical reads'
AND consist.name = 'consistent gets'
AND dbblk.name = 'db block gets';

Target: > 95% for OLTP, > 80% for DSS

SELECT ROUND(SUM(pins - reloads) / SUM(pins) * 100, 2) hit_ratio
FROM v$librarycache;

Target: > 99%

SELECT ROUND(mem.value / (mem.value + dsk.value) * 100, 2) memory_sort_pct
FROM v$sysstat mem, v$sysstat dsk
WHERE mem.name = 'sorts (memory)' AND dsk.name = 'sorts (disk)';

Target: > 99%

Scripts:


MetricOLTP TargetDSS Target
Average single-block read< 5ms< 10ms
Average multi-block read< 10ms< 20ms
Redo write latency< 5ms< 10ms
Average I/O operations/secDepends on storageDepends on storage

Scripts:


EXPLAIN PLAN FOR <your SQL>;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ALL'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', NULL, 'ALL'));
DECLARE
l_plans PLS_INTEGER;
BEGIN
l_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => '&sql_id');
DBMS_OUTPUT.PUT_LINE(l_plans || ' plan(s) loaded');
END;
/

Flush a specific SQL from shared pool (12c+)

Section titled “Flush a specific SQL from shared pool (12c+)”
EXEC DBMS_SHARED_POOL.PURGE('&address,&hash_value', 'C');

Index recommendations from SQL Tuning Advisor

Section titled “Index recommendations from SQL Tuning Advisor”
DECLARE
l_task VARCHAR2(30);
BEGIN
l_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '&sql_id');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(l_task);
DBMS_OUTPUT.PUT_LINE('Task: ' || l_task);
END;
/
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('&task_name') FROM dual;

Scripts:


  1. Find top SQL by CPU: gvsqltop.sql, sysmetric_cpu.sql
  2. Check execution plans for inefficient access paths
  3. Verify statistics are current: SELECT last_analyzed FROM dba_tables
  4. Consider parallel query for large scans
  1. Check file I/O distribution: vfileb.sql
  2. Find SQL causing most physical reads: gvsqltop.sql
  3. Add or rebuild indexes for key predicates
  4. Move hot files to faster storage
  1. Check library cache: vlibrary.sql
  2. Find hard-parsing SQL: gvsqltopunb.sql
  3. Implement bind variables in application code
  4. Increase SHARED_POOL_SIZE if needed
  1. Check temp usage: temp.sql
  2. Identify sessions using temp: large sorts, hash joins
  3. Increase PGA_AGGREGATE_TARGET to reduce disk sorts
  4. Resize temp tablespace if needed

-- Current database time model
SELECT stat_name, ROUND(value/1000000) seconds
FROM v$sys_time_model ORDER BY value DESC;
-- Buffer cache advisory
SELECT size_for_estimate, estd_physical_read_factor
FROM v$db_cache_advice WHERE name = 'DEFAULT';
-- PGA target advisory
SELECT pga_target_for_estimate/1024/1024 target_mb,
estd_pga_cache_hit_percentage hit_pct
FROM v$pga_target_advice;
-- SGA advisory
SELECT sga_size, estd_db_time FROM v$sga_target_advice;
-- Top 5 wait events right now
SELECT event, total_waits, time_waited_micro/1000000 seconds
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited_micro DESC FETCH FIRST 5 ROWS ONLY;