9. Enterprise Manager
• ASH
• Sampling in seconds, support real-time Performance view in OEM
• Store in SGA, v$active_session_history
• Can also generate reports
• ADDM
• Automatic Database Diagnostic Monitor
• Identify issues and give recommendations from snapshots
• SQL Tuning Advisor
• Create sql profile for sql statement
• SQL Access Advisor
• Advice on index etc for sql statement
11. Top SQL
• Elapsed time
• Parse time
• Executions
• Buffer gets
• Physical reads
12. Basic terminology
• Anoptimizeris the part of the RDBMS responsible for
determining the most efficient way for a SQL
statement to access data
• An execution plan is the complete sequence of
operations required to resolve a SQL statement (the
combination of access paths and join methods). The
in-memory structure of a execution plan also can be
called a cursor.
• A join method determines how two tables will be
joined together (only two tables can be joined
together at a time)
13. Hard parse
• Syntax analysis
• Analyze "text" of SQL query
• Detect syntax errors
• Create internal query representation
• Semantic Checking
• Validate SQL statement
• View analysis
• Incorporate constraints, triggers, etc.
• Query Optimization
• Modify query to improve performance (Query Rewrite)
• Choose the most efficient "access plan" (Query Optimization)
• Plan Generation
14. Optimizer
• Optimizer mode
• RULE, CHOOSE, FIRST_ROWS, ALL_ROWS
• RULE is not supported
• Cost Based Optimizer
• Highly depends on statistics
• Init parameters can affect the CBO
• optimizer_mode
• optimizer_index_cost_adj
• optimizer_index_cache
• data_block_multiple_read_count
15. Execution Plan
• Explain plan for <query>
• Select * from table(dbms_xplan.display);
• dbms_xplan.display
• dbms_xplan.display_cursor
• dbms_xplan.display_awr
• Query with /*+ gather_plan_statistics */
• more details in v$sql_plan_statistics_all
• dbms_xplan.display_cursor(null, null, ‘ALLSTAT LAST’)
• useful to find out wrong estimation by optimizer
18. How to read an execution plan
• Order
• Inner -> outer
• At same level, up -> down. Some operations are iterative.
• Rows
• Estimated by optimizer. Often cause problem.
• Time
• Estimated by optimizer. Very inaccurate.
• A-Rows | A-Time
• Actual numbers. Collected by /*+ gather_plan_statistics */
19. Operations in execution plan
• TABLE ACCESS FULL
• INDEX RANGE SCAN / TABLE ACCESS BY INDEX ROWID
• NESTED LOOPS / HASH JOIN / MERGE JOIN
• MERGE JOIN CARTESIAN
• INLIST ITERATOR
• SORT
• AGGREGATE
• FILTER
20. SQL trace/tkprof
• Alter session set sql_trace = true (SQL*PLUS)
• Alter session set events '10046 trace name context
forever, level 12‘
• Level 1 equals sql_trace=true
• Level 4 includes bind values
• Level 8 includes wait time statistics
• Level 12 includes both bind values and wait time stats.
• dbms_monitor.session_trace_enable(sid, serial#,
waits, binds)
• Trace file is in USER_DUMP_DEST folder
• tkprof<trace_file><output_file>
24. 10053 trace (optimizer trace)
• Alter session set events ’10053 trace name context
forever, level 1‘
25. SQL Tuning
• Common rules
• Filter as early as possible and as much as possible
• Join order is more significant than join method
• Methods
• Statistics
• Hints (sql profile / outline)
• Rewrite
• Index
• Schema
27. Hint /*+ */
• Join order
• ORDERED, LEADING
• Join method
• USE_NL, USE_HASH, USE_MERGE, STAR
• Query transformation
• USE_CONCAT, NO_EXPAND, UNNEST, PUSH_SUBQ
• Index
• INDEX, INDEX_JOIN, INDEX_COMBINE
• Stats
• DYNAMIC_SAMPLING, CADINALITY, SELECTIVITY
• Sql Profile is a set of hints fundamentally
28. SQL rewrite
• In / exists
• Not in / not exists
• Correlated / non-correlated
• Join / SubQuery
29. Challenges for stable plan
• Volatile data
• Screw data / histograms / bind value peeking
• Data correlation
30. Application Tuning
• Avoid unnecessary query
• Check logics
• Cache
• Avoid to fetch too many rows
• Pagination
• Avoid complex query
• Material views
• Denormalize
• Optimize locking
• Optimize indexes
31. OLTP applications
• Use connection pool
• Use bind variables (CURSOR_SHARING=FORCE?)
• Prefer OPTIMIZER_MODE=FIRST_ROW
• Enforce pagination
• Caution with any query which join too many tables
• Caution with any Full Table Scan or Fast Full Index Scan
on large table
• Caution with any Sort, Aggregation, Hash Join, Merge
Join, especially Merge Join Cartesian on large sets