oracle學習筆記 PGA內存作用和構成



oracle學習筆記 PGA內存作用和構成


從這節課開始講oracle非常重要的一個內存結構PGA


一)pga也非常重要


oracle的內存分兩大塊


一塊是SGA,
裏面有六個池子
Shared pool,Streams pool,Large pool,Java pool,Database buffer cache,Redo log buffer


另外一塊是PGA


大家會發現在市面上好多書裏面
講SGA講了很多,但是PGA講的很少


老師很奇怪
對oralce的實例來講
有sga有後臺進程,有pga有serverprocess
大家書上花了很多的力氣很多的篇幅去講sga去講後臺進程
但是對serverprocess和pga講的相對很少


但在實際的工作中
pga和serverprocess是最容易出問題的
我們來解決問題的時候和我們去發現問題的時候
往往是從pga和serverprocess入手


所以老師講課的時候
把很多的精力給大家講pga去講serverprocess


所以今天講的pga非常重要
但是pga管理起來相對比較容易一些
在pga裏面發現問題也比較容易一些
所以說這塊內容不是很難但是非常重要


拋出第一個問題oralce數據庫裏面有兩個東西很重要
serverprocess和pga


二)計算機語言和計算機的問題及錯誤


這裏老師又講到軟件經常出問題
問題和錯誤是計算機及其軟件避免不了的
究竟是什麼原因引起來的
可以從軟件的基礎-計算機語言來剖析這個問題


計算機硬件整體來講它是一臺機器,是一臺電子機器
它由高低電平驅動
而且處理的是數字0和1
內存和處理器中以高低電平來表示1和0
磁盤中以磁場表示1和0


它所具有的處理能力
是製造者在製造它時賦予它的
如它可以存儲數據、執行命令和進行運算


使用者所看到的都是由0和1經過計算得到的結果
如文字和圖片


這個機器要運行需要人來啓動,並時時需要人的操作


它所擁有的固有處理能力
是一些最基本的操作
如數據的傳輸和加減運算等
它們經過組合形成了更大的功能
爲了處理希望的更強大的功能
這些基礎處理和其組合經過了一代代的完善、精化
結果形成了以超大規模集成電路爲基礎的各種芯片


它的每種基礎操作
都是以0和1來表示的
由0和1來控制由0和1來找數據和由0和1來計算
這就是計算機機器的語言基礎
每個基礎工作都由0和1構成
再由一個個的這種基礎語句構成機器語言體系
在機器內部運行


雖然機器語言是人創造的
但是人想直接看出這些0和1到底在幹什麼
不使用工具是做不到的更不要說編寫它
所以必須有人可以看懂的語言和它對應,來理解它和編寫它
就有了彙編語言
它不是0和1組成,是由人可以理解的詞語組成
它仍然晦澀難懂,但是人經過努力是可以看懂的
它的每一句也表示機器的一個基礎動作
每條彙編語言經過編譯得到一條機器語句
最終在計算機運行的仍是機器語言


彙編語言仍然不適合人的使用習慣
但是它是人操作計算機的必須途徑
爲了實現大規模運算和人更容易的控制計算機
不同的人根據自己的理解集成優化最底層計算機執行的指令
又形成了各種高級語言


因爲基礎硬件基本一致
人類的思維方式也基本一致
所以各種高級語言的結構和語法也是基本一致的


高級語言在編寫程序時相對非常的方便
要讓它在計算機中運行
要先彙編成彙編語言,然後再編譯成機器語言
當機器語言得到運行時
計算機各種語言才達到它的最終目的


機器語言、彙編語言和高級語言就是通常人們所說的計算機語言。
它們都在表達計算機做什麼。


在操作計算機時,我們對計算機呈獻出來的內容
如一個圖片,一段文字或者一個對話框
我們會產生反應
如關閉它,保存它或者要進入下一步的操作
我們需要點擊鼠標或操作鍵盤給它迴應
這種交互
其實也是和計算機的一種交流
是計算機抽象意義下的一種語言。


計算機語言和人類說話用的語言
都是表達人類的意圖和進行傳遞信息
只是計算機語言是把人的意圖告訴給計算機


每種語言作爲一種語言它有它的體系和作爲一種語言的難度
要使用它必須一步步的學習
首先要看懂它然後再使用它


