Previous | Table of Contents | Next

Page 643


    11     cache buffers chains
    12     cache buffer handles
    13     multiblock read objects
    14     cache protection latch
    15     cache buffers lru chain
    16     system commit number
    17     archive control
    18     redo allocation
    19     redo copy
    20     KCL freelist latch
    21     KCL name table latch
    22     instance latch
    23     lock element parent latch
    24     loader state object freelist
    25     dml lock allocation
    26     list of block allocation
    27     transaction allocation
    28     sort extent pool
    29     undo global data
    30     ktm global data
    31     sequence cache
    32     row cache objects
    33     cost function
    34     user lock
    35     global tx free list
    36     global transaction
    37     global tx hash mapping
    38     shared pool
    39     library cache
    40     library cache load lock
    41     virtual circuit buffers
    42     virtual circuit queues
    43     virtual circuits
    44     NLS data objects
    45     query server process
    46     query server freelists
    47     error message lists
    48     process queue
    49     process queue reference
    50     parallel query stats
    51     parallel query alloc buffer
    52     device information

cache buffers lru (Least Recently Used) chainThe cache buffers lru chain latch is responsible for protecting the access paths to db block buffers in the buffer cache. The buffer cache size defined by the init.ora parameter db_block_buffers resides in the SGA and contains the cached copy of data read from data files. When processes need to read data, the presence of the data in this buffer as a result of the data being read in by some process makes the read very I/O-efficient.

The buffer cache is organized in two lists: the dirty list and the LRU list. The dirty list contains the buffers, that have been modified but not written to the disk yet. The LRU list is comprised of the pinned buffers, the dirty buffers that have not yet been moved to the dirty list, and the free buffers. The pinned buffers are buffers that are currently accessed by other processes.

Page 644

The dirty buffers contain buffers that are to be written to the disk, and they then subsequently get moved to the dirty list. The free buffers are the buffers that are available for use.

When a process needs to read data from the disk that is not already present in the cache, it needs a free buffer to read in the new data. It scans the LRU list to check for free buffers. If there are excessive requests for free buffers in the buffer cache there will be a high access to the LRU list causing contention for the cache buffer LRU chain.

The contention for this latch can be minimized by the init.ora parameter db_block_lru_latches, which is available in Oracle 7.3. By increasing the db_block_lru_latches value, the contention can be minimized for this latch. The maximum value for this parameter is double the number of CPUs.

The basic reason for contention for this latch is a high request for free buffers. You can optimize the SQL statements to minimize the high demand for free buffers or increase the db_block_buffer parameter to increase the number of free buffers available on the system.

NOTE
Note that the SGA must fit into a contiguous chunk of real memory, so if the buffer cache is enlarged, you must ensure that there is enough contiguous memory available on the system to service the increase.n

redo allocation and redo copyThe redo allocation and redo copy latches control the write access to the redo log buffer. When a process requires writing to the redo log buffer, one of these latches is to be acquired by the process. If the size of the redo log information written to the redo log buffer is less than log_small_entry_max_size parameter, the process will use the redo allocation latch. If the size is greater than this value, the process is copied using the redo copy latch.

A quick way to check whether there is any contention on the redo log buffer is to check whether there are any waits associated with writing to the redo log buffer. This can be done by using the system view v$sysstat:

Select name, value
From v$sysstat
Where name = `redo log space requests';

Output Table:

Name                                        Value

----------------------------------------     ----

redo log space requests                        12

The size of the redo log buffer will have to be increased if the number of waits is too high.

Contention for redo allocation LatchThe contention for redo allocation can be reduced on a multi-CPU system by forcing the process to use the redo copy latch instead. Because there can be multiple redo copy latches, the copy will be done more efficiently. The number of redo copy latches is defined by the init.ora parameter log_simultaneous_copies. The maximum number available latches on the system is double the number of CPUs. For a

Page 645

single CPU system, this value is 0, and the redo allocation latch will be used. So, if there is a contention for the redo allocation latch, the value of log_small_entry_max_size can be decreased from its current value so that the redo copy latch is used.

Contention for the redo copy LatchIf the system is facing contention for the redo copy latch, it can be decreased by either increasing the value of log_small_entry_max_size (so that the redo allocation latch is used) or increasing the value of log_simultaneous_copies (so that it increases the number of redo copy latches available).

The init.ora parameter log_entry_prebuild_threshold can be increased so that the data that is written to the redo log buffer is grouped and written out. By increasing the parameter,
a number of write operations can be grouped so that they can be written out in one operation, thereby reducing requests for these latches and thus contention.

library cacheThis latch is primarily concerned with control of access to the library cache. The library cache includes shared SQL area, private sql areas, PL/SQL procedures packages, and other control structures. Shared SQL area contains SQLs that are shared among multiple sessions. By increasing the sharing of these SQLs, contention to this latch can be avoided.

Contention for this latch occurs when there is a lot of demand for space in the library cache. Very high parsing on the system and heavy demand to open a new cursor because of low sharing among processes are some of the common causes for contention for this latch.

Contention for this latch can be avoiding by using code that can be shared by multiple sessions. For example, the RDBMS treats the following two SQLs differently:

select name from employee where emp_id = 100;

and

Select name from employee where emp_id = 100;

Though both the SQL statements look the same, the hash values of these statements are different. One of the statements has select in upper case and the other one has select in lower case. Therefore, when this statement is issued, the RDBMS will parse both the statements individually as different statements, thus causing load on the latches. This situation can be avoided by developing coding standards wherein indentation and case standards are implemented so that every SQL statement written would have the same hash value as far as possible. Note that even putting more empty spaces causes one select to be different from another, causing increased parsing.

Using bind variables in SQL statements can increase the sharing of the same clauses. For example, consider the two cases, not using bind variables:

Select sal from employee where emp_id = 100;

Select sal from employee where emp_id = 200;

or, using bind variables:


Select sal from employee where emp_id  := emp_id;

Previous | Table of Contents | Next