當使用者進程串連到資料庫並建立一個對應的會話時,Oracle服務進程會為這個使用者專門設定一個PGA區,用來儲存這個使用者會話的相關內容。當這個使用者會話終止時,資料庫系統會自動釋放這個PAG區所佔用的記憶體。
當使用者進程串連到資料庫並建立一個對應的會話時,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。管理員可以根據實際的需要,來設定這個參數,控制使用者能夠同時開啟遊標的數目。不過需要注意的是,在確實需要才有遊標的情況下,如果硬體資源能夠支援的話,那麼就需要放寬這個限制。這可以避免使用者進程頻繁的開啟和關閉遊標。因為頻繁的開啟和關閉遊標這對遊標的操作是不利的,會影響資料庫的效能。
從以上的分析中可以看出,程式全域區主要包含排序區、會話區、堆棧區和遊標區四個部分的內容,他們各司其職,完成使用者進程與資料庫之間的會話。通常情況下,系統管理員主要關注的是排序區,在必要時需要手工調整這個排序區的大小。另外需要主要的是,遊標區是一個動態地區,在遊標開啟時建立,關閉時釋放。故在資料庫開發時,不要頻繁的開啟和關閉遊標可以提高遊標操作的效率,改善資料庫的效能。其他分區的內容管理員只需要瞭解其用途,日常的維護交給資料庫系統來完成即可。