System Global Area 是一塊巨大的共用記憶體地區,他被看做是Oracle 資料庫的一個大緩衝池,這 裡的資料可以被ORACLE的各個進程共用。其大小查看語句:
SQL> select * from v$sga;
V$sgastat、V$buffer_pool
主要包括以下幾個部分:
1、共用池(Shared pool)
共用池是SGA中最關鍵的記憶體片段,特別是在效能和延展性上。太大太小都會扼殺效能,使系統 停止,將會消耗大量的CPU來管理這個共用池。
共用池可分為:Library Cache和Data Dictionaey Cache
(1)庫高速緩衝區(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