程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 關於PGA的功能

關於PGA的功能

編輯:Oracle數據庫基礎
當用戶進程連接到數據庫並創建一個對應的會話時,Oracle服務進程會為這個用戶專門設置一個PGA區,用來存儲這個用戶會話的相關內容。當這個用戶會話終止時,數據庫系統會自動釋放這個PAG區所占用的內存。這個PGA區對於數據庫的性能有比較大的影響,特別是對於排序操作的性能。所以,在必要的時候合理管理PGA區,能夠在很大程度上提高數據庫的性能。

  一、 PGA與SGA的區別。

  PGA(程序緩存區)與SGA (系統全局區)類似,都是Oracle數據庫系統為會話在服務器內存中分配的區。不過兩者的作用不同,共享程度也不同。SGA系統全局區顧名思義,是對系統內的所有進程都是共享的。當多個用戶同時連接到一個例程時,所有的用戶進程、服務進程都可以共享使用這個SGA區。為此這個SGA的主要用途就是為不同用戶之間的進程與服務進程提供一個交流的平台。除了這個作用,另外有一個重要的作用就是各種數據庫的操作主要就是在這個SGA區內完成。

  而PGA程序緩沖區則主要是為了某個用戶進程所服務的。這個內存區不是共享的,只有這個用戶的服務進程本身才能夠訪問它自己的PGA區。做個形象的比喻,SGA就好像是操作系統上的一個共享文件夾,不同用戶可以以此為平台進行數據方面的交流。而PGA就好像是操作系統上的一個私有文件夾,只有這個文件夾的所有者才能夠進行訪問,其他用戶都不能夠訪問。雖然程序緩存區不像其他用戶的進程開放,但是這個內存區仍然肩負著一些重要的使命,如數據排序、權限控制等等都離不開這個內存區。

  二、 為排序設置合理的排序區大小。

  當用戶需要對某些數據進行排序時,數據庫是如何處理的呢?首先,數據庫系統會將需要排序的數據保存到PGA程序緩存區中的一個排序區內。然後再在這個排序區內對這些數據進行排序。如需要排序的數據有2M,那麼排序區內必須至少要有2M的空間來容納這些數據。然後排序過程中又需要有2M的空間來保存排序後的數據。由於系統從內存中讀取數據比從硬盤中讀取數據的速度要快幾千倍,為此如果這個數據排序與讀取的操作都能夠在內存中完成,無疑可以在很大程度上提高數據庫排序與訪問的性能。如果這個排序的操作都能夠在內存中完成,顯然這是很理想的。但是如果PGA區中的排序區容量不夠,不能夠容納排序後的數據,那會如何呢?此時,系統會從硬盤中獲取一個空間,用來保存這需要排序的數據。此時排序的效率就會降低許多。為此在數據庫管理中,如果發現用戶的很多操作都需要用到排序,那麼會用戶設置比較大的排序區,可以提高用戶訪問數據的效率。

  在Oracle數據庫中,這個排序區主要用來存放排序操作產生的臨時數據。一般來說,這個排序區的大小占據這PGA程序緩存取的大部分空間,這是影響PGA區大小的主要因素。在小型應用中,數據庫管理員可以直接采用其默認的值。但是在一些大型的應用中,或者需要進行大量記錄排序操作的數據庫系統中,管理員可能需要手工調整這個排序區的大小,以提高排序的性能。如果系統管理員需要調整這個排序區大小的話,需要通過初始化參數SORT_AREA_SIZE來實現。為了提高數據訪問與排序的性能,數據庫系統利用內存比硬盤要快幾千倍的實施,會將准備排序的數據臨時存放到這個排序區,並在排序區內完成數據的排序。管理員需要牢記這個原則,並在適當的情況下調整排序區的大小,以提高數據訪問與數據排序的性能。

  三、 會話區保存著用戶的權限等重要信息。

  在程序緩存區內還包含著一個會話區。雖然絕大部分情況下,管理員不要維護這個會話區,可以讓數據庫系統進行維護。但是,管理員還是需要了解一下這個會話區的作用。因為這個會話區直接關系著數據庫系統中數據的安全性。數據庫系統不僅是存放數據的一個很好的載體,而且在還提供了一個統一管理數據的平台,可以根據實際需要,為不同的用戶設置不同的訪問權限。簡單的說,在數據庫中可以控制用戶可以訪問哪些數據。從而提高數據的安全性。

  當用戶進程與數據庫建立會話時,系統會將這個用戶的相關權限查詢出來,然後保存在這個會話區內。如此的話,用戶進程在訪問數據時,系統就會核對會話區內的用戶權限信息,看看其是否具有相關的訪問權限。由於系統將這個用戶的權限信息存放在內存上,所以其核對用戶權限的速度非常的快。因為系統不用再去硬盤中讀取數據,直接從內存中讀取。而從內存讀取數據的效率要比硬盤上快幾千倍。

  通常情況下,這個會話區內保存了會話所具有的權限、角色、性能統計等信息。這個會話區一般都是由數據庫進行自我維護的,系統管理員不用干預。