當計算機運行起來,
它就是編寫程序者的思維
另一個使用者同樣可以和這個程序交流
不過這種交流相對死板
被套在固定的模式下和實現了的設定的方面
原因是一個程序的侷限性
再怎麼全面也只能設定現實世界的很少一部分
也是現在所有智能化技術無法突破的限制


計算機總是被操作的,視爲自動化程度很高的工具可以理解它到底能做什麼


人無完人,人總是會出錯的
人所編寫的程序也會出錯
這樣會使計算機產生意想不到的結果


如果你不瞭解計算機語言
就無法和計算機溝通
或者無法編寫在計算機上可以運行的程序


每個使用計算機語言編寫程序的人都是有侷限性的
每種語言表達事物同樣都是有侷限性的
它所編寫出的程序當然也是有侷限性的
避免不了編寫中自己的片面造成的程序的不完整和錯誤
在很多沒有考慮到的方面往往會出現各種各樣的問題
這樣就可能產生編寫的問題和錯誤


理論上講在程序編寫、靜止和執行時
每一個指令和數據都是可以被修改的
可人爲的修改或硬件產生錯誤造成的修改
這樣就可能產生出運行時的錯誤


計算機中每個程序只是在計算機整體程序的一部分
和其它的程序有相互依存的關係
在和其它程序同時運行時
相互間避免不了矛盾和衝突
這樣就可能產生環境錯誤


程序編寫後還要由人來使用
別人使用要適應編寫者的思路
要理解程序的功能
別人的不習慣和不理解一樣產生這樣那樣的問題


這些問題和錯誤的根本就產生在由計算機語言編寫、構成和運行程序的過程
根源在計算機語言的使用者和運行者


人類所有語言在表達事物時
想做到完全正確沒有遺誤是不現實的
沒有人可以做到
使用計算機的靈魂計算機語言也一樣
這就是計算機問題和錯誤產生的根本。


oracle也由計算機語言組成
就現在說的它的serverprocess組件來說
雖然產生年代已很久遠
它在編寫時同樣的肯定做不到完美,肯定有編寫上的疏忽
再加上不斷的升級修改也會造成代碼的混亂
運行時不管什麼樣的硬件一樣會產生錯誤
但就現在使用情況來說
它的問題和錯誤主要還是產生在
和周邊功能代碼的相互使用上
如和SGA和PGA的相互使用。
使用的長了就知道它們相互間的關係有多複雜和費解
既要適應程序的思路又要了解計算機的知識
對程序本身和對它的使用的問題和錯誤也一直不可避免的發生着。


三)PGA內存空間的位置


內存中有
buffercache logbuffer sharedpool
有一堆後臺進程
DBWr,smonitor,pmonitor,checkpoint,logwrite
硬盤上有dbf文件,redolog文件、還有archivelog
外部鏈接產生serverprocess,它有pga
這就是oracle的一個體繫結構


平時在一般的書上五個後臺進程講的很多
SGA講的也很多
唯獨PGA和這一堆serverprocess講的很少
實際上這是重點
工作中這是要理解的重點


pga叫私有全局區或者叫程序全局區
sga叫共享全局區或者系統全局區


無論是serverprocess還是後臺進程
它們都可以訪問sga這塊內存區域
sga是共享的一塊內存區域


pga屬於每一個進程
後臺進程也有pga空間
就是每一個進程都有一塊內存空間
只不過後臺進程佔的內存空間比較小我們不怎麼關心它
主要是serverprocess的pga它佔的空間是比較大的,有時候會是很大
而且還有多種問題


serverprocess數量衆多,動輒上百一二百
有的一個數據庫的serverprocess數量達到二百
但是後臺進程就十來個左右
所以我們重點研究serverprocess以及它的pga


每一個進程佔用一塊pga內存空間
這塊pga是專門的爲serverprocess服務的
一個pga空間只能它對應的那個serverprocess可以訪問
只有一個serverprocess可以訪問它的pga內存空間


也就是一個pga的內存空間作用非常簡單
存儲的是和對應session會話相關的一些數據
沒有共享
我們平時主要研究serverprocess的pga


四)PGA的構成


pga有很多部分構成
有private sql area
有session memory
還有sql work areas


這三塊裏面可以詳細看一下
但實際上沒有大的意義


我們看pga空間大家記住一句話就ok了


一個會話,它的pga空間
其實就是這個會話的工作區
這個pga裏面絕大部分空間放的是和這個會話相關的一些工作區


會話主要乾的事情是執行sql
也就是sql工作相關的一些數據放到pga裏面


