性能調整

-------
oracle實例中的內存使用分爲兩類:程序全局區PGA和系統全局區SGA,前者專門供每個會話使用,後者由所有oracle進程使用。
oracle使用的所有內存都是虛擬內存。oracle進程無法確定所連接的內存是在RAM中,還是已經交換(或分頁)到磁盤中。但是,交換會削弱性能,應予避免。
語句的共享sql區域在SGA的共享池中,而專用的sql區域在會話的PGA中。
-------------------------PGA內存管理
每個sql語句都使用sga中的內存(具體來說是共享池中的共享sql區域)並需要最低限度的pga內存(有時也稱爲專用sql區域),否則sql語句將無法執行。
提供更多的pga內存通常可以減少執行時間,但減少量並非直線下降。

針對oracle實例用戶會話由連接到服務器進程的用戶組成。用戶進程生成sql語句,並將他們發送到服務器進程供執行,這就是客戶端-服務器分離。與服務器進程關聯在一起的是非共享內存塊,PGA。
在執行sql語句時,服務器進程使用pga來存儲會話特有的數據,包括臨時表;排序行;合併位圖,變量,調用堆棧。
pga中的某些數據的使用內存時不可轉讓的。
例如如果會話的調用堆棧需要內存,那麼相應的內存必須可供使用。而對於其他結構(如臨時存儲)使用pga的效果是不錯的,但pga並不是必需的,
其原因在於:如有必要。則可以將數據寫出到基於磁盤的存儲結構中,但這會對性能產生負面影響。


一般而言,有三種內存分配方式,分別時優化,單道,和多道。
(1) 優化內存分配允許語句完全自啊內存中執行,不需要使用磁盤上的臨時存儲。
    優化內存分配足以容納所有輸入數據以及相應語句必須創建的任何輔助數據結構。
(2) 單道內存分配對於優化執行而言是不充分的,將降至對數據進行額外的傳輸。
(3) 多道內存分配更小,意味着需要對數據進行多次傳輸。
例如,考慮一個排序操作。
理想狀況是要排序所有行都可以讀入PGA,並在那裏排序。這裏需要的內存是優化內存分配。如果無法進行優化內存分配,則需要將行分解成爲多個批處理。每個批處理將讀入內存,進行排序,然後保存到磁盤中。結果
得到磁盤上的一組有序批處理,此後,需要將他們讀回內存中,併合併成最終的所有行的有序列表。此時需要的pga內存時單道分配;排序操作必須分解爲多個排序,之後進行合併。如果單道內存分配依然實現不了,
則合併階段和排序階段要求使用臨時磁盤存儲,這就是多道執行。
最理想的狀況是:所有sql語句都以最優方式執行,但這個目標可能遙不可及。在數據倉庫操作中,如果針對大量的表執行查詢,則優化內存分配量可能達到數GB。在此類環境中,單道執行最合適。要儘可能避免多道
執行。例如爲了排序10GB的數據,要最理想的方式運行,有時可能需要10GB以上的內存,而在單道運行中,僅需要40MB。只有分配量低於40MB時,才執行多道排序,此時,執行時間將大幅增加。
-----自動pga內存管理
爲了實現自動pga內存管理,需要設置pga內存分配總量(所有會話需要量之和)的目標。此後,oracle實例將根據需要,從總量中爲會話分配內存。
在某個會話執行完語句後,此會話使用的pga可以分配給另一個會話。這種系統基於這樣的事實:在任何時刻,只有某些已經連接上的花花需要任何轉讓的PGA內存。即使會話處於閒置狀態,也都需要一定量的PGA內存來保留當前會話的狀態,但總體看來,這會留下足夠的空間使正在實際運行語句的會話獲得需要的內存。至少說,這是希望達到的效果。

使用兩個實例參數來啓用自動pga內存管理
(1)workarea_size_policy
(2)pga_aggreagte_targert

workarea_size_policy默認值是auto,這意味着,oracle可以根據需要,將PGA分配給會話,同時力求將PGA分離總量保持在pga_aggreagte_targert範圍以內。此參數的默認值設置是大於10MB,或者SGA大小的20%,應對其執行向上調整,直至令人滿意的語句比例可以以最優方式執行,但又不至於過高,以致內存分配量過多,並且操作系統必須將虛擬內存分頁到磁盤.
對於很多系統而言,pga_aggreagte_targert的默認值過小,不能達到最佳性能。

-----------------------------SGA內存管理

