![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
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 :
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=75Oracle peut choisir une autre configuration (pour les default buffers) plus appropriée si certaines règles ne sont pas respectées :
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 999Les 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; |
||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||