PGA深入剖析

2021-06-29 00:39:55 字數 2854 閱讀 2368

pga

pga系統全域性區(program global area)/程序全域性區(process global area)

pga是乙個記憶體區域,該區域包含了一些與某個特定伺服器程序相關的資料和控制資訊,每個程序都有自己的私有pga區,所以這塊區域只能被其所屬程序進入,而不能被其他程序訪問,所以在pga中不存在latch和lock結構。

pga中包含了當前程序所使用的有關作業系統資源的資訊以及一些與當前程序相關的一些私有狀態資訊。

pga包括

1、固定pga部分:固定pga大小是固定的,包含了大量原子變數,小的資料結構和指向可變pga的指標。

2、可變pga部分:這部分是按照堆進行組織的,所以這部分也叫pga堆(heap就是乙個受管理的記憶體區),可變pga是乙個記憶體堆,它的記憶體段可以通過檢視x$ksmpp查到,可變pga包含用於存放x$表的記憶體,變化pga分為三個部分:

① 私有sql區

② 游標和sql區

③ 會話記憶體

一、私有sql區(privata sql area)

私有sql區包含了繫結變數值和執行時記憶體結構資訊等資料,每乙個執行了sql的會話或者每個提交了相同sql的使用者都有自己的私有sql區,並且他們共享sga中的同乙個共享sql區,所以說乙個共享sql區與多個私有sql區相關聯。

私有sql區又分為兩個生命週期不同的區:

① 永久區:包含繫結變數資訊,游標關閉時釋放

② 執行區:每一次執行請求都要建立執行區,對於dml語句來說,語句執行結束時釋放執行區,對於select語句,查詢結束時釋放執行區

二、游標和sql區(cursor and sql area)

乙個oracle預編譯程式或oci程式的應用開發人員能夠很明確的開啟乙個游標,或者控制一塊特定的私有sql區,將他們作為程式執行的命名資源。另外,oracle隱含的為一些sql語句產生的遞迴呼叫,也使用共享sql區。

私有sql區是由使用者程序管理的。如何分配和釋放私有sql區極大的依賴與你所使用的應用工具。而使用者程序可以分配的私有sql區的數量是由引數open_cursors控制的,它的預設值是50。

在游標關閉前或者語句控制代碼被釋放前,私有sql區將一直存在(但其中的執行區是在語句執行結束時被釋放,只有永久區一直存在下去)。應用開發人員可以通過將所有開啟的不再使用的游標都關閉來釋放永久區,以減少使用者程式所占用的記憶體。

1. 使用者程序可分配的最大私有sql區受初始化引數open_cursors的限制

2. 當相應的游標被關閉或者語句控制代碼被釋放時, 私有sql區才消失

3. runtime area在sql語句結束後釋放, persistent area則繼續等待

三、會話記憶體(

session memory

會話記憶體是一段用於儲存會話變數(如登入資訊)和其他預會話相關資訊的記憶體。對於共享伺服器模式下,會話記憶體是共享的,而不是私有的。

對於複雜的查詢,執行區的很大一部分被那些記憶體需求很大的操作分配給sql工作區(sql work area)

基於排序的操作(order by,group by,rollup,視窗函式)

hash join(hash 鏈結)

bitmap merge(位圖合併)

bitmap create點陣圖建立)

相關函式

sort_area_size:在資訊換出到磁碟之前,用於對資訊排序的rman總量

sort_area_retained_size:排序完成後用於儲存已排序資料的總量

hash_area_size:伺服器程序在記憶體中儲存雜湊表所用的記憶體量

hash_join_enable

bitmap_merge_area_size

create_bitmap_area_size

open_cursors:使用者程序所分配的私有sql區的數量或者說最多能容納多少session連線。

_pga_max_size:每個session所分配pga最大值

管理方式:

1、手動管理:手動的配置各個區的大小,例如手動配置sort區的大小,手動配置大小經常會出現設定大小與實際需求不符的情況,分配的空間過多白白的浪費,分配的空間如果過少會由於空間不足不能進行排序,此時已經分配的sort_area_size會與臨時表空間共同完成排序,這就需要先將一部分資料寫入到磁碟上,進行磁碟排序,會降低效能。

oracle將所得的sql工作區按大小分為:

①:optimal size(最佳) sql工作區完全可以滿足執行sql所需記憶體

②:one_pass size 一次i/o

③:multi_pass size 多次i/o

當workload不大時,oracle傾向於為每個會話分配optimal size

2、自動管理:9i以後會話工作區的大小都是自動分配的,只需修改引數workarea_size_policy=auto及pga_aggregate_target,給pga乙個整體的空間,oracle則會按需求為server process分配pga空間,但是並不會無限制的需求多少給多少在pga_aggregate_target範圍內會盡量的滿足server process的需求,但是超過了這個臨界值後,會重新向oracle申請一些空間,但是此時為server process分配pga空間時,為其分配的值會少於其需求值,並逐漸趨近於平滑。

pga的大小設定:

oltp:pga_aggregate_target=(total_men*80%)*20%

dss:pga_aggregate_target=pga_aggregate_target=(total_men*80%)*50%

epoll LT ET 深入剖析

epoll lt et 深入剖析 epoll事件有兩種模型 level triggered lt 水平觸發 socket接收緩衝區不為空 有資料可讀 讀事件一直觸發 socket傳送緩衝區不滿 可以繼續寫入資料 寫事件一直觸發 符合思維習慣,epoll wait返回的事件就是socket的狀態 ed...

深入剖析printf

printf主要是給控制台列印字串或者數字等。1 printf的引數列表printf const char format,2 printf首先呼叫va start.然後呼叫 output l,最後呼叫 ftbuf 3 output l會解析字串並呼叫va arg,獲取省略號的值,呼叫write st...

epoll LT ET 深入剖析

epoll lt et 深入剖析 epoll事件有兩種模型 level triggered lt 水平觸發 socket接收緩衝區不為空 有資料可讀 讀事件一直觸發 socket傳送緩衝區不滿 可以繼續寫入資料 寫事件一直觸發 符合思維習慣,epoll wait返回的事件就是socket的狀態 ed...