1、ORACLE 執行個體
System Global Area(SGA) 和 Background Process 稱為資料庫的執行個體。
2、ORACLE 資料庫
即一系列物理檔案的集合:
@資料檔案:儲存資料,以.dbf做尾碼。一句話:一個資料表空間對多個資料檔案,一個資料檔案只對一個資料表空間。dba_data_files/v$datafile。
@控制檔案:儲存執行個體、資料檔案及記錄檔等資訊的二進位檔案。alter system set control_files=‘路徑’。V$CONTROLFILE。
@記錄檔:即Redo Log Files和Archivelog Files。記錄資料庫修改資訊。ALTER SYSTEM SWITCH LOGFILE; 。V$LOG。
@參數檔案:記錄基本參數。spfile和pfile。
@警告檔案:show parameter background_dump_dest---使用共用伺服器串連
@追蹤檔案:show parameter user_dump_dest---使用專用伺服器串連
(Ps:專用伺服器適用於開發階段,簡單,串連少。反之,共用伺服器適用於實際應用環境,多應用,高並發。這兩種其他更詳細的區別就勞駕Google度娘了。)
Oracle物理結構第二大節有詳細介紹。
3、系統全域共用區System Global Area(SGA)
包含:■ Shared Pool (共用區)
■ Database Buffer Cache (資料庫緩衝區)
■ Redo Log Buffer Cache (重做日誌緩衝區)
Oracle 10g中,與記憶體相關的參數可以歸為兩類:
Ps. 自動調優的SGA參數:目前這些參數包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。
Ps. 手動SGA參數:這些參數包括LOG_BUFFER、STREAMS_POOL、DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
System Global Area 是一塊巨大的共用記憶體地區,他被看做是Oracle 資料庫的一個大緩衝池,這裡的資料可以被ORACLE的各個進程共用。其大小查看語句:
SQL> select * from v$sga;
V$sgastat、V$buffer_pool
主要包括以下幾個部分:
a、 共用池(Shared pool)
共用池是SGA中最關鍵的記憶體片段,特別是在效能和延展性上。太大太小都會扼殺效能,使系統停止,將會消耗大量的CPU來管理這個共用池。
共用池可分為:Library Cache和Data Dictionaey Cache
【庫高速緩衝區(Library Cache)】
library cache最主要的功能就是存放使用者提交的SQL語句及相關的解析樹(解析樹也就是對SQL語句中所涉及的所有對象的展現)、執行計畫、使用者提交的PL/SQL程式塊(包括Anonymizer塊、預存程序、包、函數等)以及它們轉換後能夠被Oracle執行的代碼等。為了,library cache中還存放了很多控制結構(用於管理這些記憶體結構),包括lock、pin、dependency table等。
library cache也存放了很多的資料庫物件的資訊,包括表、索引等。有關這些資料庫物件的資訊都是從dictionary cache中獲得的。如果使用者對library cache中的對象資訊進行了修改,比如為表添加了一個列等,則這些修改會返回到dictionary cache中。
在library cache中存放的所有資訊單元都叫做對象(object),可分兩類:一類叫儲存物件,也就是上面所說的資料庫物件。它們是通過顯式的SQL語句或PL/SQL程式建立出來的,如果要刪除它們,也必須通過顯式的SQL命令進行刪除。這類對象包括表、視圖、索引、包、函數等;另一類叫做過渡對象,也就是上面所說的使用者提交的SQL語句或者提交的PL/SQLAnonymizer塊等。這些過渡對象是在執行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)
【資料字典緩衝區(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;
b、資料庫高速緩衝區(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。
c、重做日誌緩衝區(Redo log buffer)
重做記錄檔的緩衝區,對資料庫的任何修改都按順序被記錄在該緩衝,然後由LGWR進程將它寫入Redo log files。這些修改資訊可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。重做日誌緩衝區的存在是因為記憶體到記憶體的操作比較記憶體到硬碟的速度快很多,所以重作日誌緩衝區可以加快資料庫的操作速度,但是考慮的資料庫的一致性與可恢複性,資料在重做日誌緩衝區中的滯留時間不會很長。所以重作日誌緩衝區一般都很小,大於3M之後的重作日誌緩衝區已經沒有太大的實際意義。
d、Java程式緩衝區(Java Pool)
Java的程式區,Oracle 8.1.5以後,Oracle在核心中加入了對Java的支援。該程式緩衝區就是為Java 程式保留的。如果不用Java程式沒有必要改變該緩衝區的預設大小。
e、大池(Large Pool)
大池的得名不是因為大,而是因為它用來分配大塊的記憶體,處理比共用池更大的記憶體,在8.0開始引入。
下面對象使用大池:
MTS(多線程伺服器即共用伺服器)——在SGA的Large Pool中分配UGA 語句的並行查詢(Parallel Executeion of Statements)——允許進程間訊息緩衝區的分配,用來協調並行查詢服務器。
備份(Backup)——用於RMAN磁碟I/O緩衝