關於Oracle的記憶體問題
Oracle中記憶體結構主要包括兩大類分別是SGA和PGA,其中SGA代表的是系統全域區,PGA代表程式全域區。
Oracle記憶體主要儲存的有執行程式代碼(PL/SQL,JAVA);關於已經串連的會話的資訊,包括當前所有活動和非活動會話;程式運行時必須的相關資訊;例如查詢計劃;Oracle進程之間共用的資訊和相互交流的資訊,例如鎖;程式運行期間所需要的資料以及儲存在外儲存上的緩衝資訊等。
記憶體是資料庫體繫結構中非常重要的一部分,也是影響資料庫效能的主要因素之一。在資料庫運行時,記憶體主要用於儲存各種資訊。按照系統對記憶體的使用方法不同,Oracle資料庫的記憶體主要可以分為以下的五種結構,分別是系統全域區(SGA),程式全域區(PGA),排序區(SORT AREA)大池(LARGE POOL)以及java池(JAVA POOL)。
1系統全域區(SGA)
系統全域區(SGA)有一組記憶體結構組成,是所有的使用者進程共用的一塊記憶體地區。其中可以包含一個資料庫執行個體的資料和控制資訊。在一個資料庫執行個體中,可以有多個使用者進程,這些使用者進程可以共用系統全域區中的資料,因此系統全域區又稱為共用全域區。
系統全域區(SGA)的總記憶體大小由參sga_max_size決定,通過使用SHOW PARAMETER語句可以查看該參數的資訊,如下:
SQL> SHOW PARAMETER SGA_MAX_SIZE;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
sga_max_size big integer 2432M
系統全域區(SGA)按照不同的作用可以分為:資料緩衝區,日誌緩衝區和共用池。
(1) 資料緩衝區
資料緩衝區主要存放最近訪問的資料區塊資訊,當使用者向資料庫請求資料時,如果所需的資料已經位於資料緩衝區,則Oracle將直接沖資料緩衝區中提取資料並返回給使用者,而不必再從資料檔案中讀取資料。資料緩衝區的大小由參數db_cache_size決定,可以通過SHOW PARAMETER語句查看該參數的資訊,如下:
SQL> SHOW PARAMETER DB_CACHE_SIZE;
NAME TYPE VALUE
-------------------------------------------------------------- ----------
db_cache_size big integer 0
(2) 日誌緩衝區
(3) 日誌緩衝區用於儲存資料的修改操作資訊。當日誌緩衝區
(4) 的日誌資料達到一定限度時,由日誌寫入進程LGWR將日誌寫入磁碟的記錄檔。日誌緩衝區的大小由參數log_buffer決定,通過SHOW PARAMETER語句查看參數的資訊,如下:
SQL> SHOW PARAMETER LOG_BUFFER;
NAME TYPE VALUE
----------------------------------------------- ----------------- ----------
log_buffer big integer 12896K
(3)共用池
共用池是對sql語句和PL/SQL程式進行文法分析,編譯和執行的記憶體地區,用於儲存最近執行的SQL語句,PL/SQL程式的資料字典資訊。
共用池主要包括三種緩衝分別是:庫緩衝,資料字典緩衝和使用者全域區。其中庫緩衝白村sql語句的分析代碼和執行計畫;資料字典緩衝區儲存資料字典中得到的表,列定義和許可權;使用者全域區儲存使用者的會話資訊。
共用池的大小由參數shared_pool_size決定,可以通過show parameter語句查詢該參數的資訊,如下:
SQL> SHOW PARAMETER SHARED_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- ----------------------
shared_pool_size big integer 0
2.程式全域區(PGA)
程式全域區包含單個使用者或伺服器資料和控制資訊,是Oracle系統分配給一個進程的私人記憶體地區。其在使用者進程串連到Oracle資料庫並建立一個會話時,由Oracle自動分配。程式全域區的大小由參數pga_aggregate_target決定,可以通過show parameter語句查詢該參數的資訊,如下:
SQL> SHOW PARAMETERPGA_AGGREGATE_TARGET;
NAME TYPE VALUE
----------------------------------------------- -------
pga_aggregate_target big integer 807M
3.排序區
排序區是Oracle系統為排序操作所產生的臨時資料提供的記憶體空間。實際上,在Oracle中,存放使用者排序操作所產生的臨時資料的地區有兩個分別是記憶體排序區和磁碟臨時段。
當進行排序操作時,Oracle系統會優先使用記憶體排序區進行排序,如果記憶體空間不夠,才會使用磁碟臨時段進行排序。
排序區的大小由參數sort_area_size決定,通過SHOW PARAMETER語句查詢該參數的資訊,如下:
SQL> SHOWPARAMETER SORT_AREA_SIZE;
NAME TYPE VALUE
----------------------------------------------- --------
sort_area_size integer 65536
4.大型池
大型池是系統全域區中可選的一個記憶體結構,用於提供一個大的緩衝區供資料庫的備份與恢複操作使用。大型池的大小由參數large_pool_size決定,通過SHOW PARAMETER語句查詢該參數的資訊,如下:
SQL> SHOWPARAMETER LARGE_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- --------
large_pool_size big integer 0
5.java池
Java池,用於在資料庫中支援java的運行。例如使用java編寫一個預存程序,這時Oracle通過java的虛擬機器就會使用java池來處理使用者會話中的java預存程序。其大小由參數java_pool_size決定,通過SHOW PARAMETER語句查詢該參數的資訊,如下:
SQL> SHOWPARAMETER JAVA_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- ----------- ----------- ----------- ----
java_pool_size big integer 0