雖然說pga裏面有很多空間
如 私有sql區 session memory
但主要是sql工作區
另外兩塊現在不去理他
它和我們的優化和性能關係不大


實際上對我們來講pga我們主要研究工作區
研究pga實際上就是研究pga的sql工作區


就是這個serverprocess在執行sql的時候
它需要一個自己的工作空間


就是如一個辦公室
每人有一個桌子,桌子後面有一塊自己的空間
這個空間稱爲我們的工作區


比如我們辦公室有一個我們喝茶水的地方
對大家講是共享的
是一個道理


研究pga就是研究每一個session的每一個會話的sql工作區
這就是pga的構成


五)SQL工作區的組成


這個sql工作區都有哪些部分組成這是我們要講的
sql工作區主要有sort area、hash area和bitmap相關的幾個area


它裏面有分成幾大塊
有sort排序區,有hash區,還有位圖相關的位圖區
這三塊區


oracle的結構
有buffercache logbuffer
對應磁盤dbf redolog
從客戶來的session,和session的pga


我們通過session執行一個sql語句
SQL> select * from t2;

        ID NAME
---------- --------------------
         1 xkj
         2 jiagulun
這是一個sql語句
數據返回來了


執行另外一個sql語句
SQL> select * from t2 order by id desc;

        ID NAME
---------- --------------------
         2 jiagulun
         1 xkj
以id的降序把數據從t2裏面取出來


第一個語句隨機的把數據取出來
第二個進行了排序


這兩個sql語句有什麼不一樣?


第一個sql語句隨機取數據oracle怎麼取呢


select * from t;語句
t表實際只有兩行但假設有一萬行數據


第一、如果沒有排序
dbf中的block調到內存裏面去
假設數據在很多的block裏面
它會把block一個一個調到內存裏面去
然後從第一個block開始取數據
取出一行
取出後因爲沒有排序
直接取出一行返回一行
取出一行返回用戶一行
這是沒有排序
這時的pga空間幾乎沒有什麼意義沒有什麼作用
因爲數據從buffer裏面取出來以後直接返給我們的客戶
只是經過了pga一下
這是沒有排序


第二、有排序時
排序時會出現
在會話的pga空間
排序時取一萬行數據是
一萬行數據取出來排好序以後返給用戶


這時oracle會首先從buffer裏面把數據取出來
取出以後不會直接返給用戶
一萬行取出來以後
放到pga裏面去,在pga裏面排序
因爲pga是這個會話的一個工作空間
取出一萬數據以後會放到pga裏面去
利用pga的空間緩存這一萬行數據然後在pga裏面進行排序
排完序以後返給用戶


pga的第一個作用sort排序
所以pga裏面一定會有一部分空間
是專門系統來排序的
這塊我們叫sort_area_size


比如我需要排序的時候
sort_area_size有兩兆的空間
我需要5M的空間來排序
這時sort_area_size會增加
在內存空間可用的情況下
sort_area_size會增加到5M
排完序以後sort_area_size會釋放空間
釋放到什麼程度
有另外一個參數
sort_area_retained_size
比如sort_area_retained_size設到2M
sort_area_size釋放到2M的時候就不繼續釋放了就停了
這是最低保留的空間
這是排序區


另外還有一個hash區
oracle是個關係型數據庫
就是表和表之間有關係
我們經常會從兩個表或三個表裏面同時取數據


比如我想同時從三個表裏面取數據
這時我們就可能需要對三個表進行hash join
hash連接的時候就會用到hash area
用到hash_area_size
在oracle數據庫裏面很少出現單獨訪問一個表的情況
一般都訪問多個表
訪問多個表大部分情況會出現hash連接
hash連接就需要pga空間


記住oracle執行sql語句的時候
有兩個特色
第一個特色絕大部分情況下是多表同時訪問
就會用到hash
同時我們在訪問數據的時候
絕大部分的情況下我會加orderby會加排序
我們排完序以後把數據返給用戶的時候,用戶看到後更加友好
所以在大部分sql語句裏面會有排序會有hash連接


所以pga裏面的hash join和sort area size
這兩個空間很重要
我們要時刻關注這個空間夠不夠
我們很關注一個話題pga空間不夠以後我們該去怎麼辦



剛纔講了關於pga的作用和內存構成
下節再講pga的管理方式
就會涉及到內存空間不夠了以後怎麼辦等等一些內容


                     文字:韻箏

                                                                       2017年1月9日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章