Oracle體系架構:進程全局區PGA
最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!
我要咨詢一個PGA(Porcess Global Area)是一塊獨占內存區域,Oracle進程以專有的方式用它來存放數據和控制信息。當Oracle進程啟動時,PGA也就由Oracle數據庫創建了。當用戶進程連接到數據庫并創建一個對應的會話時,Oracle服務進程會為這個用戶專門設置一個PGA區,用來存儲這個用戶會話的相關內容。當這個用戶會話終止時,系統會自動釋放這個PGA區所占用的內存。這個PGA區對于數據庫的性能有比較大的影響,特別是對于排序操作的性能。所以,在必要的時候合理管理PGA區,能夠在很大程度上提高數據庫的性能。
程序全局區主要包含排序區、會話區、堆棧區和游標區四個部分的內容,他們各司其職,完成用戶進程與數據庫之間的會話。通常情況下,系統管理員主要關注的是排序區,在必要時需要手工調整這個排序區的大小。另外需要主要的是,游標區是一個動態的區域,在游標打開時創建,關閉時釋放。故在數據庫開發時,不要頻繁的打開和關閉游標可以提高游標操作的效率,改善數據庫的性能。其他分區的內容管理員只需要了解其用途,日常的維護交給數據庫系統來完成即可。
1、 為排序設置合理的排序區大小。
當用戶需要對某些數據進行排序時,數據庫是如何處理的呢?首先,數據庫系統會將需要排序的數據保存到PGA程 序緩存區中的一個排序區內。然后再在這個排序區內對這些數據進行排序。如需要排序的數據有2M,那么排序區內必須至少要有2M的空間來容納這些數據。然后 排序過程中又需要有2M的空間來保存排序后的數據。由于系統從內存中讀取數據比從硬盤中讀取數據的速度要快幾千倍,為此如果這個數據排序與讀取的操作都能 夠在內存中完成,無疑可以在很大程度上提高數據庫排序與訪問的性能。如果這個排序的操作都能夠在內存中完成,顯然這是很理想的。但是如果PGA區 中的排序區容量不夠,不能夠容納排序后的數據,那會如何呢?此時,系統會從硬盤中獲取一個空間,用來保存這需要排序的數據。此時排序的效率就會降低許多。 為此在數據庫管理中,如果發現用戶的很多操作都需要用到排序,那么為用戶設置比較大的排序區,可以提高用戶訪問數據的效率。
在Oracle數據庫中,這個排序區主要用來存放排序操作產生的臨時數據。一般來說,這個排序區的大小占據PGA程序緩存區的大部分空間,這是影響PGA區大小的主要因素。在小型應用中,數據庫管理員可以直接采用其默認的值。但是在一些大型的應用中,或者需要進行大量記錄排序操作的數據庫系統中,管理員可能需要手工調整這個排序區的大小,以提高排序的性能。如果系統管理員需要調整這個排序區大小的話,需要通過初始化參數SORT_AREA_SIZE來實現。為了提高數據訪問與排序的性能,數據庫系統利用內存比硬盤要快幾千倍的事實,會將準備排序的數據臨時存放到這個排序區,并在排序區內完成數據的排序。管理員需要牢記這個原則,并在適當的情況下調整排序區的大小,以提高數據訪問與數據排序的性能。
2、 會話區保存著用戶的權限等重要信息。
在程序緩存區內還包含著一個會話區。雖然絕大部分情況下,管理員不要維護這個會話區,可以讓數據庫系統進行 維護。但是,管理員還是需要了解一下這個會話區的作用。因為這個會話區直接關系著數據庫系統中數據的安全性。數據庫系統不僅是存放數據的一個很好的載體, 而且還提供了一個統一管理數據的平臺,可以根據實際需要,為不同的用戶設置不同的訪問權限。簡單的說,在數據庫中可以控制用戶可以訪問哪些數據,從而提高 數據的安全性。
當用戶進程與數據庫建立會話時,系統會將這個用戶的相關權限查詢出來,然后保存在這個會話區內。如此的話,用戶進程在訪問數據時,系統就會核對 會話區內的用戶權限信息,看看其是否具有相關的訪問權限。由于系統將這個用戶的權限信息存放在內存上,所以其核對用戶權限的速度非常的快。因為系統不用再 去硬盤中讀取數據,直接從內存中讀取。而從內存讀取數據的效率要比硬盤上快幾千倍。
通常情況下,這個會話區內保存了會話所具有的權限、角色、性能統計等信息。這個會話區一般都是由數據庫進行自我維護的,系統管理員不用干預。
3、 堆棧區保存變量信息。
有時候為了提高SQL語句的重用性,會在語句中使用綁定變量。簡單的說,就是SQL語句可以接受用戶傳入的變量。從而用戶只需要輸入不同的變量 值,就可以滿足不同的查詢需求。如現在用戶需要查詢所有員工的信息。然后其又要查詢所有工齡在3年以上的員工等等。此時其實他們采用的是同一個SQL語 句,只是傳遞給系統的變量不同而已。這可以在很大程度上降低數據庫開發的工作量。這個變量在Oracle數據庫系統中就叫做綁定變量。利用綁定變量可以加強與用戶的互動性。另外在這個堆棧區內還保存著會話變量、SQL語句運行時的內存結構等重要的信息。
通常情況下,這個堆棧區跟上面講到的會話區一樣,都可以讓數據庫系統進行自我維護,而管理員不用參與到其中。這些分區的大小,也是系統根據實際情況來進行自動分配的。當這個用戶會話結束時,系統會自動釋放這些區所占用的空間。
4、 游標區。
無論是SQLServer數據庫還是Oracle數據庫中,有時候都需要用到游標技術。當運行使用游標的語句時,Oracle數據庫系統會在程序緩存區中間為其分配一塊區域。這塊區域就叫做游標區。通常情況下,游標用來完成一些比較特殊的功能。而且一般來說,采用游標的語句要比其他語句的執行效率低一點。為此管理員在使用游標的時候,還是需要慎重。
游標區是一個動態的區域。當用戶執行游標語句時,系統就會在這個游標區內創建一個區域。當關閉游標時,這個區域就會被釋放。這創建與釋放,需要 站用一定的系統資源,花費一定的時間。為此在使用游標時,如果頻繁的打開和關閉游標,就會降低語句的執行性能。所以筆者建議,在寫語句時,如果真的有必要 使用游標技術時,則要注意游標不要頻繁的打開和關閉。
另外在Oracle數據庫中,還可以通過限制游標的數量來提高數據庫的性能。如在數據庫系統中有一個初始化參數OPEN_CURSORS。管理員可以根據實際的需要,來設置這個參數,控制用戶能夠同時打開游標的數目。不過需要注意的是,在確實需要才有游標的情況下,如果硬件資源能夠支持的話,那么就需要放寬這個限制。這可以避免用戶進程頻繁的打開和關閉游標。因為頻繁的打開和關閉游標這對游標的操作是不利的,會影響數據庫的性能。