860 likes | 1.15k Views
An Oracle 10g Upgrade Case Study: Looking at System Performance Before and After the Upgrade. Roger Schrag Database Specialists, Inc. www.dbspecialists.com. Today's Session. The view from 30,000 feet: Our Oracle environment, upgrade strategy Impressions: upgrade process and compatibility
E N D
An Oracle 10g Upgrade Case Study: Looking at System Performance Before and After the Upgrade Roger Schrag Database Specialists, Inc. www.dbspecialists.com
Today's Session • The view from 30,000 feet: • Our Oracle environment, upgrade strategy • Impressions: upgrade process and compatibility • Impressions: Oracle 10g in general • In greater detail: • Sizing the shared pool and SGA • Optimizer statistics collection and accuracy • Query optimization • SQL Tuning Advisor • Overhead
Today’s Session Goal: Help you plan for your own Oracle 10g upgrade. • We will: • Look at one company’s experience upgrading to 10g • Discuss real-life experiences • Provide data so you can draw your own conclusions • We will not: • Walk through the actual upgrade steps • Make any judgments about Oracle 10g
Always Remember • Each Oracle system is unique and will have its own challenges. • Never take somebody else’s word on anything when it comes to Oracle technology. • In this session we are only relaying one company’s experiences. • The only way for you to know how your specific system will fare on Oracle 10g is to try it—in a test environment—and see.
White Paper • Contains additional topics and examples we won't have time to discuss today • Contains additional “supporting evidence” for conclusions reached in today's session that we won't have time to discuss or that won’t fit legibly on a PowerPoint slide • TKPROF reports, execution plans, AWR reports • Download: www.dbspecialists.com/presentations
The View From 30,000 Feet • Our Oracle environment • Our upgrade strategy • Impressions: upgrade process and compatibility • Impressions: Oracle 10g in general
Our Oracle Environment • Platform details: • Oracle 8.1.7 Standard Edition 32 bit • Sun Solaris 8 64 bit • One production and one dev database • Production database 15 Gb in size
Our Oracle Environment • Application: Customer database monitoring tool • Backend daemons process inbound agent files from our customers’ database servers in the field • Web-based user interface for report generation, system configuration • Almost all code is PL/SQL (roughly 50,000 lines) • Leverages Oracle 8i features—eg GTTs, table() • About 50 SQL statements have hints
Our Oracle Environment • Oracle 8i production database was very stable • Figured out workarounds to 8i bugs long ago • Application enhancements are tested in dev before production deployment • Instance restarted 3-4 times per year • Designed and developed from the start by small group of experienced Oracle DBAs, developers • Well-architected for efficiency, performance, scalability (in our opinion)
Our Reasons to Upgrade to 10g • Oracle 8i met all of our needs. • So why upgrade? • Oracle 8i desupport. (What difference does it make?) • Gain Oracle 10g experience. (For us, a more compelling reason.)
Our Upgrade Strategy • Restore production hot backup onto dedicated test server. • Export Oracle 8i test database and import into empty Oracle 10g test database. • Why export/import instead of upgrading in place? • Switch all tablespaces to LMTs • Compact all application segments (purges left holes) • Change character set • “Fresh” data dictionary, database components • Worked out a strategy to keep the down time tolerable
Our Upgrade Strategy • Our Oracle 8i and 10g test databases started out with the same data—handy for testing and comparison. • Two critical points to remember when comparing these two test databases: • Application segments in Oracle 10g test database occupied fewer blocks. • Our Oracle 10g test database was 64 bit while our Oracle 8i test database was 32 bit.
Impressions: Upgrade Process • Oracle 10g version 10.1.0.2 and patch set 10.1.0.3 installed very smoothly. • Oracle 10g import utility read our Oracle 8i export file with no issues. • Oracle 10g Upgrade Information Tool accurately pointed out necessary parameter changes. • I've done my share of Oracle installs over the years, and honestly this was one of the smoother ones. (Note: Solaris platform!)
Impressions: Compatibility • Encountered two compatibility issues: • EXTPROC needed reconfiguring (tighter security) and recompiling (32 bit to 64 bit change). • Oracle 10g PLSQL compiler did not like our Oracle 8i wrapped PL/SQL code. (Cause is probably an Oracle 8i export bug.) Rewrapping with Oracle 10g wrapper utility resolved this. • All other application code functioned correctly. • Retained Oracle 8i modplsql client initially. • No interoperability issues encountered.
Impressions: Oracle 10g • Worked well out of the box: • Enterprise Manager Database Control and iSQLPlus were terribly slow, but they worked. • Our system appears as stable on Oracle 10g as it was on Oracle 8i: • No ORA-600s or other funnies. • Caveat: We are using few Oracle 9i and bare minimum Oracle 10g new features.
Impressions: Oracle 10g • Bigger, bulkier, hungrier for system resources: • Bigger executable size, shared pool, SYSTEM tablespace… • More overhead: • Daemon processes, hard parses, statistics collection… • Overhead and bulkiness were tolerable for us.
Impressions: Oracle 10g • Application performance was about the same: • Most SQL consumed similar resources. • Due to our hints, OLTP nature, we had not expected Oracle 10g to run noticeably faster. • Very few queries ran slow enough in Oracle 10g to be a problem. • Oracle 10g did better than 8i when hints were removed, but not as well as either version with the hints in place. • If we had started out on Oracle 10g, do we think we could have done without manual query optimization (hints)? We do not believe so.
Impressions: Oracle 10g • Discouraged by SQL Tuning Advisor. (But did not test exhaustively due to frustration.) • The bottom line for us: • Install and upgrade went better than we expected. • Increased overhead and heft are manageable—a fair exchange for increased functionality and sophistication. • We expect to get more out of our system than was possible with Oracle 8i, once we leverage newer features. (But will proceed in this direction very cautiously!)
Upgrade Issues in Greater Detail • Sizing the shared pool and SGA • Optimizer statistics collection and accuracy • Query optimization • SQL Tuning Advisor • Overhead
Sizing the Shared Pool and SGA • We like SGA to be only as large as necessary. • Oracle 8i settings: • shared_pool_size = 40 Mb • Total SGA size was 84 Mb • Oracle 8i performance characteristics: • 50,000 lines of PL/SQL code • 15-20 executions per second • Under 660 hard parses per day • Buffer cache hit ratio > 97% • Library cache hit ratio ~100%
Sizing the Shared Pool and SGA • Oracle 10g settings: • shared_pool_size = 144 Mb • Total SGA size is 194 Mb • Why? • Minimum shared_pool_size setting for 64 bit platforms is 144 Mb according to Metalink document 263809.1 • Recommended by Upgrade Information Tool as well
Sizing the Shared Pool and SGA • Just to satisfy a curiosity… • shared_pool_size = 48 Mb on Oracle 10g: • Instance would not start • shared_pool_size = 64 Mb on Oracle 10g: • Instance started, but frequent ORA-4031 errors • shared_pool_size = 96 Mb on Oracle 10g: • Everything seemed to work properly • We run Oracle 10g in production with: • shared_pool_size = 144 Mb
Reasons for Larger Shared Pool • Three reasons why the shared_pool_size setting needs to be increased when upgrading to Oracle 10g: • Allocation for overhead • Shared SQL area memory usage • SQL statements generated by Oracle
Allocation for Overhead • A portion of the shared pool is used to hold internal memory structures (overhead). • Oracle 8i and 9i make the shared pool larger than shared_pool_size specifies in order to allow space for this overhead. • Oracle 10g does not make the shared pool larger than shared_pool_size specifies. • Thus Oracle 10g gives you less usable space in the shared pool for the same shared_pool_size setting. • See Metalink document 270935.1.
Allocation for Overhead • On our Oracle 8i database the shared pool was about 3 Mb (8%) larger than specified by shared_pool_size: SQL> SELECT SUM (bytes) / 1024 / 1024 actual_pool_size 2 FROM v$sgastat 3 WHERE pool = 'shared pool'; ACTUAL_POOL_SIZE ---------------- 43.1291847 SQL> SHOW PARAMETER shared_pool_size NAME TYPE VALUE ------------------------------------ ------- ------------------------- shared_pool_size string 41943040 • We’ve seen the disparity as high as 27%.
Shared SQL Area Memory Usage • Individual SQL statements appear to occupy more memory in the shared SQL area in Oracle 10g than in Oracle 8i. • In our environment the difference was almost 2x. • The move from 32 bit Oracle software to 64 bit accounts for much of this growth. • How much, we don’t know.
Shared SQL Area Memory Usage • On our Oracle 8i database: SQL> SELECT A.username, COUNT(*), SUM (B.sharable_mem) sharable_mem, 2 SUM (B.persistent_mem) persistent_mem, 3 SUM (B.runtime_mem) runtime_mem, 4 SUM (B.sharable_mem + B.persistent_mem + B.runtime_mem) 5 total_mem 6 FROM dba_users A, v$sql B 7 WHERE A.username = 'DBRX_OWNER‘ 8 AND B.parsing_user_id = A.user_id 9 GROUP BY A.username; USERNAME COUNT(*) SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM TOTAL_MEM ------------ -------- ------------ -------------- ----------- ---------- DBRX_OWNER 362 6,275,020 256,176 1,996,324 8,527,520
Shared SQL Area Memory Usage • On our Oracle 10g database: SQL> SELECT A.username, COUNT(*), SUM (B.sharable_mem) sharable_mem, 2 SUM (B.persistent_mem) persistent_mem, 3 SUM (B.runtime_mem) runtime_mem, 4 SUM (B.sharable_mem + B.persistent_mem + B.runtime_mem) 5 total_mem 6 FROM dba_users A, v$sql B 7 WHERE A.username = 'DBRX_OWNER‘ 8 AND B.parsing_user_id = A.user_id 9 GROUP BY A.username; USERNAME COUNT(*) SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM TOTAL_MEM ------------ -------- ------------ -------------- ----------- ---------- DBRX_OWNER 360 12,941,006 487,048 3,361,160 16,789,214
SQL Generated by Oracle • The shared SQL area on any Oracle instance will contain statements issued by Oracle itself and not by the application. • Often called “internal SQL” or “recursive SQL”. • Automatic and self-management infrastructure in Oracle 10g (database and EM Database Control) generates a lot of internal SQL. • The shared pool will need to be larger in order to accommodate the extra statements.
SQL Generated by Oracle • Internal SQL took up an order of magnitude more space in the shared SQL area of our Oracle 10g test database than our Oracle 8i test database. • Internal SQL took up more space in Oracle 10g than our application code. • Caveat: • The Oracle 8i test database was Standard Edition with minimal options installed. • The Oracle 10g test database was Enterprise Edition with “default” options installed.
SQL Generated by Oracle • On our Oracle 8i database: SQL> SELECT A.username, COUNT(*), SUM (B.sharable_mem) sharable_mem, 2 SUM (B.persistent_mem) persistent_mem, 3 SUM (B.runtime_mem) runtime_mem, 4 SUM (B.sharable_mem + B.persistent_mem + B.runtime_mem) 5 total_mem 6 FROM dba_users A, v$sql B 7 WHERE A.username IN ('DBSNMP', 'SYS', 'SYSTEM', 'SYSMAN') 8 AND B.parsing_user_id = A.user_id 9 GROUP BY A.username; USERNAME COUNT(*) SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM TOTAL_MEM ------------ -------- ------------ -------------- ----------- ---------- SYS 192 2,331,619 125,356 569,688 3,026,663 SYSTEM 30 810,325 19,644 163,480 993,449 ------------ -------------- ----------- ---------- sum 3,141,944 145,000 733,168 4,020,112
SQL Generated by Oracle • On our Oracle 10g database: SQL> SELECT A.username, COUNT(*), SUM (B.sharable_mem) sharable_mem, 2 SUM (B.persistent_mem) persistent_mem, 3 SUM (B.runtime_mem) runtime_mem, 4 SUM (B.sharable_mem + B.persistent_mem + B.runtime_mem) 5 total_mem 6 FROM dba_users A, v$sql B 7 WHERE A.username IN ('DBSNMP', 'SYS', 'SYSTEM', 'SYSMAN') 8 AND B.parsing_user_id = A.user_id 9 GROUP BY A.username; USERNAME COUNT(*) SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM TOTAL_MEM ------------ -------- ------------ -------------- ----------- ---------- DBSNMP 99 4,161,758 137,504 1,701,032 6,000,294 SYS 695 24,402,627 1,024,744 8,103,496 33,530,867 SYSMAN 670 16,644,400 806,904 4,403,720 21,855,024 SYSTEM 14 533,442 18,152 290,280 841,874 ------------ -------------- ----------- ---------- sum 45,742,227 1,987,304 14,498,528 62,228,059
Optimizer Statistics • Collected optimizer statistics weekly in Oracle 8i:ANALYZE TABLE table_name ESTIMATE STATISTICS SAMPLE 5 PERCENT; • Oracle 10g uses gather_stats_job: • Automatic job runs nightly 10 pm to 6 am. • Uses dbms_stats. • Only collects statistics where missing or stale. • Sample size and histograms “automatic.” • This is all set up automatically out of the box.
Optimizer Statistics: Cost • Automatic statistics collection in Oracle 10g is more resource intensive than ANALYZE was in Oracle 8i:
Histogram Creation • Histograms are one reason statistics collection in Oracle 10g is so much more expensive: • Our setup on Oracle 8i created no histograms. • Oracle 10g created lots of histograms: SQL> SELECT histogram, COUNT(*) 2 FROM user_tab_columns 3 GROUP BY histogram; HISTOGRAM COUNT(*) --------------- ---------- FREQUENCY 267 HEIGHT BALANCED 74 NONE 1202 ---------- sum 1543
Histogram Creation • If a column has ever been used in a WHERE clause, Oracle 10g will consider creating a histogram for it (note col_usage$): • FREQUENCY histograms for low cardinality columns • HEIGHT BALANCED histograms for columns with gaps or skewed data distribution • Many of the histograms won’t be useful: • On unindexed columns that only appear in WHERE clauses alongside a selective, indexed column • On columns that rarely appear in WHERE clauses
Sample Size • Sample size is another reason statistics collection in Oracle 10g was so much more expensive. • Oracle 8i sample sizes were consistent: • Sample sizes on tables over 1 Mb were 4.5 to 5.4%. • Sample sizes on smaller tables were 100%. • Oracle 10g sample sizes were all over the map: • Sample size on 80 Mb table: 100% • Sample size on 1,088 Mb table: 0.4% • Sample size on 760 Mb table: 100%
Sample Size • On our Oracle 10g database: SQL> SELECT A.table_name, A.num_rows, B.bytes / 1024 / 1024 mb, 2 100 * (A.sample_size / A.num_rows) sample_pct 3 FROM user_tables A, user_segments B 4 WHERE A.table_name IN 5 ('SAMPLE_DATA_FILES', 'SAMPLE_JOBS', 6 'COMMON_SQL_PLAN_PARTS', 'SAMPLE_SQL_TEXTS', 7 'SAMPLE_LIBRARY_CACHE_STATS') 8 AND B.segment_type = 'TABLE‘ 9 AND B.segment_name = A.table_name 10 ORDER BY sample_pct; TABLE_NAME NUM_ROWS MB SAMPLE_PCT -------------------------- ----------- ---------- ---------- SAMPLE_DATA_FILES 14,938,632 1,088.00 0.4 SAMPLE_JOBS 1,360,429 54.00 4.1 COMMON_SQL_PLAN_PARTS 174,851 9.00 6.9 SAMPLE_LIBRARY_CACHE_STATS 1,414,830 80.00 100.0 SAMPLE_SQL_TEXTS 6,346,638 760.00 100.0
How Oracle 10g came to sample every row in a 760 Mb table: First, Oracle sampled all 35 columns of the table on 0.0892929621% of the rows. Next, Oracle sampled 8 of the columns on 0.8929296209% of the rows. Next, Oracle sampled 3 of the columns on 8.9292962091% of the rows. Finally, Oracle performed a COUNT (DISTINCT) on one of the columns without a SAMPLE clause. Sample Size
Optimizer Statistics: Accuracy • Oracle 10g optimizer statistics did not appear to be particularly more accurate than those collected by ANALYZE in Oracle 8i. • In particular Oracle 10g’s estimate of distinct column values was sometimes less accurate than Oracle 8i’s. • Could have been caused by excessively small sample size on some tables (…just a guess)
Optimizer Statistics: Accuracy • How accurate do optimizer statistics need to be? • If every business process on your system gives satisfactory response time, then the statistics are accurate enough. • But if a business process runs too slowly, can you blame the optimizer statistics? • We will see some queries that got unsatisfactory execution plans in our Oracle 10g test environment. • Is it the statistics? We don’t know.
Query Optimization Queries in our application follow an OLTP workload model. All run quickly (except for quarterly purge). Quick, but some are complex. We believe we’ve written practical, logical SQL. Oracle 8i ran most of our SQL efficiently: We added hints to SQL only when response time concerns arose. About 50 statements throughout the application have hints.
Query Optimization Did not expect things to run faster in Oracle 10g. Queries already had efficient execution plans in 8i. We expect the gains to come when we leverage Oracle 9i and 10g new features. Concern: What if some queries run slower in Oracle 10g? In a business process with 100 SQL statements, it only takes one bad execution plan to slow the whole process down.
The Executive Summary Most SQL in our application consumed roughly the same CPU time and number of logical reads in Oracle 10g as in Oracle 8i. Some statements ran a little faster, and a few ran a little slower. Most workload operations yielded similar response times in both versions of Oracle. Only a very few SQL statements were slow enough on Oracle 10g to cause concern.
Query Optimizer Challenge Could Oracle 10g find efficient execution plans for the queries that required hints in Oracle 8i? Is adding hints to queries a thing of the past? Well… not yet: Oracle 10g ran the troublesome queries faster without hints than Oracle 8i without hints. However, both versions of Oracle ran the queries faster with hints than Oracle 10g did without hints.
Query Optimization in Detail SQL that ran similarly in Oracle 8i and 10g SQL that ran faster in Oracle 10g SQL that ran faster in Oracle 8i
SQL That Ran Similarly Loader Daemon comparison Performance Summary report comparison See the white paper for TKPROF report excerpts
Loader Daemon Comparison Loader Daemon parses, validates, and loads files from our monitoring agents into the database for analysis and reporting. PL/SQL package roughly 7,800 lines long. 7 SQL statements in the package have hints. Starting out with the same data in the Oracle 8i and 10g test databases, we traced the Loader Daemon on each database while loading the same agent file into each.
Loader Daemon Comparison Business process gave roughly same response time and load profile on Oracle 8i and 10g. Fewer logical reads on Oracle 10g: Import made 10g segments more compact. More user SQL statements traced on Oracle 10g: Oracle 10g database had smaller PL/SQL cursor cache due to behavior change implemented in 9.2.0.5 re open_cursors. (See Metalink document 274496.1.) Cache misses lead to extra (soft) parse calls. TKPROF reported these extra parse calls as extra traced statements.