SHARED_POOL解析

litterbaby發表於2007-04-01
SHARED_POOL解析[@more@]

解析

共享池是SGA中的一部分,主要由以下幾部分組成:

n 庫快取

n 資料字典快取

n 使用者全域性區(共享伺服器模式)

在這裡需要注意的是,共享池的大小定義是由引數SHARED_POOL_SIZE來控制,要合理調整這個引數的大小,以為共享池的內容要比資料庫資料快取更消耗系統的資源。而調整共享池的重點是調整庫快取的命中率上來,因為,在解析時使用的演算法中需要把持記憶體中的資料字典地時間要比庫快取資料的時間要長。

最佳化SHARED_POOL有以下的好處:

1、 避免過渡的SQL文的解析,這樣可以節約伺服器的CPU資源和終端使用者的消耗時間。

2、 減少閂資源的使用。

3、 減少SHARED_POOL記憶體的使用量。

4、 節約I/O資源的使用,減少磁碟的訪問量。

庫快取

存放的是共享SQLPL/SQL的區域,全解析或者編譯PL/SQL塊和SQL語句。其中PL/SQL塊包括:

過程

函式

觸發器

匿名的PL/SQL

庫快取是由幾個名稱空間來進行分組的。這個可以透過查詢檢視V$LIBRARY_CACHE_MEMORY來查詢。

n 每一個物件型別僅僅只能屬於一個名稱空間

n 物件的名字在一個模式中的一個名稱空間是唯一的

n 每個在快取中的庫物件有幾個其他的元件與之關聯

SQL> select lc_namespace from v$library_cache_memory;

LC_NAMESPACE

---------------

BODY

CLUSTER

INDEX

JAVA DATA

JAVA RESOURCE

JAVA SOURCE

OBJECT

OTHER/SYSTEM

PIPE

SQL AREA

TABLE/PROCEDURE

TRIGGER

12 rows selected

庫快取的物件

有兩個層次的物件

n 由外在的SQL或者PL/SQL新增和刪除的儲存物件;例如表,檢視,觸發器等

n 在一個例項的階段中新增或者執行的短暫物件;例如:共享遊標。

共享遊標

共享遊標在庫快取中是一個可以執行的物件的記憶體表現;可能是一個SQL文,一個PL/SQL匿名塊,也可以是過程或者函式。有兩種表現形式:

具有名字的父遊標

一個或者更多的子游標,每個子游標有不同的基礎物件的設定,每個子游標包含著SQL的執行計劃。

庫快取物件

庫快取物件的名字由三部分組成:

n 模式名

n 物件名

n 資料庫連線名

例如 scott.emp@oracle.world

庫快取物件定義

狀態標識

n 存在、不存在

n Being created /dropped /altered /updated

可用不可用標誌

n 可用被授權

n 可用沒有授權

n 編輯錯誤

n 許可權改變

n 物件修改、新增刪除

庫物件表

n 獨立表

每個物件引用只有一個入口

n 子表

n 翻譯表

n 認證表

n 聯絡表

庫快取是分配在sga的頂部,是透過呼叫heap manager層來進行記憶體管理的。庫快取記憶體區域是透過構造一個hash表的結構來實現的,hash表中由一個hash buckets的佇列來實現。每個hash buckets是一個庫物件控制程式碼的連線列表,這些控制程式碼指向和標識出每個庫快取物件的地址。

庫快取管理器透過和記憶體heap manager協調,來請求分配和釋放記憶體空間。物件在bucket中放置的位置是透過hash來指定的,oracle透過一種hash函式演算法,利用物件的名稱空間,命名,所有者和資料庫鏈名來確定庫快取物件的位置。

當程式請求一個物件的時候,Oracle應用hash演算法決定是那個hash buckets存放所需要物件的控制程式碼,這個物件的控制程式碼用於標識和定位庫快取物件,還有名稱空間,名稱,狀態和當前物件鎖的狀態。

如果物件的數目變大的時候,當前初始化hash表的大小不夠用。預設的初始化大小是509,允許hash表擴充套件到7倍。同時也可以改變隱藏引數_kgl_bucket_count來設定,例如:如果設定為4,則初始化hash表的大小為8191

演算法:

使用的是LRU演算法

最佳化庫快取

透過保持解析率最低來保持命中率。

n 確保使用者能夠共享SQL文。

n 透過分配足夠的空間來保證SQL文不被老化。

n 避免不可用來減少重新解析。

避免碎片的產生:

n 為大的記憶體請求保留空間

n Pinging頻繁請求的大的物件

n 去除大的匿名塊

n 在共享伺服器模式連線的時候使用大池

術語

Gets(parse)

查詢物件的數目。

Pin(execution)

讀或者執行物件的次數。

Reloads(reparse)

庫快取中在執行階段沒有找到,而造成隱形的重新編譯語句和塊的次數。

相關的檢視

V$LIBRARY_CACHE_MEMORY

顯示在不同的名稱空間中,分配給庫快取記憶體物件的記憶體資訊。記憶體物件是一組用於管理的內部組。庫快取時由一個或者幾個記憶體物件組成。

SQL> select lc_namespace from v$library_cache_memory;

LC_NAMESPACE

---------------

BODY

CLUSTER

INDEX

JAVA DATA

JAVA RESOURCE

JAVA SOURCE

OBJECT

OTHER/SYSTEM

PIPE

SQL AREA

TABLE/PROCEDURE

TRIGGER

12 rows selected

V$LIBRARYCACHE

這個檢視包含庫快取管理的統計資訊。反映的是自從啟動以來庫快取的統計資訊。

V$SQLTEXT

沒有被刪除的完全SQL文,使用多行顯示。

V$SQLAREA

所有共享遊標的統計資訊。

V$SQL

這個檢視列出的是共享SQL區域中沒有GROUP BY子句的統計資訊。包含每一個子SQL文的入口。

庫快取的大小

資料字典快取

儲存的是在記憶體中儲存字典物件的定義。

使用者全域性區(共享伺服器模式)

是共享伺服器模式下儲存會話資訊。

Library cache dump

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

會話已更改。

SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/222350/viewspace-908031/,如需轉載,請註明出處,否則將追究法律責任。

相關文章