文章詳情頁
構建高性能Oracle運行系統的原則
瀏覽:4日期:2023-11-19 13:24:56
要得到高性能運轉的Oracle數據庫系統,首先要做到未雨綢繆,即首先要做好系統規模與容量的規劃,要做好這兩方面的規劃,必須要從三方面考慮: 分別是:CPU利用率,I/O子系統(主要是磁盤)的使用,內存使用。 其中CPU利用率與用戶進程數量有關,隨著用戶數量的增加,用戶進程數量必然增長,所以在選擇CPU時,要優先選擇那些主頻高緩存區大的CPU,而且要預先對用戶的增長趨勢做好猜測,為CPU的擴展做好預備; 另外在任何系統中的資源都會由于使用者請求數量的增加而造成等待排隊,等待排隊數量越多,通常系統的響應速度越慢,在這方面I/O子系統的表現最為明顯(網絡子系統與I/O子系統類似,因此也有類似表現),據權威測試結果顯示,假如對I/O子系統中的某個資源(比如磁盤)的過多訪問,造成這種資源的利用率超過其自身極限的80%,那么就會造成對這種資源的訪問等待隊列中的排隊數量呈幾何級數增長。 因此為規避這種對I/O系統的過載訪問,一般采用RADI陣列技術,Oracle的推薦原則是使用RADI10,這可以做到性能與容錯的完美折中,但是價格上比較昂貴。假如因為經濟條件的限制,可以使用RADI5,這是最為經濟的一種規劃,但是對寫操作的性能較差,據成熟經驗除非應用系統的讀寫比例為90%/10%,否則不要使用RADI5,當然實際標準可能不一樣,而且假如I/O非常少,RADI5也沒有問題。 接下來就是內存使用問題,這也是最復雜的方面,因為它與操作系統,Oracle數據庫實例,應用系統本身三方面有關。 其中前兩方面關系更為密切,因為Oracle實例在運行時是由一系列后臺進程以及這些進程所使用的內存所組成,進程所使用的內存就是所謂的系統全局區SGA,SGA包括固有的兩部分,即數據庫高速緩存和重做日志緩沖區,還有一部分稱為共享池,這部分中有一些必須的池如:數據字典緩存池等,還有一部分可選池如:大池(用于I/O讀寫)等,這需要根據系統要提供的功能和服務來進行取舍。 除了SGA還存在PGA,即用戶進程所使用的內存空間。這部分空間的分配與使用,與操作系統和Oracle本身有關,因此調整和配置它們也要從這兩方面考慮。 在Oracle9i即以后版本中,可以通過設定PGA_AGGREGATE_TARGET參數來指定PGA內存大小,一般的原則為用物理內存數減去SGA規劃的內存數的剩余部分劃分給PGA。SGA運行時位于操作系統的共享內存空間中,而PGA位于操作系統堆棧段中,因此SGA運行時不會被操作系統通過內存交換換出到磁盤,而PGA有可能被換出。 對于大部分的主流操作系統來說,內存治理都是采用虛擬內存的頁式內存治理,這對Oracle性能會造成影響,因此要合理調節Oracle盡量避免頁式調度的發生。因此我強烈推薦在單一主機上運行Oracle,而且只運行Oracle。剩下的就是應用系統的優化問題了,這也包含兩個方面:(1)程序代碼的編寫;(2)生產數據庫的設計; 首先生產數據庫的結構要設計合理,包括冗余字段的規劃、消除冗余的規劃、索引的建立,簇的建立,是否使用物化視圖,對大數據量的表建立分區,以及優化針對數據庫對象的設計(比如塊尺寸的調整、表的PCTUSED,PCTFREE選項的調整等),這些都要在設計時更具業務特點進行考慮,或者在開發過程中根據業務變化進行修正; 其次程序代碼要進行合理編寫,比如檢索語句要進量使用各種手段進行優化(如使用線索技術等,對于各種優化規則,請參見我的另一篇翻譯文檔《Oracle語句優化規則》),恰當合理的利用存儲過程,以及對存儲過程進行優化等,這些都要在開發過程中加以注重。而且還包括編程語言自身(如:Java,C++等)的優化(比如使用先進算法,合理使用語言,選用更先進的編譯技術等),這是另外的議題,這里我不做討論。 總之建立一個高性能,健壯的Oracle運行系統(也包括其他系統如:DB2系統,SQLServer系統等),是要由多方面綜合因素決定的,必須要在這些方面綜合考慮,通盤規劃才可以。
排行榜
