sga之library cache 內部原理

2022-08-20 02:45:18 字數 3100 閱讀 6435

library cache(庫快取)是shared pool中的一塊記憶體區域,它的主要作用是快取剛剛執行過的sql語句和pl/sql(包括儲存過程、包、函式、觸發器)所對應的解析計畫、解析樹等物件,當同樣的sql或pl/sql再次被執行時,就可以直接利用在library cache中的那些相關物件,而無需再次從頭開始解析,這樣提高了這些語句的執行效率。

檢視library cache在記憶體中的位置。

快取在library cache中的物件我們稱之為庫快取物件(library cache object),所有的庫快取物件都是以庫快取物件控制代碼(library cache object handle)的結構儲存在library cache中,oracle通過訪問庫快取物件控制代碼來訪問庫快取物件。

庫快取物件控制代碼是oracle自定義的一種c語言複雜結構,它是以hash table的方式儲存在library cache中的,這意味著oracle會通過hash運算來儲存和訪問對應的庫快取物件控制代碼。

下圖為從hash角度分析庫快取的構成:

由上圖可看出,整個library cache可以看作是一組由hash bucket所組成,每乙個hash bucket所對應的不同的雜湊值。對於單個bucket而言,裡面儲存的就是雜湊值相同的所有庫快取物件控制代碼,同乙個hash bucket中不同的庫快取物件控制代碼之間會用指標鏈結起來,即同乙個hash bucket中不同的庫快取物件控制代碼之間實際上組成了乙個庫快取物件控制代碼鍊錶(library cache object handles)。乙個library handle管理著乙個libirary cache object(lco),handle對實際的lco起到元資料和指標作用,lco儲存著實際資訊。

當執行select * from employees時,oracle會計算sql文字的雜湊值,以此尋找相關的hash bucket,遍歷庫快取物件控制代碼鍊錶,如果能找到則可直接使用解析計畫、解析樹等資訊,若找不到,則需要從頭開始解析,生成解析樹、解析計畫等並儲存在library cache object handle中。

library cache object handle結構圖:

庫快取物件控制代碼有name、namespace等屬性組成,著重分析name、namespace、heap 0這三個屬性。

屬性「name」表示庫快取物件控制代碼所對應的庫快取物件名稱。例如如果是sql語句對應的庫快取物件控制代碼,則屬性name就是該sql語句的sql文字;如果是表對應的庫快取物件控制代碼,則屬性name就是該錶的表名。

屬性「namespace」 表示的是庫快取物件控制代碼對應的庫快取物件所在的分組名,不同型別的庫快取物件控制代碼可能屬於同乙個分組。

屬性 「heap 0 pointer」:這裡要說明下library cache object handle類似c語言的結構體,library cache object handle中還巢狀了一些子結構,其中heap 0 pointer是指向子結構heap 0的指標

在library cache中,bucket初始化的數量受隱藏引數 _kgl_bucket_count引數控制。

值為9,則理論上應分配2^9*256=131072個bucket.

通過library cache dump可發現,bucket為131072。在library cache dump中,size為buckest的數量,count為object handles的數量。

heap 0 pointer(一說為heap 0 object)就是指向子結構heap 0的指標,heap 0 的結構如下:

heap 0 也是一種複雜的結構,它有很多屬性,

data blocks屬性。

分別以sys使用者和test使用者建立一張一摸一樣的表。

sql> show user

user is "sys"

sql> create table t as select * from v$mystat;

table created.

另起乙個連線,用資料庫使用者test登入

sql> show user

user is "test"

sql> create table t as select * from v$mystat;

table created.

以倆個使用者為基礎分別執行select * from t where t.statistic#=671;

查詢該sql的sql_id和hash_value

執行library cache dump

sql> alter session set events 'immediate trace name library_cache level 10';

session altered.

通過sql_id或hash value查詢dump, 可在dump中找到關於該sql的內容,如下圖

以上圖為例分析library cache結構

bucket: #=114283 mutex=0x9bdc28e8(0, 20, 0, 6)

libraryhandle:  address=0x84e5fb00 hash=cb15be6b lockmode=n pinmode=0 loadlockmode=0 status=vald

--bucket號,hash=cb15be6b此處採用的是16進製制,轉換為十進位制的值為3407199851,正好與上面v$sqltext中查出來的值一致。

objectname:  name=select * from t where t.statistic#=671

--object 的名稱 即上面說過的name屬性,也就是lco(library cache objects)

fullhashvalue=9581b1f4c50e25f2e8500930da5a0101 namespace=sql area(00) type=cursor(00) identifier=0 owneridn=0

--上面說過的namespace,尚不太清楚fullhashvalue的含義

childtable:  size='16'

child:  id='0' table=0x87b03f60 reference=0x87b039c8 handle=0x98efe438

child:  id='1' table=0x87b03f60 reference=0x87b03d10 handle=0x83595530

--倆個child cursor

oracle設定記憶體SGA

首先以sysdba身份登入 sqlplus connect system orcl as sysdba 然後修改引數 1.sga target不能大於sga max size,可以設定為相等。2.sga加上pga等其他程序占用的記憶體總數必須小於作業系統的物理記憶體。alter system set...

sga與核心引數

在資料庫配置過程中,sga的限制一般來自三個方面 1.物理記憶體及可用的swap 2.核心引數shmmax 3.其他作業系統在共享記憶體上的限制通常核心引數的配置會影響到sga中部分引數的配置,核心引數與init.ora的對應關係如下 init.ora parameter kernel parame...

Oracle10g之SGA與PGA分配建議

關於sga pga與系統記憶體三者間的關聯,目前有乙個相對通用的計算規則可供參考 對於oltp資料庫,sga 系統記憶體 70 80 pga sga 10 20 sga 系統記憶體 0.56 pga 系統記憶體 0.05 0.1 對於olap資料庫,sga 系統記憶體 80 60 pga sga 4...