Database Journal
MS SQL Oracle DB2 Access MySQL PostgreSQL Sybase PHP SQL Etc SQL Scripts & Samples Tips Database Forum Rss Feed

» Database Journal Home
» Database Articles
» Database Tutorials
MS Access
SQL Scripts & Samples
» Database Forum
» Slideshows
Free Newsletters:

News Via RSS Feed

Rss Feed

Database Journal |DBA Support |SQLCourse |SQLCourse2

Featured Database Articles


Posted Mar 14, 2003

Activating, Monitoring, and Tuning Automatic PGA Memory Management via PGA_AGGREGATE_TARGET Under Oracle 9i - Page 3

By Jim Czuprynski

Jim Czuprynski

Monitoring PGA Memory Usage

Once enough processing cycles have elapsed for the database, it is time to determine if the initial PGA size was underestimated (or perhaps even overestimated). Oracle 9i provides several dynamic views for monitoring how well the database is managing PGA memory allocations.

Querying V$PROCESS lets us see how Oracle processes are utilizing PGA memory, especially what PGA memory is in use, how much has been allocated, and what's the high-water mark for PGA memory for the process:

   pga_used_mem "PGA Used",
   pga_alloc_mem "PGA Alloc",
   pga_max_mem "PGA Max"
  FROM v$process;

PROGRAM	 	PGA Used	PGA Alloc   PGA Max
----------------	----------- -----------	----------
ORACLE.EXE		132568	198925	198925

V$SQL_WORKAREA_HISTOGRAM contains information about how many work areas have been executed with optimal, one-pass, and multi-pass memory size since the instance was started within a range of work area sizes, defined by LOW_OPTIMAL_SIZE and HIGH_OPTIMAL_SIZE:

   low_optimal_size/1024 "Low (K)",
   (high_optimal_size + 1)/1024 "High (K)",
   optimal_executions "Optimal",
   onepass_executions "1-Pass",
   multipasses_executions ">1 Pass"
  FROM v$sql_workarea_histogram
 WHERE total_executions <> 0;

   Low (K)   High (K)    Optimal     1-Pass    >1 Pass
---------- ---------- ---------- ---------- ----------
        16         32     155213          0          0
        32         64       1240          0          0
        64        128        651         42          0
       128        256         86          0          0
       256        512         90          0          0
       512       1024       1444          0          0
      1024       2048         52          0          0
      2048       4096         42          0          0
      4096       8192         14          0          0
      8192      16384         12          0          0
     16384      32768          3          0          0
     32768      65536          1          6          0
     65536     131072          0          6          0

The results from this query show that almost all of the PGA work areas are sized optimally, except for a few in the 64K to 128K range, and a handful of larger queries in the 32M to 128M range.

Yet another query against this view summarizes the number of times work areas were executed in optimal, one-pass, and multi-pass modes since the instance was started. Note that this query looks at all work areas; smaller work areas can be screened out by adding the appropriate selection criteria:

   optimal_count "Optimal", 
   round(optimal_count * 100 / total,2) "Optimal %",
   onepass_count "OnePass",
   round(onepass_count * 100 / total,2) "Onepass %",
   multipass_count "MultiPass", 
   round(multipass_count * 100 / total,2) "Multipass %"
  FROM (
         DECODE (SUM(total_executions), 0, 1, SUM(total_executions)) total,
         SUM(optimal_executions) optimal_count,
         SUM(onepass_executions) onepass_count,
         SUM(multipasses_executions) multipass_count
        FROM v$sql_workarea_histogram
-- Limits consideration of queries with LOW_OPTIMAL_SIZE limit <64K 
-- WHERE low_optimal_size > 64*1024);

Optimal Optimal % OnePass Onepass % MultiPass Multipass %
------- --------- ------- --------- --------- -----------
 158848     99.97      54      0.03         0           0

These results reveal some good news--the majority of work areas are being executed in optimal mode, with a very small number requiring one-pass or multi-pass execution. Since my database is primarily used for OLTP, this is not surprising; however, if it were used for DSS, I'd expect a lower optimal percentage.

The V$SQL_WORKAREA view allows us to take a more detailed look at the work areas themselves. Here is a sample query that returns the first 20 work areas with the largest optimal sizes:

          FROM v$sql_workarea
      ORDER BY estimated_optimal_size)

