Oracle12C SGA PGA UGA


SGA和PGA簡介

1 sga組成: 2b4p1s(記憶)
database buffer cache:包括 default pool,keep pool,recycle pool;
redo log buffer
share pool:包括 library cache,dictionary cache
large pool
java pool
streams pool
fixed sga 這部分區域的大小只有幾MB

2.pga組成:
1)stack space(sql work area) :sort area(排序區),hash area(構造hash表),bitmap merge area(索引區)
2)uga區: (private sql area占主要部分):
      2.1) persistent 區域 :存放綁定變量的值,以及數據類型等游標信息
      2.2) run-time 區域 :查詢執行狀態信息,X$KSMUP

Oracle為執行sql的每一個session分配一個private sql area,這個區域還存儲了一個很重要的地址信息用來指向存儲在library cache中的shared sql area,
里面保存了SQl的執行計划。Oracle建議程序開發過程中盡量多使用bind variable目的就是為了降低hard parse,
直接意思的理解就是讓我們盡量重用library cache中的SQL執行計划,這樣就可以降低share pool latch和library cache latch等閂的競爭。
其中bind variable從那里來呢?上面其實已經提到了就是在private sql area中的永久內存區域存在,這個區域只有在游標關閉的狀態下才被釋放。
這里最后要了解的是,永久內存或者是運行時內存的釋放並不是將內存反還給OS,而是反還給了UGA

官方文檔位置 

  • Books → Concepts → Part V Oracle Instance Architecture → 14 Memory Architecture → 14.2 Overview of the User Global Area
  • Books → Concepts → Part V Oracle Instance Architecture → 14 Memory Architecture → 14.3 Overview of the Program Global Area (PGA)

 

PGA 概述

PGA 是特定於一個操作系統進程或線程的內存區,且不和系統上的其他進程或線程共享。由於 PGA 是特定於進程的,所以它決不會在 SGA 中分配。PGA 是包含某個專用或共享服務器進程所需的會話變量的內存堆。服務器進程在需要時會在 PGA 中分配內存結構。

PGA 好比是文員所使用的臨時工作台面。在這個比喻中,文員是為客戶(客戶端進程) 服務的服務器進程。文員清理出台面的一部分,使用這個工作空間來存儲有關客戶要求的詳細信息,並對顧客請求的文件夾排序,然后在完成工作時讓出工作空間。

下圖顯示某個未配置為共享服務器的實例的 PGA(所有 PGA 的集合) 。您可以使用一個初始化參數設置實例 PGA 的目標最大大小。根據需要, 各個 PGA 可以按需增大到這個目標大小。

圖 2:實例 PGA

 

Note:
后台進程也分配它們自己的 PGA。 本討論的重點僅限於服務器進程 PGA。
See Also:

  • "Summary of Memory Management Methods"

1 PGA 的內容

PGA 被進一步細分為多個不同區域,每一個都有不同的目的。

下圖顯示一個專用服務器會話的 PGA 中可能包含的內容。不是所有的 PGA 區域在任何情況下都存在。

圖 3:PGA 內容

1.1 Private SQL 區

私有 SQL 區保存了有關某個已解析的 SQL 語句的信息,和其他特定於會話的信息。

當服務器進程執行 SQL 或 PL/SQL 代碼時,該過程使用其私有SQL 區域,來存儲綁定變量值、查詢執行狀態信息、和查詢執行工作區。

不要混淆在 UGA 中的私有 SQL 區,和在 SGA 中存儲執行計划的共享 SQL區。在相同或不同的會話中的多個私有 SQL 區,可能指向 SGA 中的一個單一執行計划。 例如,在某個會話中運行“SELECT * FROM sales” 20 次,而在另一個不同的會話中運行同一查詢 10 次,但它們可以共享相同的執行計划。每次運行的私有 SQL 區並不共享,因此可能包含不同的值和數據。

游標是指向某個特定的私有 SQL 區的一個名稱或句柄。如下圖所示,你可以將游標看成是一個從客戶端指向服務器端狀態信息的指針。游標與私有 SQL 區密切相關,這兩個術語有時可以互換使用。

圖 4:游標

私有 SQL 區又分為以下幾個區域:

  • run-time 區域
    此區域包含查詢執行狀態信息。例如,run-time area會跟蹤到目前為止在全表掃描中檢索到的行數。
    Oracle 數據庫將創建 run-time 區域,作為一個執行請求的第一步。對於 DML 語句,其 run-time 區域將在 SQL 語句關閉時被釋放。
  • persistent 區域
    此區域包含綁定變量的值。綁定變量是執行 SQL 語句時,在運行時提供給 SQL 語句的值。僅當關閉該游標時,persistent  區域才被釋放。

客戶端進程負責管理私有 SQL 區。雖然客戶端進程可以分配的私有 SQL 區數量由初始化參數 OPEN_CURSORS 限制,但私有 SQL 區的分配和釋放主要取決於應用程序。

盡管大多數用戶依賴於數據庫實用程序的自動游標處理機制,但 Oracle 數據庫編程接口仍為開發人員提供了對游標更多的控制。一般情況下,應用程序應關閉所有打開的且不再使用的游標,以釋放持久區域, 並最小化應用程序用戶的內存需求。

