Call now: 252-767-6166  
Oracle Training Oracle Support Development Oracle Apps

 E-mail Us
 Oracle Articles
New Oracle Articles

 Oracle Training
 Oracle Tips

 Oracle Forum
 Class Catalog

 Remote DBA
 Oracle Tuning
 Emergency 911
 RAC Support
 Apps Support
 Oracle Support

 SQL Tuning

 Oracle UNIX
 Oracle Linux
 Remote s
 Remote plans
 Application Server

 Oracle Forms
 Oracle Portal
 App Upgrades
 SQL Server
 Oracle Concepts
 Software Support

 Remote S


 Consulting Staff
 Consulting Prices
 Help Wanted!


 Oracle Posters
 Oracle Books

 Oracle Scripts

Don Burleson Blog 









Oracle 10g Migration:
slow performance after upgrade to Oracle10g

Oracle Database Tips by Donald Burleson

Question:  I just upgraded to Oracle 10g and I'm seeing very bad SQL performance.  I had to set optimizer_features_enable=9.0.5.  What can I do to fix Oracle10g upgrade & migration performance tuning problems?

Answer:  Oracle has improved the cost-based Oracle optimizer in 9.0.5 and again in 10g, so you need to take a close look at your environmental parameter settings (init.ora parms) and your optimizer statistics.  I have complete directions in my book "Oracle Tuning - The Definitive Reference", but here are some notes.  See also Oracle tips for 10g migration. and Oracle 11g upgrade performance problems.

For Oracle 10g performance problems, call BC at 800-766-1884.  We are expert at Oracle10g performance problems and we know many tricks that are not published by Oracle for achieving optimal tuning.

First, make sure to see these important notes on _optimizer_cost_based_transformation issues when doing 10g upgrades. Also note that 9i has many optimizer bugs, notably issues that are corrected with _optimizer_transitivity_retain when using query re-write.

Properly configured, Oracle 10g should always faster than earlier releases, both for PL/SQL and SQL, so it is likely that any slow performance after an Oracle 10g upgrade is due to initialization parameter settings or incomplete CBO statistics. 

Oracle 10g Optimizer Issues

Oracle 10g automated statistics gathering caused problems because the default for estimate_percent is auto_sample_size and the default for method_opt is "for all columns size auto".

  • In 10g - avoid auto_sample_size:  auto_sample_size fixed in 11g - only works when you specify estimate_percent = auto_sample_size.
  • Histograms in 10g cause troubles because predicates with binds did not work (bind peeking issue)


Oracle 10g migration due diligence

Oracle 10g is the world's most flexible and complex database, and upgrading to Oracle 10g is very tricky.  Prior to putting your Oracle 10g upgrade into production, it's a best practice to obtain an independent Oracle health check to identify sub-optimal configuration settings. 

Remember that there were many optimizer enhancements and bug fixed in Oracle 10g and you can use the  v$system_fix_control  view to display specific optimizer features by release.

Reasons for sub-optimal Oracle 10g performance after migration