SGA包含多個內存結構,這些結構的大小可以獨立地調整,如下所示
共享池,數據庫緩衝區緩存,大池,流池,java池,日誌緩衝區
一般規則是,分配給大池,java池和流池的內存不可轉讓。只是需要或不需要這樣的內存。如果這些結構不夠大,那麼將發生錯誤;如果這些結構過大,就不會提高性能。
分配給共享池,數據庫緩衝區的內存是可轉讓的:如果達不到最優大小,那麼不會發生錯誤,但性能會因此下降。
共享池是一個例外;如果在較長時間內達不到最優大小,那麼將會發生錯誤。
不要爲oracle分配不必要的內存。過大的共享池或日誌緩衝區會對性能產生嚴重的負面影響。過大的緩衝區緩存區應該不會帶來問題,但前提是其大小不至於迫使系統執行交換操作。
SGA內存管理可以自動進行(oracle公司建議您這麼做),但日誌緩衝區屬於例外情況。
dba設置SGA的總大小,實例依據總量將內存分配給各個結構,確保不存在因SGA組件不夠大帶來錯誤,且分配大於最小限度的內存使sga組件可以最佳狀態運行。
將根據需要調整組件的大小,這樣,如果組件需要更多內存,就可以從具有多餘空間的組件那裏獲取內存。
日誌緩衝區是一個SGA組件,其大小在啓動實例時固定下來,無法進行自動管理。
--手動管理SGA的參數如下:
shared_pool_size
db_cache_size
large_pool_size
streams_pool_size
java_pool_size
-----自動共享內存管理(ASSM)
要啓用sga自動管理,則保留使用所有這些參數的默認值(或將其設置爲0),並設置一個參數來啓用自動共享內存管理(ASSM)
--SGA_TARGET
在使用ASSM時,實例將監視各個SGA組件的內存需要,並根據需要將內存分配給組件,如有必要,就會減少內存容量,以便將內存分配總量控制在目標範圍內。
包括在目標範圍的還有日誌緩衝區,其大小使用靜態的log_buffer參數進行設置,在啓動實例時創建日誌緩衝區,其大小以後不能在調整。
日誌緩衝區是唯一不能動態調整的SGA結構。因此,也不能自動管理它。
如果設置了任何控制自動管理的SGA組件的參數,那麼給定的值將作爲最小大小(ASSM不會使組件的內存低於此值)

-------------------------------------------------------------AMM自動內存管理

使用自動內存管理(AMM)機制時,通過設置memory_target這個參數,就可以讓oracle實例從總體上管理服務器內存的使用,這允許oracle根據需要在PGA和SGA之間轉換內存,從而將自動PGA(pga_aggregate_target啓用)和自動共享內存管理(使用SGA_TARGET啓用)又向前推進了一步。
要啓用自動內存管理,設置一個參數memory_target,而不必設置上面列出的其他參數,log_buffer參數屬於例外情況。(此參數通常也可以保留爲默認值)
memory_target參數是動態的,可以自動不關閉實例的情況下對其進行調整,但其調整不能超過另一個參數memory_max_target設置的限制。
後者時靜態的,要將其調整更大,只能通過SCOPR_SPFIL子句進行調整然後重新啓動實例。

自動內存管理並非只是一個簡化數據庫管理的工具,它也會帶來巨大的性能優勢。很多數據庫在不同時間經歷不同的活動模式,他們將從不同的內存配置中獲益。
例如,用於處理訂單的數據庫常在月中處理大事務,而在月底報告運行期間處理大量的查詢,事物處理通常對PGA內存要求不高,但要求使用大的數據庫緩衝區緩存。
查詢處理同從需要大的PGA分配,並不需要過大的緩衝區緩存。
在實例中,無法根據活動模式的更改,在SGA和PGA之間手動轉換內存,而且很多系統也無法同時爲二者分配足夠的內存來滿足他們的峯值需求。
自動內存管理能夠根據需要在SGA和PGA之間轉換內存,以便在內存總量約束的範圍內優化性能。必須由dba和系統管理員共同確定總體約束。
如果dba設置得上限過大,以至於操作系統必須將SGA和PGA分頁到交換設備,這就會失去意義,系統管理員將建議適當的最大值。
如果在啓用AMM的情況下設置了參數pag_aggregate_target或sga_target,那麼指定的值將是最小大小(AMM不會使PGA或SGA低於此值)


------------------------內存顧問


-----------------------sql調整顧問


-----------------------sql訪問顧問


-----------------------通過dbms_Advisor使用sql access advisor

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章