Oracle數據庫是目前主流的商用數據庫之一,隨著硬件價格的下降,以及Oracle數據庫強大的數據管理能力和良好的平臺支持性,被越來越多的用戶使用。因此,如何使用Oracle數據庫實現一個高效的數據管理平臺,被廣泛關注。下面從Oracle數據庫實例的存儲管理、內存參數設置和日常維護等方面,分析影響數據庫性能的原因,從而通過合理的配置,實現一個高效的數據管理平臺。
1、存儲管理
系統(tǒng)的I/O性能是Oracle數據庫系統(tǒng)的性能瓶頸之一,選擇高速可靠的存儲設備,是解決數據庫性能問題的重要手段,在已有存儲設備的基礎上,如何合理的配置,也是提高Oracle數據庫性能的有效手段。
1.1 使用磁盤陣列
在數據庫服務器上,使用冗余獨立/廉價磁盤陣列(Redundant Array of Independent/Inexpensive Disks,RAID)配置磁盤幾乎已經成為一種規(guī)范,使用磁盤陣列可以改進性能和可用性。但是,選擇單塊磁盤時,應該根據數據庫需要存儲的數據量的大小來選擇磁盤容量,過大的容量會帶來不適當的冗余和較差的性能。同時,要根據數據庫的特點,選擇合適的RAID級別。RAID 5對于有大量讀操作的應用程序可以獲得最大的性能,這是一種低成本的解決方案,但是對于大量寫操作的Oracle應用程序,效率并不高。RAID 10是先鏡像,然后再對其進行分段,這是最常見的Oracle OLTP產品的RAID級別。它通過將RAID 0的磁盤I/O分段優(yōu)勢融入到RAID 1帶來的鏡像,結合了這個兩個RAID級別的優(yōu)點。在高讀/寫量的環(huán)境(如OLAP)中,由于對數據的小規(guī)模訪問會很頻繁,建議使用RAID 10。在硬件條件允許的情況下,還可以使用RAID 10或者RAID 5的改進方案。對于使用了磁盤陣列,不再需要把磁盤陣列上的一個邏輯設備分割成操作系統(tǒng)的多個盤區(qū),因為這樣做會增加必須管理的數據文件位置的數量,從而使得系統(tǒng)I/O性能下降。
1.2 關鍵數據文件分開存儲
為了更有效地在文件系統(tǒng)上操作Oracle數據庫,應該把關鍵的數據文件分布到可用的文件系統(tǒng)中。以下元素關聯的文件應該盡可能分離:SYSTEM表空間、TEMPORARY表空間、UNDO表空間、聯機重做日志文件(最好放在最快的磁盤上)、操作系統(tǒng)盤、放在ORACLE_HOME目錄下的關鍵ORACLE文件、經常被訪問的表的數據文件、經常被訪問的索引的數據文件、歸檔區(qū)域等。同時,分開存儲數據和索引文件。把關鍵的Oracle數據文件分開放置,這樣可以避免磁盤爭用成為一個“瓶頸”。通過把經常連接的幾個表的表和索引分開放置,保證即使最糟糕的表連接也不會導致磁盤爭用。
1.3 使用本地管理的表空間
在Oracle 8i之前,所有表空間的段的盤區(qū)信息都通過Oracle數據字典進行維護,這樣,發(fā)生在數據庫的段上并關系到盤區(qū)分配的操作,例如擴展或截取一個表,將會導致對數據字典的操作。如果有很多擁有大量盤區(qū)的表被操作時,維護數據字典將會成為這些操作的瓶頸。Oracle 8i推出了新的盤區(qū)管理方式,叫本地管理的盤區(qū),通過本地管理的盤區(qū),盤區(qū)管理操作被重新分配到數據文件頭中的位圖塊中,數據庫的每個表空間都只包含自己的盤區(qū)信息,可以使用快速散列進程訪問該信息,而不是使用較慢的基于表的查詢訪問,因而使用本地管理的表空間,可以提高性能?梢詣(chuàng)建本地管理的表空間,也可以把數據字典管理的表空間遷移到本地管理的表空間。
1.4 使用分區(qū)來避免磁盤爭用
分區(qū)技術是基于海量數據的數據庫系統(tǒng)(比如數據倉庫或者OLAP系統(tǒng))中最重要的一個技術,很難想象,在一個存儲著上TB或者幾十TB的數據庫中,數據表不使用分區(qū)的情況。分區(qū)可能是提高與大型表有關的性能的最佳方法。通過訪問一個表或索引的較小片段,而不是訪問整個表或索引,分區(qū)可以很好地提高效率。這個策略在一個或多個用戶訪問同一個表的多個部分時特別有效。如果一個表的分區(qū)(片段)位于不同的設備上,吞吐量就會大大增加,分區(qū)還可以被獨立地備份和恢復,這樣可以減少備份期間可能出現的磁盤I/O問題。僅當分區(qū)被正確實現后,才能體現Oracle性能提高的良好優(yōu)點。設計良好的分區(qū),在數據操作中,可以很好的實現分區(qū)規(guī)避,同時對索引進行分區(qū),并使用并行選項,可以使分區(qū)功能更強大。為了最小化對一個大表的磁盤I/O,應該把表分割在多個分區(qū)上,這些分區(qū)應該放置在不同的物理磁盤上。
1.5 使用自動存儲管理(Automatic Storage Management,ASM)
在Oracle Database 10g Release 2中,使用自動存儲管理極大地簡化了數據庫的存儲管理和配置。ASM提供了內置于Oracle數據庫內核中的文件系統(tǒng)和卷管理器功能,提供了跨越所有服務器和存儲平臺的簡單存儲管理界面。提供了管理動態(tài)數據庫環(huán)境的靈活性,并且可以有效地提高效率。
ASM主要有以下優(yōu)點:
1)將I/O均勻地分布到所有可用磁盤驅動器以防止產生熱點,并且最大化性能;
2)不再需要過多地進行配置工作,并且最大化推動數據庫合并的利用存儲資源;
3)內在地支持大文件;
4)在增量增加或刪除存儲容量后執(zhí)行自動聯機重分配;
5)維護數據的冗余副本以提高可用性,或者利用第三方的RAID功能。
Oracle數據庫可以包含ASM文件和非ASM文件,任何新的文件都可以創(chuàng)建為ASM文件,已有的文件也可以遷移到ASM。ASM降低了Oracle數據庫的成本和復雜性,并且不會影響到性能或可用性。構建ASM的主要用途是解決數據庫的配置和布局以及IT角色之間的通信。有資料表明,在同樣的硬件條件下,使用ASM比使用操作系統(tǒng)的文件系統(tǒng)的I/O要快26%左右。
總之,通過以上這些配置要么是提高磁盤I/O性能,要么就是減少I/O爭用,以此來提高數據庫性能。
2、內存優(yōu)化
Oracle實例的內存使用對性能起著至關重要的作用。如果未按最佳方式為各種結構分配內存量,性能將急轉直下。分配的內存量不能過少,也不能過多。在較早的數據庫版本中,DBA只有掌握大量的知識,花費大量的時間才能調整內存的使用,但是在11g版本中,內存調整大多可以自動完成。
Oracle實例中的內存使用分為兩類:程序全局區(qū)域(Program Global Area,PGA)和系統(tǒng)全局區(qū)域(System Global Area,SGA),前者專門供每個會話使用,后者由所有Oracle進程共享。從9i版本開始,PGA的管理實現了自動化,從10g版本開始,SGA的管理實現了自動化,11g版本可同時自動管理PGA和SGA。
2.1 PGA 內存管理
針對Oracle實例的用戶會話由連接到服務器進程的用戶進程組成。用戶進程生成SQL語句,并將它們發(fā)送到服務器進程供執(zhí)行,這就是客戶端與服務器的分工。與服務器進程關聯在一起的是非共享內存塊:PAG。在執(zhí)行SQL語句時,服務器進程使用PGA來存儲會話特有的數據,包括:臨時表、排序表、歸并位圖、變量、調用堆棧。PGA中的某些數據必須使用內存。例如,如果會話的調用堆棧需要內存,那么,相應的內存必須可供使用。而對于其他存儲結構,例如臨時表存儲,使用PGA的效果是不錯的,但PGA并不是必需的,因為可以將數據寫到基于磁盤的存儲結構中,但是這會對性能產生負面影響。Oracle強烈建議使用自動管理PGA內存。實現自動PGA內存管理,需要設置PGA內存分配總量(所有會話需要量之和)的目標,此后,Oracle實例將根據需要,從總量中為會話分配內存,在某個會話執(zhí)行完語句后,此會話使用的PGA可以分配給另一會話。在任何時刻,只有某些已經連接上的會話需要任何可轉讓的PGA內存,即使會話處于閑置狀態(tài),也都需要一定量的PGA內存來保留當前會話的狀態(tài),但總體看來,這會留下足夠的空間使正在實際運行語句的會話獲得需要的內存。
使用兩個實例參數來啟用PGA 內存的自動管理:WORKAREA_SIZE_POLICY,PGA_AGGREGAT_TARGET,WORKAREA_SIZE_POLICY的默認值是AUTO,就是自動將PGA分配給用戶,同時力求將PGA分配的總量保持在PGA_AGGREGAT_TARGET范圍以內。
2.2 SGA 內存管理
SGA包含多個內存結構,這些結構的大小可以以獨立方式調整,主要有:共享池、數據庫高速緩存區(qū)、大池 、流池、Java池、日志緩沖區(qū)。分配給大池、Java池和流池的內存與轉讓無關,原因是需要這樣的內存,或者相應的內容不可轉讓。如果這些結構不夠大,將發(fā)生錯誤;如果這些結構過大,也不會提高性能。分配給共享池、數據庫高速緩存區(qū)和日志緩存區(qū)的內存是可以轉讓的;如果達不到最優(yōu)大小,不會發(fā)生錯誤,但性能會因此下降。共享池是一個例外:如果在較長時間內達不到最優(yōu)大小,將會發(fā)生錯誤。
Oracle公司同樣建議對SGA內存進行自動管理。設置SGA的總大小,實例依據總量將內存分配給各個結構,確保不存在因SGA組件不夠大帶來錯誤,且分配大于最小限度的內存使SGA組件可以最佳狀態(tài)執(zhí)行。根據需要調整組件的大小,這樣,如果組件需要更多內存,可以從具有多余空間的組件那里獲取內存。要啟用SGA自動管理,則保留上述內存結構參數的默認值,并設置一個參數,來啟用自動共享內存管理:SGA_TARGET,在使用自動共享內存管理時,實例將監(jiān)視各個SGA組件的內存需求,并根據需要將內存分配給組件,如有必要,會減少內存容量,以便將內存分配總量控制在目標范圍內。包含在目標范圍的還有日志緩沖區(qū),其大小使用LOG_BUFFER參數進行設置。LOG_BUFFER的默認大小可能是正確的,可將此參數設置得比默認值更大,但這往往會導致性能下降,如果將其設置得低于默認值,將忽略相應設置。
2.3 Automatic Memory Management
使用Automatic Memory Management機制時,通過設置MEMORY_TARGET這個參數,就可以讓Oracle實例在總體上管理服務器內存的使用。這允許Oracle根據需要,在PGA和SGA之間轉換內存,從而將自動PGA管理和自動SGA管理又向前推進了一步。自動內存管理會帶來巨大的性能優(yōu)勢。在實例運行過程中,無法根據活動模式的更改,在SGA和PGA之間手工轉換內存,而且很多系統(tǒng)也無法同時為二者分配足夠的內存,來滿足它們的峰值需求;自動內存管理能夠根據需要,在SGA和PGA之間轉換內存,以便在內存總量允許的范圍內優(yōu)化性能。必須由DBA和系統(tǒng)管理員共同確定總量大小,如果DBA設置的上限過大,以至于操作系統(tǒng)必須將SGA和PGA分頁寫入交換設備,這將會失去意義;系統(tǒng)管理員將建議適當的最大值。
MEMORY_MAX_TARGET參數限制了MEMORY_TARGET參數的最大值不能超過。因此啟用自動內存管理,只要設置一個參數MEMORY_TARGET,而不必設置上面列出的其他參數。
2.4 使用內存顧問程序
Oracle實例收集大量有關活動和性能的信息。這些統(tǒng)計信息收集到內存中,并由MMON(Manageability Monitor)后臺進程定期轉儲到自動工作負荷倉庫(Automatic Workload Repository,AWR),這些統(tǒng)計信息供內存顧問程序使用。內存顧問程序是計算更改SGA和PGA內存結構大小的效果的工具。AWR工具使用顧問程序制定有關內存分配的決策,DBA可以通過各種視圖或者EntERPrise Management Database Control看到他們。通過查詢V$pga_target_advice、V$sga_target_advice和V$memory_target_advice,可以分別得到最佳的PGA、SGA和內存分配值。如果使用自動內存管理,僅需要查詢最后一個視圖,來確定Oracle實例總內存的最佳分配值。同樣,可以通過EntERPrise Management Database Control,使用顧問程序來收集有關內存分配的建議,通過打開Memory Advisors鏈接,可以分別查找SGA、PGA和Memory的當前設置大小和建議的最佳大小。
3、日常運行和維護
在數據庫的長期運行過程中,隨著數據量的增加,以及數據物理存儲的變化,數據庫的性能會有所下降,所以,對數據庫進行相關的日常維護,也是提高數據庫性能的重要手段。
3.1 歸檔舊的數據
遵循“二八”原則,數據庫中有很多數據很少被訪問到,所以應該對于這些“歷史”數據,進行相應的歸檔操作。如果是已經使用了分區(qū)的表,可以通過分區(qū)合并和拆分,進行數據歸檔。以此來降低查詢數據時的磁盤I/O量,減少DML操作時的鎖沖突,提高數據庫性能。
3.2 管理無效對象和無用對象
決定性能的另一關鍵因素是數據庫中各種對象的狀態(tài),如果PL/SQL對象是無效的(INVALID),則會對性能產生負面影響,也可能導致錯誤;如果無法使用索引,那么SQL語句的執(zhí)行速度可能大大降低,并更密集地使用資源。應該識別、了解和修復所有無效對象和不可用的對象。
1)無效對象
存儲的PL/SQL是數據字典中編譯為PL/SQL對象并在其中保持的代碼,可以是過程、函數、觸發(fā)器、程序包或對象類型。這些對象大多數會引用數據對象(例如表)。在編譯對象時,編譯器將檢查器引用的數據對象,以便確認代碼的定義正確。如果編譯時發(fā)現引用的數據對象不存在,會將該對象標記為無效;但是對象可能在創(chuàng)建一段時間之后變得無效。DBA_OBJECTS視圖包含STATUS列,該列標記對象的狀態(tài)是有效還是無效。如果有相關的無效對象,應該進行刪除或者修復。
2)無用的索引
一個索引由若干按照順序排列的索引鍵值組成,其中每個索引鍵值都具有相關聯的rowid,rowid是索引鍵引用的行的物理位置的指針。如果某個表的rowid發(fā)生變化,那么索引就會被標記為無用。索引變得無用的原因有許多種,其中最常見的是使用Alter table……move命令移動了指定的表,會改變所有行的物理位置,因此索引被指向錯誤的位置,對于分區(qū)表的分區(qū)調整,也同樣會產生無用索引。隨著時間的推移,執(zhí)行了許多影響行鍵值的刪除和更新操作,索引往往會變得無用。Oracle會發(fā)現這個錯誤,從而不允許使用該索引。
在Oracle 11g版本中,如果某條SQL語句試圖使用無用的索引,那么查詢會重新使用不需要該索引的執(zhí)行計劃,SQL語句的執(zhí)行總會成功,不過查詢的性能會顯著降低。這種方式由實例參數SKIP_UNUSABLE_INDEXES控制,它的默認值是TRUE。如果希望在查詢中使用到無用索引時返回錯誤消息,那么可以執(zhí)行Alter System Set SKIP_UNUSABLE_INDEXES=FALSE。通過查詢DBA_INDEXES視圖,運行Select owner, index_name from dba_indexes where status=’UNUSABLE’,可以查找變得無用的索引,并使用Alter Index …… Rebuild命令重新創(chuàng)建該索引。重建索引是數據庫正常維護工作的一部分。
3.3 消除數據碎片
碎片會阻礙數據庫的空間管理,但總的說來,一個段中的盤區(qū)量的多少總是會影響數據庫性能。擁有很多跨多個數據文件的不連續(xù)盤區(qū)的位圖索引就是一個大的性能問題?梢允褂谜_的盤區(qū)大小以消除碎片,對于已經有碎片的數據表,可以創(chuàng)建一個新表空間并把數據移到其中。
3.4 增加日志文件的大小
增加日志文件的大小和LOG_CHECKPOINT_INTERVAL以提高速度,如果想讓大量的INSERT、UPDATE和DELETE操作速度更快,可以增加日志文件大小,并確保這些文件在最快的磁盤上。Oracle依賴于聯機重做日志文件來記錄事務處理。每次數據庫中發(fā)生一次事務處理,聯機重做日志文件中就會增加一個條目。如果增大分配給日志的空間,就可以提高性能,沒有提交的事務同樣會生成日志條目,因為它們生成撤銷記錄,這些撤銷記錄也寫入到重做日志。增加日志文件的大小,從而增加處理大型IN?SERTS、DELETES和UPDATES(DMLs)操作的規(guī)模。
3.5 配置UNDO 表空間
回滾段保存了在一次更新和刪除期間內的數據快照,如果初始化參數UNDO_MANAGEMENT=MANUAL,那么就可以像Oracle前面的版本一樣使用回滾段。如果初始化參數UNDO_MANAGEMENT=AUTO,就使用撤銷表空間管理。當事務回滾時,就要用到數據快照,如果把數據庫設置為使用回滾段,要為各個回滾段保留多個表空間,這樣用戶就不會在同一個表空間中出現爭用現象。在Oracle 9i中,提出了一個管理Rollback或UNDO數據的新辦法,就是使用UNDO表空間,大大簡化了對事務的管理。在回滾段中,撤銷塊會根據需要被新的事務重寫,因而要保證有足夠大的回滾段可用于事務。從而避免執(zhí)行大的事務時發(fā)生快照太舊的錯誤,并且保證有足夠的回滾段來維護數據庫中的常規(guī)活動,從而最小化回滾段的爭用。為了利用自動撤銷管理,可以在數據庫中創(chuàng)建UNDO類型的表空間。并在初始化文件中指定3個新的參數:UNDO_MANAGEMENT=AUTO, UNDO_TABLESPACE=UN?DOTBS1, UNDO_RETENTION= 時間值,UNDO_RETENTION初始化參數用來指定撤銷數據被提交之后保留在表空間中的數據值(秒),這是使用撤銷表空間的真正優(yōu)點,因為不同于傳統(tǒng)的回滾段,數據庫至少會嘗試為長期運行的查詢維護較早版本的數據。如果將UNDO_MANAGEMENT設置為AUTO,即使用自動撤銷管理,就要將UNDO_TABLESPACE配置一個具體的表空間,如果沒有配置,則使用SYSTEM表空間,這將會影響數據庫性能。
通過V$UNDOSTAT視圖可以監(jiān)控實例中當前事務使用UNDO表空間的情況,視圖中的每行表示在過去24小時里每隔10分鐘UNDO表空間的使用情況、事務量和查詢長度等信息的統(tǒng)計快照,通過分析這些信息可以對UNDO表空間進行重新配置。
4、結束語
有關Oracle數據庫性能優(yōu)化的方法還有很多,例如配置RAC、實現Data Guard以及SQL查詢優(yōu)化等,相關的論文有很多,這里不再討論。
總之,在硬件設備既定的情況下,通過上述的相關配置,能夠進一步的提高和優(yōu)化Oracle數據庫的性能,實現一個功能強大的數據庫管理平臺。
轉載請注明出處:拓步ERP資訊網http://www.ezxoed.cn/