oracle的記憶體管理(之一),oracle記憶體管理

來源:互聯網
上載者:User

oracle的記憶體管理(之一),oracle記憶體管理

【深入解析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:39sys@felix 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語句執行完畢就釋放該地區,對於查詢語句則是在記錄返回後或查詢取消時釋放)




作業系統與oracle的記憶體管理有何不同

oracle 記憶體管理 分 PGA 和SGA , PGA 管理 服務進程和後台 進程 SGA 管理 各種pool

作業系統的記憶體管理也有不一樣的 DOS 單任務的 和 Windows 多線程的 Linux 多使用者這種 管理的演算法都不一樣 都要找到一種最好的 記憶體 最佳化的辦法適合系統的 ..
 
oracle 依據什分配記憶體

依據你電腦的記憶體大小、是否是32位系統、以及你使用oracle環境。
你要注意的是,為oracle分配記憶體不可以超過1.5G,若伺服器實體記憶體小於2G時,分配比例為60%;大於2G,根據實際情況調整。例如實體記憶體4G,為oracle分配30%即可(以上是對32位機器的記憶體說明,64位電腦oracle分配記憶體沒有1.5G限制,可根據實際記憶體情況分配)。
假如你是自己配製記憶體,那你按照你的需求合理分配shared pool、 buffor cache、 java pool等大小。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.