---------------- -------------------- ---------- ----------------------
40328AE0         SORT                 AUTO                        19456
4626B5F8         SORT                 AUTO                        19456
4626B5A0         SORT                 AUTO                        19456
4F50F318         GROUP BY (SORT)      MANUAL                      19456
46273298         SORT                 AUTO                        19456
4F96B514         GROUP BY (SORT)      AUTO                        19456
433B1C9C         GROUP BY (SORT)      AUTO                        19456
4C3401D8         SORT                 AUTO                        19456
41C446B8         SORT                 AUTO                        19456
425B1208         SORT                 AUTO                        19456
40D2160C         GROUP BY (SORT)      AUTO                        19456
44AF763C         GROUP BY (SORT)      AUTO                        19456
3FF5E1E4         GROUP BY (SORT)      AUTO                        19456
3FF5E23C         BUFFER               AUTO                        19456
412EA56C         GROUP BY (SORT)      AUTO                        19456
4EC0CD74         BUFFER               AUTO                        19456
42AA3470         GROUP BY (SORT)      AUTO                        19456
412C3580         GROUP BY (SORT)      AUTO                        19456
4D521A98         SORT                 AUTO                        19456
473CD39C         SORT                 AUTO                        19456

Note that the address column of V$SQL_WORKAREA can be joined to V$SQL.address to obtain the actual SQL statements that are being executed in the work area. This can be helpful in tracking back a SQL query to its work area and determining if it's running in optimal, one-pass, or multi-pass mode.

Tuning PGA Memory Usage

Once a baseline has been established, PGA sizing can be tuned by consulting another useful view, V$PGA_TARGET_ADVICE. This view shows how the current setting for the PGA compares to its optimal usage historical usage, and offers advice on what would happen if the PGA was increased or decreased in size by looking at PGA statistics since the instance was last started. Here is a sample query:

   ROUND(pga_target_for_estimate /(1024*1024)) "Target (M)",
   estd_pga_cache_hit_percentage "Est. Cache Hit %",
   estd_overalloc_count "Est. Over-Alloc"

Target (M) Est. Cache Hit % Est. Over-Alloc
---------- ---------------- ---------------
        50               62              36
       100               85               3
       200               86               0
       300               87               0
       400               88               0
       480               88               0
       560               88               0
       640               88               0
       720               88               0
       800               88               0
      1200               93               0
      1600              100               0
      2400              100               0
      3200              100               0

This result set shows that by increasing the size of PGA_AGGREGATE_TARGET beyond my initial estimate of 400MB to 1200MB, the database would eventually improve its performance significantly beyond the estimated cache hit ratio. This is not surprising, since the original allocation formula suggested a value of approximately 1310MB for OLTP database usage. Of more interest, however, is that there is very little additional gain in allocating more than 1200MB to PGA_AGGREGATE_TARGET.

Oracle acknowledges that there is a point of diminishing return when almost all work areas are executed in optimal or one-pass mode. Therefore, Oracle recommends concentrating any tuning efforts upon first insuring that PGA_AGGREGATE has been set high enough that there is no memory over-allocation (see the previous V$PGASTAT query for more information).

Finally, be sure that the STATISTICS_LEVEL initialization parameter has been set to either TYPICAL (the default) or ALL. If this parameter is set to BASIC, the V$PGA_TARGET_ADVICE view is disabled.

Notes on SHARED connections

Finally, it is important to remember that automatic PGA memory management via PGA_AGGREGATE_TARGET only applies to dedicated server connections. Memory allocation for shared server connections is still managed by SORT_AREA_SIZE, HASH_AREA_SIZE, and so forth.

References and Additional Reading

While there is no substitute for direct experience, reading the manual is not a bad idea, either. I have drawn upon the Oracle documentation in Chapter 14 of Oracle 9i Database Performance Tuning Guide and Reference (A996533-01) for much of the technical details of this article.

Jim Czuprynski is an Oracle DBA for a telecommunications company in Schaumburg, IL. He can be contacted at jczuprynski@zerodefectcomputing.com.

Oracle Archives

Latest Forum Threads
Oracle Forum
Topic By Replies Updated
Oracle Data Mining: Classification jan.hasller 0 July 5th, 07:19 AM
Find duplicates - Unique IDs Lava 5 July 2nd, 08:30 AM
no matching unique or primary key rcanter 1 April 25th, 12:32 PM
Update values of one table based on condition of values in other table using Trigger Gladiator 3 February 29th, 06:01 PM