oracle體系結構梳理---SGA+PGA

lff1530983327發表於2015-01-21
 

三大元件:buffer cacheshared poolredo_log buffer

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

SGA oracle 10g之後即實現了自動化管理,在11G,可以使用memory_target引數把PGASGA作為一個整體進行自動管理。

1.shared pool (data dictionary cache,library cache )共享池

2.database buffer cache資料庫高速緩衝區

3.redo log buffers 重做日誌緩衝區

4.large pool 大池

5.java pooljava

 

高速緩衝區分成以下幾種子池: 

1. 預設池,它在ORACLE中的大小由DB_CACHE_SIZE決定,經常使用的物件

2. KEEP ,DB_KEEP_CACHE_SIZE 用在一些小表,不容易被擠出

alter table t storage (buffer_pool keep);

alter index IND_AA storage (buffer_pool keep);

3.回收池,DB_RECYCLE_CACHE_SIZE

alter table t storage(buffer_pool recycle);----t表放在keep

select segment_name,blocks,bytes/1024/1024||'M'AS "SIZE" from dba_segments where BUFFER_POOL = 'RECYCLE';

----回收池避免大表將buffer cache 中常用的小表踢出,二是將其儲存在一個回收區,用完之後迅速釋放 
 理論上講,預設池中的物件應該足夠熱(也就是說,用得足夠多),可以保證一直呆在快取中。快取會把它們一直留在記憶體中。可能還有一些段相當熱門,但是並不太熱;這些塊就作為溫塊。這些段的塊可以從快取重新整理輸出,為不常用的一些塊(不適合快取塊)騰出空間。為了保持這些溫段的塊得到快取,可以採取下面的某種做法:將這些段分配到保持池,力圖讓溫塊在緩衝區快取中停留得更久。將不適合快取段分配到回收池,讓回收池相當小,以便塊能快速地進入快取和離開快取(減少管理的開銷)。這樣會增加DBA 所要執行的管理工作,因為要考慮3 個快取,要確定它們的大小,還要為這些快取分配物件。還要記住,這些池之間沒有共享,所以,如果保持池有大量未用的空間,即使預設池或回收池空間不夠用了,保持池也不會把未用空間交出來。總之,這些池一般被視為一種非常精細的低階調優裝置,只有所有其他調優手段大多用過之後才應考慮使用。11g之後sga記憶體管理均可以設定auto方式。

REDO BUFFER大小由LOG_BUFFER決定

Large poolJava pool

SGA 中三大元件:

第一個元件:共享池,用來存放SQL解析樹和字典物件定義的共享區域。

第二個元件,資料庫快取記憶體區,用來存放業務資料的共享記憶體區域。

第三個元件,REDO日誌快取區

第四個元件,其它共享資源,如LOCKENQUEUELATCH,統計資料。

接下來將透過一條SQL 語句的執行過程來認識這三個元件在oracle中的具體作用:

 

---SELECT * FROM EMP;

解析:首先接收到這一條命令的時候,現在 data dictionary cache(資料字典快取)中校驗表的相關定義相關行以及命令發出使用者的許可權,

然後在 shared pool 中的 library cache 中檢視語句之前是否已經解析,如果有,則直接按照之前的解析執行,

如果沒有則發生硬解析,然後根據執行計劃,去取 database buffer cache 中取資料。

row cache

資料字典快取也被稱為行快取(Row Cache),因為它是以記錄行為單元儲存資料的 作來語意分析,

比如:檢查物件是否存在,列是否存在,是否有許可權等。

row cache儲存了最近最常使用的資料物件定義,如使用者、許可權、列、表、索引等全部可以放到資料字典共享。

---物理讀 邏輯讀

物理讀即在磁碟中讀取資料

邏輯讀是指在記憶體中讀取

邏輯讀 = 當前讀 + 一致讀

-----實驗

sql>1 create table t(id,int);

sql>1 insert t values(1);

sql>1 commit;

sql>1 update t set id=2 where id=1;

sql>1 select * from t;-----2   當前讀 db block gets

sql>2 select * from t;-----1   一致讀 consistent gets

sql>2 update t set id=3 where id=3;---發生兩次一致讀,一次當前讀

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

PGA

---一條sql語句的執行過程

1.語法檢查selet form

2.語意檢查 相關的物件是否存在,比如:表,列等

3.名稱轉換 同義詞或檢視等 scott.emp

4.許可權

5.sqlhash,hash value hash(select ename,sal from emp)返回一串字元執行計劃的hash value

6. 如果沒有相同的hash值,則硬解析.

7.透過最佳化器建立一個最優的執行計劃(需要分析計算成本)

8. 如果是第一次執行,則將該遊標所產生的執行計劃、SQL文字等裝載進library cache的若干個heap,以便下一次來匹配。

9.  如果是第三次執行相同的sql,則將執行計劃等資訊cachePGA

10. 透過私有CURSOR,執行SQL

11. 如果是SELECT,則需要PGAFETCH資料

PGA

中包含了關於程式使用到的作業系統資源的資訊,以及一些關於程式狀態的資訊。而關於程式使用的Oracle共享資源的資訊則是在SGA中。
SGA中存放的內容: 主要概括來說就是會話在執行的過程中一些SQL語句的返回結果以及排序結果等的暫時存放地。

WORKAREA_SIZE_POLICY= MANUAL---PGA 的管理方式 auto自動和 manual 手動

pga_aggregate_target>0WORKAREA_SIZE_POLICY= AUTO,表示PGA自動管理

1. 會話記憶體session memory

2. 私有 SQL (private SQL area)

每一個發出sql語句的session都有自己的私有sql區域

1) 固定部分persistent area),包含繫結資訊bind information之類的資料

2) 執行部分run-time area),當遊標執行結束就會被釋放。---將查詢的結果儲存在PGA中,等所有結果出來時,再釋放遊標

INSERT

UPDATE

DELETE

3. 遊標及共享 SQL

控制程式碼==指標

一個共享sql去可以對應多個私有sql---銀行和客戶的關係

共享sql區有控制程式碼,有執行計劃,私有sql區只儲存了一個指標型別的東西

私有CURSOR只有控制程式碼,沒有執行計劃

而共享CURSOR,有控制程式碼,還有執行計劃

4. SQL 工作區

1) SORT_AREA_SIZE 需要進行排序的操作

2) SORT_AREA_RETAINED_SIZE排序完成後用於儲存已排序資料的記憶體總量 SORT_AREA_RETAINED_SIZE=0 說明SORT_AREA_RETAINED_SIZE=SORT_AREA_SIZE

不用返回給使用者則不用使用SORT_AREA_SIZEINSERT INTO T SELECT * FROM emp ORDER BY ename;

3) HASH_AREA_SIZE雜湊連線hash-join

4) bitmap_merge_area_size: 點陣圖合併bitmap merge

5) create_bitmap_area_size

 點陣圖建立(bitmap create

 

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

相關文章