For complete insurance against bad performance after a 10g upgrade, see my book  "Oracle Tuning: The Definitive Reference".

  • Check for 10g optimization bugs - See MOSC  Note 469972.1, note 240764.1, note 466181.1 and note 337096.1.
  • Gather workload statistics - The 10g CBO requires workload information with dbms_stats.gather_system_stats

  • Selectively disable dynamic sampling - Dynamic sampling is not for every database.  Dynamic sampling default levels change between releases, and you may want to turn-off dynamic sampling, depending on your database load.

  •  Re-set optimizer costing - Consider unsetting your CPU-based optimizer costing (the 10g default, a change from 9i).  CPU costing is best of you see CPU in your top-5 timed events in your STATSPACK/AWR report, and the 10g default of _optimizer_cost_model=cpu will include CPU costs, sometimes invoking more full scans, especially in tablespaces with large blocksizes.  To return to your 9i CBO I/O-based costing, set the hidden parameter "_optimizer_cost_model"=io

  • Verify deprecated parameters - you need to set  optimizer_features_enable = and optimizer_mode = FIRST_ROWS_n (or ALL_ROWS for a warehouse, but remove the 9i CHOOSE default). 

  • - Re-check your db_file_multiblock_read_count parameter - The Oracle 10g release 2 Performance Tuning Guide (page 14.4) notes:

    "The value of db_file_multiblock_read_count is set to the maximum allowed by the operating system by default. However, the optimizer uses mbrc=8 for costing.

    10gr2 Note:  Starting in Oracle 10g release2, Oracle recommends not setting the db_file_multiblock_read_count parameter, allowing Oracle to empirically determine the optimal setting.  For more details, see my notes on 10gR2 automatically tuned multi-block reads.

  • Verify quality of CBO statistics - Oracle 10g does automatic statistics collection and your original customized dbms_stats job (with your customized parameters) will be overlaid.  You may also see a statistics deficiency (i.e. not enough histograms) causing performance issues.  Re-analyze object statistics using dbms_stats and make sure that you collect system statistics.  Also see 10g changes to dbms_stats for more details.

    execute dbms_stats.gather_system_stats('start');
    -- wait an hour or so
    execute dbms_stats.gather_system_stats('stop');

  • Check optimizer parameters - Ensure that you are using the proper optimizer_mode (the new default is all_rows instead of choose) and check optimal settings for optimizer_index_cost_adj (lower from the default of 100) and optimizer_index_caching (set to a higher value than the default). 

  • Check I/O timings - This guy has noted that in Linux 2.6 using ASM, "db file scattered reads" (full scan I/O) can become slower than "db file sequential reads" (usually single block gets) because of non-contiguous data block placement on disk.  He notes that full-scan access speed is aggravated by Oracle willy-nilly block placement in Automated Storage Management (ASM) and the use of bitmap freelists (Automated Segment Storage Management).
  • Check Cartesian Merge Joins - Unnecessary cartesian merge joins have been reported as a source of performance issues.  Disabling Cartesian Merge Joins is possible but is discouraged.  It's always best to look for the root cause instead of using undocumented or hidden parameters as a workaround.  The warning below about modification of undocumented parameters should be taken very seriously.

To find the exact root cause of the changed SQL performance, start by collecting the execution plans and TKPROF output for the 10g default and again after setting optimizer_features_enable).  Compare the plans and then see how you might adjust initialization parameters and CBO statistics (using dbms_stats) to replicate the optimal SQL execution plan.

Tip - If you have a SQL statement which has poor performance after a 10g upgrade, try temporarily adding a /*+ rule */ hint to see if the problem is related to sub-optimal optimizer statistics. 

If the RULE hint optimizes the SQL, remove the RULE hint and adjust your statistics until it replicates the execution plan.

DBA Reports on 10g upgrade performance

This document shows some parameters which relieved slow SQL performance after a 10g upgrade by George Johnson:

After our upgrade from 9206 to 10201, we ended up with these parameters making the biggest difference to our slow query performance. The optimizer_index_cost_adj figure was arrived at after about 2 days of testing various troublesome

optimizer_secure_view_merging = false
_gby_hash_aggregation_enabled = FALSE
optimizer_index_cost_adj = 50
optimizer_index_caching = 0
_optimizer_cost_based_transformation = OFF

We were told by one Oracle guy that if your DB is not a warehouse and it's used batch and OLTP, the bottom four parameters should be set in 10g, without question to ensure the Warehouse components do not affect OLTP type activity!

Warning:  You should only change underscore undocumented parameters at the direct request of Oracle technical support.

This document notes other 10g upgrade issues with advanced SQL optimization in subquery un-nesting and outer hash joins:

"I have noticed after upgrading from 9i to 10g, the biggest impacts for query performance were -

(1) subquery unnesting (mostly, unnesting EXISTS to HASH JOIN SEMI), and

(2)right outer hash join (smaller table in an outer join *is* used as the hash table, unlike what was happening in pre-10g versions).

