"He can compress
the most words into the smallest idea of any man I know." -
Abraham Lincoln (1809-1865) |
Read
first then play the video:
PRF-VIDEO -Measuring
the Buffer Cache Hit Ratio
More on Resizing and
Measuring the Buffer Cache Hit Ratio
Introduction
As a DBA, you are
responsible for monitoring and calculating the Buffer Cache Hit Ratio
in the SGA memory in case of performance problems. Your job"s
responsibilities dictate that you should at least be informed of the
following basic fundamental subjects:
Measuring the Buffer Cache
Hit Ratio
Creating a cache table
Calculating the Hit Ratio
for Multiple Pools
Displaying the Hit Ratio
for the KEEP buffer pool
Caching the Oracle objects
in the Buffer Pools
Diagnosing the LIST
contentions
Adding a LIST to a
table
Using the DEFAULT pool
Using the KEEP pool
Using the RECYCLE pool
Using the V$SYSSTAT view
Using the V$BUFFER_POOL
view
Using the
V$BUFFER_POOL_STATISTICS dictionary view
Using the DBA_SEGMENTS view
Using the V$SESSION_WAIT
view
Dropping a table
Commands:
ALTER SYSTEM SET
db_cache_size=60m
ALTER SYSTEM SET
db_keep_cache_size=16m
CREATE TABLE STORAGE (BUFFER_POOL
KEEP)
SELECT /*+ CACHE (iself.dept)
*/
ALTER TABLE STORAGE (LISTS
2)
Hands-on
In this exercise you will
learn how to: measure the Buffer Cache Hit Ratio, create a table to
keep in the KEEP buffer pool, calculate the Hit Ratio for multiple
pools, cache the Oracle objects in the Buffer Pools, diagnose the
LIST contentions, and add a LIST to a table. You also learn
what the DEFAULT, KEEP, and RECYCLE pools are.
Begin by connecting to SQLPlus as the SYSTEM/MANAGER user.
SQL> CONNECT system/manager AS SYSDBA
Buffer Cache Hit Ratio
Let's calculate the Buffer Cache Hit Ratio from the V$SYSSTAT
view. The V$SYSSTAT view contains the Oracle system usages such as
session logical reads, physical reads direct, etc.
SQL> SELECT 1- ((p.value - l.value -
d.value) / s.value)
AS "Buffer Cache Hit
Ratio"
FROM v$sysstat s, v$sysstat l, v$sysstat d, v$sysstat p
WHERE s.name = 'session logical reads'
AND d.name = 'physical reads direct'
AND l.name = 'physical reads direct (lob)'
AND p.name = 'physical reads'
/
Note that if the Buffer Cache Hit Ratio is more than 90%
then there is no problem. If the Buffer Cache Hit Ratio is between 70%
and 90% then there could be a problem. And if the Buffer Cache Hit
Ratio is less than 70%, there is definitely a problem and the Buffer
Cache size needs to be increased.
In the above query, the "physical
reads" value is a number of read that Oracle physically performs
from hard disk including all the "physical reads direct" and "physical
read direct (lob)." You want to be sure that the "physical reads
direct" values be as high as possible in a respect to the "physical
reads" value. Also, you want to be sure that the "session logical
reads" value is very high. The "session logical reads" value is
the number of times that Oracle reads a block from the memory (Buffer
Cache) rather than a disk.
Resize Buffer Cache
Let's first reduce the buffer cache size from 80 megabytes to 60
megabytes in order to add more buffer pool to the memory.
SQL> ALTER SYSTEM SET db_cache_size=60m
/
Allocation KEEP buffer pool
Then, allocate memory space to the KEEP buffer pool.
SQL> ALTER SYSTEM SET db_keep_cache_size=16m
/
Using KEEP buffer pool
Now, you can create a table to be kept in the KEEP buffer pool.
SQL> CREATE TABLE iself.mykeep
(col1 NUMBER,
col2 VARCHAR2(10))
STORAGE (BUFFER_POOL KEEP)
/
Notice that if we don't specify a BUFFER_POOL, the DEFAULT
pool is used.
The V$BUFFER_POOL view
contains the Oracle buffer pools configuration. You can use this view
to query the buffer pool configurations information such as DEFAULT,
KEEP, or RECYCLE pools.
Check how buffer pool was
configured.
SQL> SELECT name, buffers
FROM v$buffer_pool
/
The name column values can be DEFAULT,
KEEP, or RECYCLE
DEFAULT buffer pool
The DEFAULT pool is the
same thing as the standard block size Buffer Cache.
KEEP buffer pool
The KEEP buffer pool is
used to keep buffers in the pool as long as possible for data blocks
that are likely to be reused.
RECYCLE buffer pool
The RECYCLE buffer pool is
used as a temporary host block from segments that you don't want to
interfere with blocks in the DEFAULT Buffer Pool.
Buffer Cache Hit Ratio for
multiple pools
Now, calculate the Hit Ratio for multiple pools using the
V$BUFFER_POOL_STATISTICS dictionary view.
SQL> SELECT name,
1-(physical_reads/(db_block_gets + consistent_gets)) "Hit
Ratio"
FROM v$buffer_pool_statistics
WHERE db_block_gets + consistent_gets > 0
/
Notice that the Hit Ratio for the KEEP buffer pool is very
high.
Cache an object
Now, cache the department table by hint in a SQL statement.
SQL> SELECT /*+ CACHE (iself.dept) */
*
FROM iself.dept
/
Now, the dept table should be in the memory.
Check LIST contention
in Buffer Cache
The LIST space is an allocated space in a table that contains
all the blocks" references which are candidate for more inserted
records. Any contentions on the LIST allocation will create a
performance problem.
Now, let's diagnose the
LIST contention in the Buffer Cache.
SQL> SELECT s.segment_name, s.segment_type,
s.LISTs, w.wait_time,
w.seconds_in_wait, w.state
FROM dba_segments s, v$session_wait w
WHERE w.event='buffer busy waits'
AND w.p1=s.header_file
AND w.p2=s.header_block
/
Note that there is no segment name. Normally that is what
you get when you have no LIST contention problem. If we find
records, we should increase the number LIST on the table in the
question.
Note that the DBA_SEGMENTS
view contains all the created users" segments such as tables,
indexes, etc. The V$SESSION_WAIT view contains dynamic information for
that instance and for that specific time. Its content will be
regenerated when you restart an instance. It contains the contentions
information such as "buffer busy waits" for a file or a block,
etc.
Increase LIST
If you identify a segment header that has a LIST contention,
you can increase the number of LISTs for the segment.
SQL> ALTER TABLE iself.dept
STORAGE (LISTS 2)
/
And you would not have any more LIST contentions.
Drop a table
Drop the iself.mykeep table.
SQL> DROP TABLE iself.mykeep
/
You drop the table so you can repeat this hands-on again if
you wish.
"It's not the
size of the dog in the fight, it's the size of the fight in the
dog." - Mark Twain (1835-1910) |
Questions:
Q: How do you measure the
buffer cache hit ratio?
Q: How do you create a
cache table?
Q: How do you calculate a
hit ratio for multiple pools?
Q: How do you display a hit
ratio for the KEEP buffer pool?
Q: How do you cache an
object into the buffer pools using hint in a SQL statement?
Q: What is a LIST?
Q: How do you diagnose the
LIST contentions in the buffer cache?
Q: How do you use the
DEFAULT pool?
Q: How do you use the KEEP
pool?
Q: When do you use the
RECYCLE pool?
Q: What is the V$SYSSTAT
view?
Q: What is the
V$BUFFER_POOL view?
Q: What is the
V$BUFFER_POOL_STATISTICS dictionary view?
Q: What is a hint in the
SQL statement?
Q: How do you drop a table?
Q: Describe the session
logical reads, physical reads direct, and physical reads direct (lob),
and physical reads in the V$SYSSTAT view?
Q: What is an acceptable
range for a buffer cache hit ratio?
Q: Cache the department
table by using a hint in a SQL statement.
Q: What does the following
SQL statement?
SQL> SELECT s.segment_name, s.segment_type,
s.LISTs, w.wait_time,
w.seconds_in_wait, w.state
FROM dba_segments s, v$session_wait w
WHERE w.event='buffer busy waits'
AND w.p1=s.header_file
AND w.p2=s.header_block
/
|