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 java

官方文檔位置 

  • 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 中分配內存結構。sql

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

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

圖 2:實例 PGA緩存

 

Note:
後臺進程也分配它們本身的 PGA。 本討論的重點僅限於服務器進程 PGA。
See Also:性能優化

  • "Summary of Memory Management Methods"

1 PGA 的內容

PGA 被進一步細分爲多個不一樣區域,每個都有不一樣的目的。服務器

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

圖 3:PGA 內容併發

1.1 Private SQL 區

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

當服務器進程執行 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 blockspga:爲專有進程服務,進程間沒法數據共享,數據獨佔    無需鎖定機制    性能優化只須要考慮它的大小。

相關文章
相關標籤/搜索