標籤:database linux oracle sga
【深入解析oracle-eygle】學習筆記
1.記憶體管理
ORACLE資料庫所使用的記憶體主要涉及到兩個方面:PGA和SGA。
1.1 PGA管理
PGA指的是程式全域區(Program Global Area),是伺服器處理序(Server Process)使用的一塊包含資料和控制資訊的記憶體地區,PGA是非共用的記憶體,在伺服器處理序啟動或建立時分配(在系統運行時,排序、串連風操作也可能需要進一步的PGA分配),並為Server Process排他訪問,所以PGA中的資料結構並不需要通過latch來保護;
1.2 什麼是PGA
進程的建立通常有兩種模式:專用伺服器模式(Dedicated Server)及共用伺服器模式(SharedServer)。 在 專 用 服 務 器 模 式 下 ,Oracle會為每個會話啟動一個Oracle進程;而在共用伺服器模式下,通常在伺服器端啟動一定數量的伺服器處理序,然後由多個用戶端請求共用同一個Oracle服務進程。
從記憶體配置與使用上PGA可以被區分為兩個地區:
(1)固定PGA(Fixed PGA)- 固定PGA和固定SGA類似,包含了大量原子變數、小的資料結構和指向可變PGA的指標,這些變數在源碼中定義,在編譯時間分配,可以被認為是PGA的保留記憶體
(2)可變PGA(Variable PGA)- 可變PGA通過具體的記憶體Heap分配來實現,其空間分配與使用時可以變化的,通過內部視圖X$KSMPP([K]ernel [S]ervice [M]emory [P]GA hea[P])可以查詢可變PGA記憶體的分配和使用方式。PGA的可變區中主要包含會話記憶體及私人SQL區等。
17:21:[email protected] SQL>select * from x$ksmpp;
ADDR INST_ID KSMCHCOM KSMCHPTR KSMCHSIZ KSMCHCLS KSMCHTYP KSMCHPAR
---------------- ------------------------- ---------------- ---------- --------- -------------------------
00007FC3A71D91E0 1 allocate kzthsm 00007FC3A74E9700 120 freeabl 0 00
00007FC3A71D9188 1 kpuinit env han 00007FC3A74E8F70 1936 freeabl 0 00
00007FC3A71D9130 1 Alloc environm 00007FC3A74E87A0 2000 recr 4095 00007FC3A74E95C8
00007FC3A71D90D8 1 Alloc environm 00007FC3A74E77D0 4048 freeabl 0 00007FC3A74E95C8
00007FC3A71D9080 1 permanent memor 00007FC3A74E7780 80 perm 0 00
00007FC3A71D9028 1 permanent memor 00007FC3A74E7730 80 perm 0 00
00007FC3A71D8FD0 1 Alloc environm 00007FC3A74E97F0 8312 freeabl 0 00007FC3A74E95C8
00007FC3A71DAF60 1 kzsna:login nam 00007FC3A74E97B8 56 freeabl 0 00
00007FC3A71DAF08 1 kgh stack 00007FC3A74EB8A8 17024 freeabl 0 00
00007FC3A71DAEB0 1 external name 00007FC3A74F1BF8 32 freeabl 0 00
00007FC3A71DAE58 1 Alloc environm 00007FC3A74F0B78 4224 freeabl 0 00007FC3A74E95C8
00007FC3A71DAE00 1 KSZ pga subheap 00007FC3A74F0AD8 160 freeabl 0 00
00007FC3A71DADA8 1 KJZT context 00007FC3A74F0A78 96 freeabl 0 00
00007FC3A71DAD50 1 sioheapd_kdlwpg 00007FC3A74F09A8 208 freeabl 0 00
00007FC3A71DACF8 1 bcheapd_kdlwpga 00007FC3A74F0878 304 freeabl 0 00
00007FC3A71DACA0 1 iovecheapd_kdlw 00007FC3A74F0790 232 freeabl 0 00
00007FC3A71DAC48 1 peshm.c:Proces 00007FC3A74F01D0 1472 recr 4095 00007FC3A75160F0
00007FC3A71DABF0 1 permanent memor 00007FC3A74EFB68 1640 perm 0 00
00007FC3A71DAB98 1 krbrpcact 00007FC3A74F3CC8 64 freeabl 0 00
00007FC3A71DAB40 1 permanent memor 00007FC3A74F1C58 8304 perm 0 00
可變PGA又進一步的由以下兩部分組成:
(1)會話記憶體-Session Memory用於存放會話的登入資訊以及其他相關資訊,對於共用伺服器模式,這部分記憶體是共用而非私人的。
(2)私人的SQL區 - Private SQL Area:Private SQL Area包含綁定變數資訊、查詢執行狀態資訊以及查詢工作區等。每個發出SQL查詢的會話都擁有一塊私人SQL區,對於專用伺服器模式,這部分記憶體在PGA中分配,對於共用伺服器模式,這部分記憶體在SGA中分配。
在這裡還需要瞭解的一個概念是遊標(Cursor)。Oracle的應用程式或使用者的應用程式執行時,都可能顯示或隱式的開啟遊標(Open Cursor)來進行任務處理,開啟遊標就需要分配SQL Area。管理私人SQL區是使用者進程的責任,而分配和回收則依賴於具體的應用程式,為了防止過度的SQL工作區分配,Oracle通過OPEN_CURSORS參數來限制每個使用者進程能夠同時開啟的遊標數量。一個私人SQL區在Cursor開啟時分配,當執行結束遊標關閉時釋放。
簡單來說,使用者進程的任務執行以及Cursor的使用是PGA記憶體的主要消耗者,也是我們在進行資料庫效能最佳化時最關心的內容,實際上資料庫的活動主要就是Cursor的活動。
私人SQL區又由以下兩部分組成:
(1) 永久地區-Persistent Area:這個地區包含綁定變數等資訊,這部分記憶體只有在遊標被關閉時才會被釋放。
(2)運行時地區-Runtime Area:這個地區存放了SQL語句運行時所需要的資訊,在執行請求時首先建立,其中包含了查詢執行的狀態資訊(如對於全表掃,則記錄全表掃的進度等)、SQL work areas(這部分地區在記憶體密集型請求下分配,如Sort或者Hash-Join等,對於DML語句來說,SQL語句執行完畢就釋放該地區,對於查詢語句則是在記錄返回後或查詢取消時釋放)