四、 堆棧區保存變量信息。

  有時候為了提高SQL語句的重用性,會在語句中使用綁定變量。簡單的說,就是SQL語句可以接受用戶傳入的變量。從而用戶只需要輸入不同的變量值,就可以滿足不同的查詢需求。如現在用戶需要查詢所有員工的信息。然後其又要查詢所有工齡在3年以上的員工等等。此時其實他們采用的是同一個SQL語句,只是傳遞給系統的變量不同而已。這可以在很大程度上降低數據庫開發的工作量。這個變量在Oracle數據庫系統中就叫做綁定變量。利用綁定變量可以加強與用戶的互動性。另外在這個堆棧區內還保存著會話變量、SQL語句運行時的內存結構等重要的信息。

  通常情況下,這個堆棧區跟上面講到的會話區一樣,都可以讓數據庫系統進行自我維護,而管理員不用參與到其中。這些分區的大小,也是系統根據實際情況來進行自動分配的。當這個用戶會話結束時,系統會自動釋放這些區所占用的空間。

  五、 游標區。

  無論是SQLServer數據庫還是Oracle數據庫中,有時候都需要用到游標技術。當運行使用游標的語句時,Oracle數據庫系統會在程序緩存區中間為其分配一塊區。這塊區域就叫做游標區。通常情況下,游標用來完成一些比較特殊的功能。而且一般來說,采用游標的語句要比其他語句的執行效率低一點。為此管理員在使用游標的時候,還是需要慎重。

  游標區是一個動態的區域。當用戶執行游標語句時,系統就會在這個游標區內創建一個區域。當關閉游標時,這個區域就會被釋放。這創建與釋放,需要站用一定的系統資源,花費一定的時間。為此在使用游標時,如果頻繁的打開和關閉游標,就會降低語句的執行性能。所以筆者建議,在寫語句時,如果真的有必要使用游標技術時,則要注意游標不要頻繁的打開和關閉。

  另外在Oracle數據庫中,還可以通過限制游標的數量來提高數據庫的性能。如在數據庫系統中有一個初始化參數OPEN_CURSORS。管理員可以根據實際的需要,來設置這個參數,控制用戶能夠同時打開游標的數目。不過需要注意的是,在確實需要才有游標的情況下,如果硬件資源能夠支持的話,那麼就需要放寬這個限制。這可以避免用戶進程頻繁的打開和關閉游標。因為頻繁的打開和關閉游標這對游標的操作是不利的,會影響數據庫的性能。

  從以上的分析中可以看出,程序全局區主要包含排序區、會話區、堆棧區和游標區四個部分的內容,他們各司其職,完成用戶進程與數據庫之間的會話。通常情況下,系統管理員主要關注的是排序區,在必要時需要手工調整這個排序區的大小。另外需要主要的是,游標區是一個動態的區域,在游標打開時創建,關閉時釋放。故在數據庫開發時,不要頻繁的打開和關閉游標可以提高游標操作的效率,改善數據庫的性能。其他分區的內容管理員只需要了解其用途,日常的維護交給數據庫系統來完成即可。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved