!
!
!
!
!
!
!
!

BUFFER POOL
Oracle 8 apporte un concept nouveau : la segmentation du buffer cache. En fonction du degré d’utilisation et durée de vie des segments dans la SGA, nous pouvons distinguer à partir de cette version trois types de buffer cache :
  • KEEP : Cette zone du database buffer cache permet de conserver un objet en mémoire le plus longtemps possible. Elle devrait être au moins plus grande que la somme des segments qui l’utilisent
  • RECYCLE : Cette zone permet de stocker un objet rarement utilisé, afin d'éviter de mobiliser de l'espace inutilement, Oracle plaçant les blocs récemment lus dans la partie MRU de la LRU RECYCLE.
  • DEFAULT : comportement par défaut.

Dimensionnement de chaque zone

Leur nom peut être BUFFER_POOL_KEEP ou BUFFER_POOL_RECYCLE. Pour chaque zone deux attributs peuvent être définis : le nombre de buffers ainsi que le nombre de LRU LATCH. Si lru_latch n’est pas spécifié, un seul est défini pour cette liste.
BUFFER_POOL_KEEP=(buffers:300, lru_latch:3)
BUFFER_POOL_RECYCLE=(buffers:50, lru_latch:1)
Le nombre de latch pour le buffer DEFAULT n’est pas renseigné, il est calculé comme différence entre db_block_lru_latch et les latch associés aux buffers KEEP et RECYCLE. Le nombre de buffers du buffer DEFAULT est calculé comme différence entre DB_BLOCK_BUFFERS et BUFFER_POOL_KEEP et BUFFER_POOL_RECYCLE.

Utilisation de chaque zone

L'utilisation de chaque zone du database buffer cache se fait en le spécifiant dans la clause STORAGE.
CREATE TABLE table_name (col_1 number, col_2 number)
PARTITION BY RANGE (col_1)
 (PARTITION A VALUES LESS THAN(10) STORAGE (INITIAL 10k BUFFER_POOL RECYCLE),
  PARTITION B VALUES LESS THAN(20) STORAGE (BUFFER_POOL KEEP));
CREATE INDEX index_name ... STORAGE (buffer_pool_clause)
CREATE CLUSTER cluster_name...STORAGE (buffer_pool_clause)
ALTER TABLE table_name ... STORAGE (buffer_pool_clause)
ALTER INDEX index_name ... STORAGE (buffer_pool_clause)
ALTER CLUSTER cluster_name ... STORAGE (buffer_pool_clause)
La figure suivante montre la géographie du database buffer cache séparé en trois zones, le buffer pool default contient quatre couple de listes protégés par quatre latch, le buffer pool keep contient deux couples de listes, le buffer pool recycle contient un seul couple. La configuration de INIT.ORA contient la description suivante des buffers :
DB_BLOCK_LRU_LATCH=6
BUFFER_POOL_KEEP =(buffers:175, lru_latch:2)
BUFFER_POOL_RECYCLE=75
Oracle peut choisir une autre configuration (pour les default buffers) plus appropriée si certaines règles ne sont pas respectées :
  1. Chaque sous liste doit être composée d’au moins 50 buffers.
  2. La valeur de DB_BLOCK_LRU_LATCH doit être supérieure à 1+ latch de buffer keep + latch de buffer recycle (en fait ceci veut dire qu’au moins un latch est nécessaire pour le buffer pool default).
  3. La valeur de DB_BLOCK_BUFFERS doit être supérieure à 50 * (DB_BLOCK_LRU_LATCH- latch de buffer keep - latch de buffer recycle) + buffers de keep pool +buffers de recycle pool. (cette condition impose un minimum de 50 buffers pour le buffer default).
  4. En reprenant la condition de plus haut, la valeur de DB_BLOCK_LRU_LATCH ne doit pas dépasser
Ni k*CPU, ou k = 2 pour V7.3, k = 6 pour V8
Ni DB_BLOCK_BUFFERS / 50
Dans la configuration dictée par les paramètres présentés plus haut, nous avons obtenu :
SQL> select a.name, a.buffers, b.set_id, b.cnum_set, b.start_buf#, end_buf#
  2  from v$buffer_pool a, x$kcbwds b
  3  where b.set_id >= a.lo_setid and b.set_id <= a.hi_setid
  4  order by b.start_buf#;
NAME       BUFFERS SET_ID   CNUM_SET START_BUF#   END_BUF#
---------- ------- ------ ---------- ---------- ----------
KEEP           175      4         88          0         87
KEEP           175      5         87         88        174
RECYCLE         75      6         75        175        249
DEFAULT        750      1        250        250        499
DEFAULT        750      2        250        500        749
DEFAULT        750      3        250        750        999
Les mille buffers du database buffer cache sont divisés en trois zones, KEEP, RECYCLE et DEFAULT de 175, 75 et 750 buffers respectivement. Le buffer keep est constitué de deux listes de 88 et 87 buffers. Le buffer recycle est constitué d’une liste de 75 buffers. START_BUF# et END_BUF# représente les débuts et les fins des plages d’adresses relatives des buffers dans le cache (0-999 en tout).
Une des questions qu’on nous pose régulièrement est comment dépister les objets qui utilisent le buffer cache (quel table est en mémoire ?). Voici une requête qui nous répondra amplement à la question :
select o.name, count(buf#) BLOCKS
from obj$ o, x$bh x
where o.dataobj# = x.obj
group by o.name
order by blocks;


Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 06/11/2006 !
Commentaires et suggestions radu[CHEZ]tafora.fr