Oracle PGA詳解

xz43發表於2010-12-16

  當使用者程式連線到資料庫並建立一個對應的會話時,Oracle服務程式會為這個使用者專門設定一個PGA區,用來儲存這個使用者會話的相關內容。當這個使用者會話終止時,系統會自動釋放這個PGA區所佔用的記憶體。這個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。管理員可以根據實際的需要,來設定這個引數,控制使用者能夠同時開啟遊標的數目。不過需要注意的是,在確實需要才有遊標的情況下,如果硬體資源能夠支援的話,那麼就需要放寬這個限制。這可以避免使用者程式頻繁的開啟和關閉遊標。因為頻繁的開啟和關閉遊標這對遊標的操作是不利的,會影響資料庫的效能。

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-682002/,如需轉載,請註明出處,否則將追究法律責任。

相關文章