關於shared pool的深入探討(三)
基本命令:
ALTER SESSION SET EVENTS ‘immediate trace name LIBRARY_CACHE level LL‘;
其中LL代表Level級別,對於9.2.0及以後版本,不同Level含義如下:
Level =1 ,轉儲Library cache統計信息
Level =2 ,轉儲hash table概要
Level =4 ,轉儲Library cache對象,只包含基本信息
Level =8 ,轉儲Library cache對象,包含詳細信息(包括child references,pin waiters等)
Level =16,增加heap sizes信息
Level =32,增加heap信息
Library cache由一個hash表組成,而hash表是一個由hash buckets組成的數組.
每個hash bucket都是包含library cache handle的一個雙向鏈表。
Library Cache Handle指向Library Cache Object和一個引用列表.
library cache對象進一步分為:依賴表、子表和授權表等
我們看一下library cache的結構:
通過
ALTER SESSION SET EVENTS ‘immediate trace name LIBRARY_CACHE level 4‘
獲得以下輸出(這部分信息來自Oracle8i,Trace文件可以從www.eygle.com
點擊這裏下載: hsbi_ora_4614.trc
第一部分(等價於Level 1):
LIBRARY CACHE STATISTICS: |
這部分信息也就是v$librarycache中顯示的.
第二部分(等價於Level 2中的輸出):
|
在Oracle8i中,Oracle以一個很長的LIBRARY CACHE HASH TABLE來記錄Library Cache的使用情況
"*"代表該Bucket中包含的對象的個數
在以上輸出中我們看到Bucket 198中包含四個對象.
我們在第三部分中可以找到bucket 198:
|
我們看到這裏包含了四個對象.
我們再來看看Oracle9i中的情況:
參考文件: hsjf_ora_15800.trc
|
Oracle9i中通過新的方式記錄Library Cache的使用狀況.
按不同的Hash Chain Size代表Library Cache中包含不同對象的個數.
0表示Free的Bucket,>20表示包含超過20個對象的Bucket的個數.
從以上列表中我們看到,包含一個對象的Buckets有217個,包含0個對象的Buckets有130855個.
我們來驗證一下:
|
434/2 = 217,證實了我們的猜想.
通過HASH TABLE算法的改進,Oracle Library Cache管理的效率大大提高.
關於shared pool的深入探討(三)