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