You are on page 1of 1

Row Cache Lock Wait Understood

by Don B. on Aug 19 2009 at 5:17 AM in Wait Time Analysis General


Definition
In order for DDL to execute, it must acquire a row cache lock to lock the Data Dictionary information.   The shared pool
contains a cache of rows from the data dictionary that helps reduce physical I/O to the data dictionary tables and allows
locking of individual data dictionary rows. The locks on the data dictionary rows are called row cache enqueue locks. The
enqueue lock structures are allocated from the shared pool as needed but when these requests wait and time out is when we
see the row cache lock wait.
Analysis
Each row cache lock will be on a specific data dictionary object.  This is called the enqueue type and can be found in the
v$rowcache view. In this sample select from v$rowcache you can find the enqueue types and the type of activity being
performed within the dictionary cache. 

PARAMETER             COUNT GETS       GETMISSES  MODIFICATIONS


--------------------- ----- ------------ ---------- ------------- 
dc_free_extents       0     0          0           0
dc_used_extents       0     0           0          0
dc_segments           5927  131379921    4142831   693734  
dc_tablespaces        22    188609668    2436        0
dc_tablespace_quotas  12    22779303     3843        0
dc_files              0    165961      22493       21
dc_users              19    145681559    2078        21
dc_rollback_segments  67    3906307     66          232
dc_objects            1927  70725250    2247804     74803
dc_sequences          4    142714       1599        142714     

Common Enqueue Types


The tuning of the row cache lock wait is dependent upon the activity for each of the enqueue types. Of these, the most
common are:
 
 DC_SEQUENCES, this row cache lock wait may occur during the use of sequences. Tune by checking sequences to see
if they have the cache option specified and if that cache value is reflective of the anticipated simultaneous inserts by
the application.
 DC_USED_EXTENTS and DC_FREE_EXTENTS, this row cache lock wait may occur during space management operations
where tablespaces are fragmented or have inadequate extent sizes. Tune by checking whether tablespaces are
fragmented, extent sizes are too small, or tablespaces are managed manually.
 DC_TABLESPACES, this row cache lock wait may occur during the allocation of new extents. If extent sizes are set too
low the application may frequently request new extents which could cause contention.  Tune by checking for rapidly
increasing number of extents.
 DC_OBJECTS, this row cache lock wait may occur during the recompilation of objects.  If object compiles are occurring
this can require an exclusive lock which will block other activity.  Tune by examining invalid objects and dependencies.
Conclusion:
The row cache lock wait event is associated with a specific enqueue type on a data dictionary row. Checking activity within the
v$rowcache view is a good place to start for understanding this relationship as tuning can only be accomplished with analysis
of the enqueue type. If a trace file is available you may also see the following error of “>> WAITED TOO LONG FOR A ROW
CACHE ENQUEUE LOCK! <<”. Also realize that the row cache lock wait event may appear more frequently when using RAC. 
This is because the library cache and the row cache are global in RAC—causing the row cache lock wait to be more
pronounced.

You might also like