Call (800) 766-1884 for Oracle support & training
Free Oracle Tips


Oracle Consulting Support
Oracle Upgrades
Use New Oracle Features
Oracle Replication Support
Oracle Training
Remote Oracle DBA
System Documentation
Oracle Tips
Oracle Performance
 

Free Oracle Tips


 

HTML Text

BC Oracle tuning

Oracle training

Oracle support

Remote Oracle

 

 

   
 

Tuning the Buffer Cache

Oracle Tips by Burleson
 

The buffer cache is the area in memory where data is stored from data tables, indexes, rollback segments, clusters, and sequences. By ensuring that enough buffers are available for storage of these data items, you can speed execution by reducing required disk reads. In Oracle7 and early Oracle8 releases, you only had the “normal” buffer area to worry about. To Oracle8i was added the capability to subdivide this buffer area into KEEP and RECYCLE buffer areas. Later in this section, we will examine how these areas interact and how they should be tuned and sized. To add to the complexity you can, in Oracle, also have multiple areas inside the buffers that do not have the same blocksize as the rest of the database. We will cover that in the Oracle tuning section.

If DB_BLOCK_BUFFERS is set too high, you may exceed shared memory size on UNIX or NT for your instance. Another possible result is that the entire Oracle process could be swapped out due to memory contention with other processes. In either case, it is not a desirable condition. To avoid exceeding  shared memory area size, be sure you set these operating system values (on UNIX) high when the instance is created. To avoid swapping, know how much memory you are able to access; talk with your system administrator to find this out.

Tuning the Multipart Oracle8, Oracle8i, and Oracle Buffer Cache

In Oracle8 and Oracle8i, the database block buffer has been split into three possible areas: the default, keep, and recycle buffer pool areas. It is not required that these three pools be used, only one: the default pool, which must be configured with the DB_BLOCK_BUFFERS or DB_CACHE_SIZE (in Oracle, this should be used instead of DB_BLOCK_BUFFERS) initialization parameters; the others are “sub” pool to this main pool.

How the various pools are used is covered in the following subsections.

Use of the Default Pool

If a table, index, or cluster is created specifying that the KEEP or RECYCLE pool be used for its data, then it is placed in the default pool when it is accessed. This is standard Oracle7 behavior; and if no special action is taken to use the other pools, then this is also standard Oracle8, Oracle8i, and Oracle behavior. The initialization parameters DB_BLOCK_BUFFERS and DB_BLOCK_LRU_LATCHES must be set if multiple pools are to be used:

DB_BLOCK_BUFFERS = 2000
DB_BLOCK_LRU_LATCHES = 9
 
NOTE: In Oracle DB_BLOCK_BUFFERS should not be used, Instead set DB_CACHE_SIZE. Also, DB_BLOCK_LRU_LATCHES will be determined Internally.

Use of the KEEP Pool

The KEEP database buffer pool is configured using the BUFFER_POOL_KEEP initialization parameter, which looks like this:

BUFFER_POOL_KEEP = ‘100,2’

In Oracle, this becomes DB_KEEP_CACHE_SIZE and is specified in megabytes.

The two specified parameters are, respectively, the number of buffers from the default pool to assign to the KEEP pool and the number of LRU (least recently used) latches to assign to the KEEP pool. The minimum number of buffers assigned to the pool is 50 times the number of assigned latches. The KEEP pool, as its name implies, is used to store object data that shouldn’t be aged out of the buffer pool, such as lookup information and specific performance-enhancing indexes. The objects are assigned to the KEEP pool either through their creation statement or by specifically assigning them to the pool using the ALTER command. Blocks already in the default pool are not affected by the ALTER command, only subsequently accessed blocks are.

The KEEP pool should be sized such that it can hold all the blocks from all of the tables created with the buffer pool set to KEEP.

Use of the RECYCLE Pool

The RECYCLE database buffer pool is configured using the BUFFER_POOL_RECYCLE initialization parameter, which looks like this:

BUFFER_POOL_RECYCLE = ‘1000,5’

In Oracle, this becomes DB_RECYCLE_CACHE_SIZE and is specified in megabytes.

The two specified parameters are, respectively,  the number of buffers from the default pool to assign to the RECYCLE pool and the number of LRU (least recently used) latches to assign to the KEEP pool. The minimum number of buffers assigned to the pool is 50 times the number of assigned latches. The RECYCLE pool, as its name implies, is used to store object data that should be aged out of the buffer pool rapidly, such as searchable LOB information. The objects are assigned to the RECYCLE pool either through their creation statement or by specifically assigning them to the pool using the ALTER command. Blocks already in the default pool are not affected by the ALTER command, only subsequently accessed blocks are.

As long as the RECYCLE pool shows low block contention, it is sized correctly. With the above setpoints for the default, KEEP and RECYCLE pools, the default pool would end up with 900 buffers and 3 LRU latches.

Tuning the Three Pools

In Oracle8i, the classic method of tuning the shared pool is not available, so we must examine alternative methods to achieve the same ends. This involves looking at what Oracle has provided for tuning the pools. A script, catperf.sql, offers several views for tuning the Oracle buffer pools. These views are:

V$BUFFER_POOL. Provides static information on pool configuration.

V$BUFFER_POOL_STATISTICS. Provides pool-related statistics.

V$DBWR_WRITE_HISTOGRAM. Provides summary information on DBWR write activities.

V$DBWR_WRITE_LOG. Provides write information for each buffer area.

Of these four views, V$BUFFER_POOL_STATISTICS seems the most useful for tuning the buffer pool. It contains statistics such as buffer_busy_waits, free_buffer_inspected, dirty_buffers_inspected, and physical write-related data. 

If a buffer pool shows excessive numbers of dirty_buffers_inspected, and high amounts of buffer_busy_waits, then it probably needs to be increased in size.

In Oracle, the V$DB_CACHE_ADVISE view is available for tuning the buffer areas, which is described in the next subsection.

When configuring LRU latches and DBWR processes, remember that the latches are assigned to the pools sequentially and to the DBRW processes in round-robin fashion. The number of LRU processes should be equal to or a multiple of the value of DBWR processes to ensure that the DBRW load is balanced across the processes.

See Code Depot for Full Scripts


This is an excerpt from Mike Ault, bestselling author of "Oracle 10g Grid and Real Application Clusters".

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

Oracle performance tuning software 
 
 
 
 

Oracle performance tuning book

 

 
 
 
Oracle performance Tuning 10g reference poster
 
 
 
Oracle training in Linux commands
 
Oracle training Excel
 
Oracle training & performance tuning books
 

 

   

Copyright © 1996 -  2014 by Burleson. All rights reserved.

Oracle® is the registered trademark of Oracle Corporation. 

Hit Counter