亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sga中library cache的內部原理是什么

發布時間:2021-11-29 14:48:06 來源:億速云 閱讀:244 作者:柒染 欄目:關系型數據庫

本篇文章給大家分享的是有關sga中library cache的內部原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、概述

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





sga中library cache的內部原理是什么

   

      緩存在library cache中的對象我們稱之為庫緩存對象(library cache object),所有的庫緩存對象都是以庫緩存對象句柄(library cache object handle)的結構存儲在library cache中,oracle通過訪問庫緩存對象句柄來訪問庫緩存對象。

     庫緩存對象句柄是oracle自定義的一種c語言復雜結構,它是以hash table的方式存儲在library cache中的,這意味著oracle會通過hash運算來存儲和訪問對應的庫緩存對象句柄。

     下圖為從hash角度分析庫緩存的構成:

        sga中library cache的內部原理是什么
      由上圖可看出,整個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結構圖:

             sga中library cache的內部原理是什么

      庫緩存對象句柄有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參數控制。

         sga中library cache的內部原理是什么

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


通過library cache dump可發現,bucket為131072。在library cache dump中,size為Buckest的數量,count為Object Handles的數量。

        sga中library cache的內部原理是什么

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

sga中library cache的內部原理是什么

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

tables屬性:記錄的是與該heap 0所在的庫緩存對象有關的庫傳訊對象句柄地址集合。Tables分為許多細類。

Data blocks屬性。

 二、dump驗證

      分別以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

    sga中library cache的內部原理是什么    
            sga中library cache的內部原理是什么

    執行library cache dump

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

Session altered.


通過sql_id或hash value查詢dump, 可在dump中找到關于該sql的內容,如下圖
        sga中library cache的內部原理是什么

以上圖為例分析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

以上就是sga中library cache的內部原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

方正县| 手游| 黔西| 修水县| 行唐县| 嘉定区| 开化县| 莎车县| 合作市| 西乡县| 原阳县| 玉屏| 华安县| 太湖县| 杭州市| 丁青县| 高密市| 凉城县| 太康县| 尼玛县| 丰宁| 紫金县| 通山县| 曲靖市| 临西县| 东城区| 南投县| 工布江达县| 宝坻区| 长白| 朝阳区| 寿宁县| 河东区| 夏河县| 惠州市| 临澧县| 安平县| 宜良县| 平山县| 宜川县| 新沂市|