程式整體區域PGA(Program Global Area;PGA)是一塊記憶體區塊,和共享記憶體(System Global Area;SGA)不同的是SGA是共用的記憶體區塊,而PGA是一塊私有的記憶體區塊,也就是說當一個使用者連線到Oracle資料庫時就會產生一個Server Process連線同時也會建立一個PGA的記憶體區塊,而PGA就是只提供給那一個Server Process專門使用,如果有10個Server Process就會產生10個PGA,因此在PGA裡面是不需要Latch所保護,因為專屬那個使用者連線,所以沒有別的連線來搶資源,而PGA 裡面包含server process正在執行的工作資訊與控制資訊,PGA的組成是由兩大塊區域所組成,固定PGA(Fix PGA)和可變PGA(Variable PGA),固定PGA和固定SGA類似,它的大小是固定的,包含了PGA的元件資訊和資料結構資訊等等,PGA的可變區域部分,主要分為三個主要區域Private SQL Area、Cursor和Session Memory此三塊主要區域功用如下:
- Private SQL Area:裡面包含了Bind Variable的數值和SQL語法運作時的記憶體結構等等資訊,除此之外此塊區域內還有一個重要的工作就是排序作業。在Private SQL Area內又分為兩塊如下所列:
- Persistent Area:裡面包含Bind Variable的資訊,當Cursor關閉時這塊區域就會被釋放。
- Run-time Area:這塊區域是SQL語法運作的地方,而這塊區域結束是根據語法運作完成而結束,Run-time Area還有一個特點是當遇到需要複雜運算查詢作業時,會在從此區域分出一塊SQL工作區域(SQL Work Area),而SQL工作區域(SQL Work Area)對於不同的作用會有不同的名稱,例如排序作業如Order By、Group By等等,此塊區域可稱為Sort Area,如果是用來做表格結合如Hash Join,此塊區域就可稱為Hash Area。Sort Area和Hash都是可以調整大小的,也就是說SQL工作區域是可以依據需求調整大小,一般來說大的SQL工作區域能讓某些SQL語法運作更順暢,但相對的也會消耗更多的記憶體,但如果太小相關的作業無法在此塊區域進行就會使用到Temp Tablespace而Temp Tablespace是硬碟上的一塊空間,也就是說相關的作業必須使用到I/O,如此SQL語法的執行效率與系統效能就會變差。
- Cursors and SQL Area:當Server Process為使用者執行SQL 語法時而這些語法是包含在預儲程式中(Precompiler Program)或是使用OCI(Oracle Called Interface)連接方式,都會利用打開Cursor(Open Cursor)來控制Private SQL Area,當Cursor關閉時Private SQL Area就會被釋放出來,也就是說當一個使用者連線進來運作,Server Process會追蹤有關的SQL語法,以及在PGA其中一塊記憶體上記錄執行進度,如果結束就會將相關的資源釋放,這塊記憶體稱為Cursor。
- Session Memory:Session Memory是用於保存Session的變數例如使用者登入時的資訊,還有其他與Session相關資的訊記憶體。
沒有留言:
張貼留言