See Also:

  • "Shared SQL Areas"
  • 《Oracle Database Development Guide》和《Oracle Database PL/SQL Language Reference》了解如何使用游標

 

1.2 SQL Work 區

工作區是在 PGA 中為內存密集型操作分配的私有內存區。 

例如, 排序操作使用排序區來對一組行進行排序。同樣,哈希聯接操作將其左側數據為輸入,並使用哈希區來創建一個哈希表,而位圖合並操作則使用位圖合並區來合並從掃描多個位圖索引檢索到的數據。

如下示例顯示了 employees 表和 departments 表相聯接的查詢計划。

SQL> SELECT * 
  2  FROM   employees e JOIN departments d 
  3  ON     e.department_id=d.department_id 
  4  ORDER BY last_name;
--------------------------------------------------------------------------------
| Id| Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT    |             |   106 |  9328 |    7  (29)| 00:00:01 |
| 1 |  SORT ORDER BY      |             |   106 |  9328 |    7  (29)| 00:00:01 |
|*2 |   HASH JOIN         |             |   106 |  9328 |    6  (17)| 00:00:01 |
| 3 |    TABLE ACCESS FULL| DEPARTMENTS |    27 |   540 |    2   (0)| 00:00:01 |
| 4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  7276 |    3   (0)| 00:00:01 |
--------------------------------------------------------------------------------

在示例 1 中,run-time 區域跟蹤全表掃描的進度。此會話在哈希區中執行一個哈希聯接,以匹配兩個表中的行。而 ORDER BY 排序操作在排序區中進行。

如果要由該運算符處理的數據量太大,不能在SQL Work 區中完成, 則 Oracle 數據庫會將輸入數據分成更小的片斷。這樣一來,數據庫先在內存中處理一些數據片斷,而將其余數據寫入到臨時磁盤存儲,以待后續處理。

當啟用了自動 PGA 內存管理時,數據庫自動優化工作區大小。你也可以手動控制和優化工作區大小。更多的信息,請參閱“Memory Management”。

通常,更大的工作區可以顯著提高操作性能,但這是以更多的內存消耗為代價的。理想的情況是,工作區域的大小足以容納由其關聯的SQL操作符分配的輸入數據和輔助內存結構。否則,響應時間會增加,因為輸入數據的一部分必須被緩存到磁盤上。在極端情況下,如果工作區的大小相比輸入數據的大小顯得過小,則數據庫必須來回多次倒騰這些數據片斷,極大地增大了響應時間。

See Also:

  • 《Oracle Database Administrator’s Guide》了解如何使用自動 PGA 管理
  • 《Oracle Database Performance Tuning Guide》 了解如何調整 PGA 內存

2 在專用和共享服務器模式中使用 PGA

PGA 內存分配取決於數據庫是使用專用的還是共享的服務器連接。

表 1 顯示了差異之處。

 

內存區 專用服務器 共享服務器
會話內存的性質 私有的 共享的
persistent 區域的位置 PGA SGA
DML/DDL 語句的run-time區域的位置 PGA SGA

表 14-1 專用和共享服務器之間的內存分配差異

See Also:

 

    • 《Oracle Database Administrator’s Guide》了解如何將數據庫配置為共享服務器

 

UGA 概述

UGA 是為會話變量分配的會話內存, 如登錄信息和數據庫會話所需的其他信息。 實際上,UGA 存儲了會話狀態。

圖 1 描述了 UGA

圖 1:用戶全局區 (UGA)

如果某個會話將 PL/SQL 包加載到內存, 則在 UGA 中包含包狀態,即是所有包變量在某個特定的時刻所存儲的值集。當包的子程序更改變量的值時,包狀態也將更改。默認情況下,包變量在會話的存活期間是唯一且持久的。

OLAP 頁面緩沖池也存儲在 UGA 中。該池管理相當於數據塊的 OLAP 數據頁。頁緩沖池在啟動一個 OLAP 會話時分配,並在該會話結束時釋放。每當用戶查詢一個多維對象(如立方體)時,就會自動打開一個 OLAP 會話。

該 UGA 必須在數據庫會話的整個存活期間是可用的。 由於這個原因, 當使用共享服務器的連接時,UGA 不能存儲在 PGA 中,因為 PGA 是特定於單個進程的。因此,當使用共享服務器的連接時,UGA 被存儲在 SGA 中,以使任何共享服務器進程都能訪問它。在使用專用服務器的連接時, UGA 存儲在 PGA 中。

 

pga和uga比較

uga:user global area ,是會話含義的內存區 為了保證數據可以被會話訪問到,所以mts模式屬於sga中的大池,專有模式屬於pga,屬於用戶的內存區。
    uga保存當前會話相關的信息,比如會話登錄信息、pl/sql包的參數信息,綁定變量的值。

pga:program global area,是操作系統含義上的內存區,
    可以理解為操作系統在一個進程啟動時,為他分配的內存空間
    查詢使用 show pga;

 

sga和pga比較

sga:共享數據塊,所有進程可以訪問,數據並發訪問
    涉及lock,latch,鎖定和隊列
    是數據庫最主要優化區域,一些重要的指標:data buffer hit,library hit(hard/soft parse),hot blocks
pga:為專有進程服務,進程間無法數據共享,數據獨占
    無需鎖定機制
    性能優化只需要考慮它的大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM