System Global Area 是一塊巨大的共享內存區域,他被看作是Oracle 數據庫的一個大緩衝池,這裏的數據能夠被ORACLE的各個進程共用。其大小查看語句:
SQL> select * from v$sg
a;
V$sg
astat、V$buffer_pool
主要包括如下幾個部分:
一、共享池(Shared pool)
共享池是SG
A中最關鍵的內存片斷,特別是在性能和可伸縮性上。太大過小都會扼殺性能,使系統中止,將會消耗大量的CPU來管理這個共享池。
共享池可分爲:Library Cache和Data Dictionaey Cache
(1)庫高速緩衝區(Library Cache)
library cache最主要的功能就是存放用戶提交的SQL語句及相關的解析樹(解析樹也就是對SQL語句中所涉及的全部對象的展示)、執行計劃、用戶提交的PL/SQL程序塊(包括匿名程序塊、存儲過程、包、函數等)以及它們轉換後可以被Oracle執行的代碼等。此外,library cache中還存放了不少控制結構(用於管理這些內存結構),包括lock、pin、dependency table等。
library cache也存放了不少的數據庫對象的信息,包括表、索引等。有關這些數據庫對象的信息都是從dictionary cache中得到的。若是用戶對library cache中的對象信息進行了修改,好比爲表添加了一個列等,則這些修改會返回到dictionary cache中。
在library cache中存放的全部信息單元都叫作對象(object),可分兩類:一類叫存儲對象,也就是上面所說的數據庫對象。它們是經過顯式的SQL語句或PL/SQL程序建立出來的,若是要刪除它們,也必須經過顯式的SQL命令進行刪除。這類對象包括表、視圖、索引、包、函數等;另外一類叫作過渡對象,也就是上面所說的用戶提交的SQL語句或者提交的PL/SQL匿名程序塊等。這些過渡對象是在執行SQL語句或PL/SQL程序的過程當中產生的,並緩存在內存裏。若是實例關閉則刪除,或者因爲內存不足而被交換出去,從而被刪除。
當一個用戶提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程相似於編譯,會耗費相對較多的時間,即硬解析。在分析完這個SQL,Oracle會把他的分析結果給保存在Shared pool的Library Cache中,當數據庫第二次執行該SQL時,Oracle自動跳過這個分析過程,從而減小了系統運行的時間,即軟解析。這也是爲何第一次運行的SQL 比第二次運行的SQL要慢一點的緣由。
下面舉例說明parse的時間
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
這是在Share_pool 和Data buffer 都沒有數據緩衝區的狀況下所用的時間
SQL> alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
從兩句SQL 的時間差上能夠看出該SQL 的Parse 時間約爲00:00:00.02
對於保存在共享池中的SQL語句,能夠從V$Sqltext、v$Sqlarea中查詢到,對於編程者來講,要儘可能提升語句的重用率,減小語句的分析時間。一個設計的差的應用程序能夠毀掉整個數據庫的Share pool,提升SQL語句的重用率必須先養成良好的變成習慣,儘可能使用Bind變量。
關於library cache的命中率:
SQL> desc V$librarycache
NAMESPACE VARCHAR2(64)
GETS NUMBER
GETHITS NUMBER
GETHITRATIO NUMBER
PINS NUMBER
PINHITS NUMBER
PINHITRATIO NUMBER
RELOADS NUMBER
INVALIDATIONS NUMBER
DLM_LOCK_REQUESTS NUMBER
DLM_PIN_REQUESTS NUMBER
DLM_PIN_RELEASES NUMBER
DLM_INVALIDATION_REQUESTS NUMBER
DLM_INVALIDATIONS NUMBER
計算library cache的命中率:
NAMESPACE=SQL AREA
Library Cache Hit Ratio = sum(pinhits) / sum(pins)
(2)數據字典緩衝區(Data Dictionary Cache)
用於存放Oracle系統管理自身所須要的全部信息,包括登陸的用戶名、用戶對象、權限等。
查看 data dictionary cache 的命中率
SQL> select sum(gets),sum(getmisses),(1-(sum(getmisses)/(sum(gets)+sum(getmisses)))) hitratio from v$rowcache;
SUM(GETS) SUM(GETMISSES) HITRATIO
---------- -------------- ----------
2902660 93718 .968722905
查看data dictionary cache 的大小
SQL> select sum(sharable_mem) from v$sqlarea;
SUM(SHARABLE_MEM)
-----------------
136781291
若是data dictionary cache的命中率小於95%,應該適當增長shared pool 的大小---alter system set shared_pool_size=***M;
二、數據庫高速緩衝區(Database Buffer Cache)
存放Oracle系統最近使用過的數據塊。讓他們可以在內存中進行操做。在這個級別裏沒有系統文件,用戶
數據文件,臨時數據文件,回滾段文件之分。也就是任何文件的數據塊都有可能被緩衝。數據庫的任何修改都在該緩衝裏完成,並由DBWR進程將修改後的數據寫入磁盤。
這個緩衝區的塊基本上在兩個不一樣的列表中管理。一個是塊的「髒」表(Dirty List),須要用數據庫塊的書寫器(DBWR)來寫入,另一個是不髒的塊的列表(Free List),通常的狀況下,是使用最近最少使用 (Least Recently Used,LRU)算法來管理。
數據庫高速緩衝區又能夠細分爲如下三個部分:Default pool,Keep pool,Recycle pool。ORACLE將默認爲Default pool。
因爲操做系統尋址能力的限制,不經過特殊設置,在32位的系統上,數據庫高速緩衝區最大能夠達到1.7G,在64位系統上,塊緩衝區高速緩存最大能夠達到10G。
三、重作日誌緩衝區(Redo log buffer)
重作日誌文件的緩衝區,對數據庫的任何修改都按順序被記錄在該緩衝,而後由LGWR進程將它寫入Redo log files。這些修改信息多是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。 重作日誌緩衝區的存在是由於內存到內存的操做比較內存到硬盤的速度快不少,因此重做日誌緩衝區能夠加快數據庫的操做速度,可是考慮的數據庫的一致性與可恢復性,數據在重作日誌緩衝區中的滯留時間不會很長。因此重做日誌緩衝區通常都很小,大於3M以後的重做日誌緩衝區已經沒有太大的實際意義。
四、Java程序緩衝區(Java Pool)
Java的程序區,Oracle 8.1.5之後,Oracle在內核中加入了對Java的支持。該程序緩衝區就是爲Java 程序保留的。若是不用Java程序沒有必要改變該緩衝區的默認大小。
五、大池(Large Pool)
大池的得名不是由於大,而是由於它用來分配大塊的內存,處理比共享池更大的內存,在8.0開始引入。
下面對象使用大池:
MTS(多線程服務器即共享服務器)——在SG
A的Large Pool中分配
UGA
語句的並行查詢(Parallel Executeion of Statements)——容許進程間消息緩衝區的分配,用來協調並行查詢服務器。
備份(Backup)——用於RMAN磁盤I/O緩存