In some cases (till we would have to hint the sub-query with NO_UNNEST to avoid the hash join semi. . .

The only ways to get rid of this problem (ora-979 is omitted if it is raised in inline view) is to use the hint NO_MERGE in 9i, and depending on 10g version and testmerge table columns - setting the '_OPTIMIZER_COST_BASED_TRANSFORMATION' to off on 10g."

This blog by Shervin Sheidaei notes a similar performance issues after a 10g upgrade and a change to "_optimizer_cost_based_transformation" =off; and "_gby_hash_aggregation_enabled"=false:

Some queries after upgrade from 9i to 10g may have performance issue which means they may run slower in 10g.

For figuring out whether or not performance issue is because of new enhanced features in 10g please turn off the following options and run query in 10g.

alter session set "_optimizer_cost_based_transformation" =off; (Disable subquery unnesting and view merging -- New 10g optimizer feature).

alter session set "_gby_hash_aggregation_enabled" = FALSE; (Disable Hash group by aggregation -- New 10g optimizer feature).

More information on the impact of hash aggregation on performance and the expected effect of disabling GROUP BY aggregation by setting _gby_hash_aggregation_enabled  to FALSE is available HERE

David Aldridge has concerns about disk read performance when using ASM and ASSM, noting that placement on the disk and competing I/O requests can impede scattered read access times (as the read-write head thrashes):

"Does the issue of the slowing of one read matter when other process are being equally served at the same time? That's a question at the very heart of i/o scheduling (and queuing theory, which is what all this is about) what is meant by "equally served"?

If it means that the scheduler finishes with one read request and then immediately moves the disk heads to satisfy another, then moves the heads back to satisfy another request from the first process then that might seem equitable, but it's exactly analogous to a single check-in handling multiple check-ins at the airport at the same time.

Consider passenger A and passenger B, both waiting to be served. To check in each passenger takes five minutes, so passenger A is checked in in five minutes and passenger B waits for five minutes then gets checked in and is gone after a total wait of ten minutes.

If, in an effort to be equitable to both parties, the check-in agent flits between the two then the total time to check them both in is now eleven minutes (taking into account a total latency of one minute due to walking between the desks), and they both wait the full eleven minutes to be finished. Not equitable at all!"

This shop notes an ODBC transformation problem causing unnecessary large-table full-table scans and driving-up CPU consumption. 

We were able to identify (via SQLT reports) an issue with VARCHAR2 and NVARCHAR2.

Essentially the application sends NVARCHAR2 data through ODBC to the Oracle database. The data columns in the Oracle database are defined as VARCHAR2.

There is a conversion going on that converts the column data in the database to NVARCHAR2 causing full table scans. We were able to programmatically change the application to explicitly say data in string is VARCHAR  thus eliminating the overhead of the conversion and the full table scans. This drastically reduced the overhead and dropped the CPU utilization in half. We also do not see any long running items in OEM.
The question for Oracle is:

WHY is the database converting the column data to nvarchar2 (using the SYS_OP_C2C function) when it should know that the data type is varchar2 and should process the Unicode appropriately?
What we see is the exact same query coming through as varchar2 in some cases and nvarchar2 in other cases.

Expert 10g performance support

You can also telephone me for Oracle upgrade performance consulting, to quickly solve your upgrade related performance tuning slowdowns.

If you like Oracle tuning, you may enjoy my new book "Oracle Tuning: The Definitive Reference", over 900 pages of BC's favorite tuning tips & scripts. 

You can buy it direct from the publisher for 30%-off and get instant access to the code depot of Oracle tuning scripts.



Oracle Training at Sea
oracle dba poster

Follow us on Twitter 
Oracle performance tuning software 
Oracle Linux poster


Burleson is the American Team

Note: This Oracle documentation was created as a support and Oracle training reference for use by our DBA performance tuning consulting professionals.  Feel free to ask questions on our Oracle forum.

Verify experience! Anyone considering using the services of an Oracle support expert should independently investigate their credentials and experience, and not rely on advertisements and self-proclaimed expertise. All legitimate Oracle experts publish their Oracle qualifications.

Errata?  Oracle technology is changing and we strive to update our BC Oracle support information.  If you find an error or have a suggestion for improving our content, we would appreciate your feedback.  Just  e-mail:  

and include the URL for the page.


Burleson Consulting

The Oracle of Database Support

Oracle Performance Tuning

Remote DBA Services


Copyright © 1996 -  2020

All rights reserved by Burleson

Oracle ® is the registered trademark of Oracle Corporation.