張秋鳳
【摘要】 本文通過對硬件性能、數據庫系統參數以及應用程序等方面的闡述,總結了基于ORACLE數據庫的應用系統的優化方法。
【關鍵詞】 oracle數據庫 應用系統 數據庫優化
一、引言
某政府機關內、外網部署了大量的業務應用系統,數據庫主要采用ORACLE數據庫。軟硬件已經使用7-8年以上,數據庫每天都在更新。隨著應用系統的增加和業務數據量的增長,導致整個Oracle數據庫系統的性能不斷下降。為了保證這些信息系統能夠高效運行,需要進行性能優化調整。本文通過對硬件性能、數據庫系統參數以及應用程序等方面進行有效性的操作優化,來提升業務應用系統的性能。
二、基于ORACLE數據庫應用系統的優化
本文探討的是從硬件性能、數據庫、應用程序方面進行優化,以便提高Oracle數據庫的性能效率,對業務應用系統進行整體優化。
2.1硬件性能的優化
硬件設計時要考慮承載能力和生命周期,同時通過調整相關的參數設置,確保硬件提供給業務應用系統充足的資源。
2.1.1服務器磁盤的優化
設定虛擬內存、檢查應用軟件或者驅動程序、減少桌面圖標、減少字體種數、刪除隨機啟動程序、取消背景和關閉activedesktop。關注磁盤錯誤信息和磁盤空間大小的變化,必要時增加磁盤容量。
2.1.2服務器CPU的優化
檢查空閑期間、高峰期間以及平均的CPU利用率。建議峰值在85%以下。如果CPU的利用率過高,增加一定數量的CPU來解決利用率過高的問題。
2.1.3服務器內存的優化
改變頁面文件的位置、改變頁面文件的大小、禁用頁面文件、清空頁面文件、調整高速緩存區域的大小、監視內存以及及時釋放內存空間、優化內存中的數據,并且可以采用一些優化軟件來優化內存,使得緩存、內存達到一個穩定值。
2.1.4網絡的優化
網絡優化是指通過各種硬件或軟件技術使網絡性能達到我們需要的最佳平衡點。要保證網絡上的帶寬流量和網絡的速度。應用程序有C/S , B/S模式。C/S模式應用程序的客戶端應用程序之間網絡吞吐量大,引起的網絡I/O小,數據庫性能強。
2.2數據庫設計的優化
2.2.1調整數據結構的設計
開發信息系統之前要完成數據結構的設計,需要考慮是否使用Oracle數據庫的分區功能,對于信息系統經常訪問的數據庫表是否需要建立索引等。根據使用方式和物理結構對數據庫的影響,對數據庫中的邏輯對象進行分類(包括將系統數據和用戶數據分開、一般數據和索引數據分開、低活動表和高活動表分開等等)。數據庫邏輯設計的結果應當符合如下準則:(1)把以同樣方式使用的段類型存儲在一起;(2)按照標準使用來設計系統;(3)存在用于例外的分離區域;(4)最小化表空間沖突;(5)將數據字典分離。
2.2.2調整數據庫SQL語句
應用程序的執行最終將歸結為數據庫中的SQL語句執行,因此SQL語句的執行效率最終決定了Oracle數據庫的性能。可以采用Oracle公司推薦使用的Oracle語句優化器(Oracle Optimizer)和行鎖管理器(Row-Level Manager)來調整優化SQL語句。還可以采用下面的優化方法:
1)使用快照和顯形圖等分布式數據庫對象,減少對數據庫的查詢次數,即減少對系統資源的請求;
2)盡量使用相同的或非常類似的SQL語句進行查詢,充分利用SQL共享池中的已經分析的語法樹,要查詢的數據在SGA中命中的可能性也會大大增加。
3)避免不帶任何條件的SQL語句的執行。
4)如果對有些表中的數據有約束,在建表的SQL語句用描述完整性來實現,不用SQL程序中實現。
2.2.3調整服務器內存分配
內存分配是在信息系統運行過程中優化配置的,可以根據數據庫運行狀況調整數據庫系統全局區(SGA區)的數據緩沖區、日志緩沖區和共享池的大小。還可以調整程序全局區((PGA區)的大小。正確的SGA|、PGA大小的設置對數據庫的性能至關重要。
2.2.4合理設計和管理表
1)利用表分區。分區將數據在物理上分隔開,將不同分區的數據保存在處于不同磁盤上的數據文件里。當對這個表進行查詢時,只需要在表分區中進行掃描,而不必進行全表掃描,明顯縮短了查詢時間,同時將數據傳輸對磁盤I/O競爭均勻地分散開。
2)避免出現行連接和行遷移。在建表時,充分估計到將來可能出現的數據變化,正確設置pctfree和pctused參數,盡量減少數據庫中出現行鏈接和行遷移。
3)使用別名。別名就是將表名、列名在查詢中以一個字母為別名,查詢速度可提升1.5倍。
2.2.5索引Index的優化設計
1)管理組織索引。索引把表中的邏輯值映射到RowID,能夠快速定位數據的物理地址(大型表分區后建立分區索引),可以大大加快數據庫的查詢速度。
2)使用聚簇。聚簇是根據共同碼值將多個表的數據存儲在同一個Oracle塊中,這時檢索一組Oracle塊就同時得到兩個表的數據,從而減少需要存儲的Oracle塊,提高應用程序的性能。
3)ORACLE使用索引的基本的條件。where子名中的這個字段,必須是復合索引的第一個字段,且不應該參與任何形式的計算。
2.2.6多CPU并行查詢PQO(Parallel Query Option)方式的利用
對于多CPU系統,考慮采用Parallel Query Option(PQO,并行查詢選項)方式進行數據庫操作。不僅可以在多個CPU間分配SQL語句的請求處理,當所查詢的數據處于不同的磁盤時,一個個獨立的進程可以同時進行數據讀取。
2.3應用程序的優化
2.3.1盡量使用框架結構
應用程序的體系結構確定后,應盡量使用成熟的框架來實現。實踐證明,成熟的框架開發模式可以大大提高程序效率和易用性。節省開發時間,同時使得后期系統的優化和變更更容易。最重要的是,對性能優化有很大幫助。
2.3.2數據庫連接優化
1)使用直接的OLE DB數據庫連接方式。通過ADO可以使用兩種方式連接數據庫,一種是傳統的ODBC方式,一種是OLE DB方式。ADO是建立在OLE DB技術上的,為了支持ODBC,必須建立相應的OLE DB到ODBC的調用轉換,而使用直接的OLE DB方式則不需轉換,從而提高處理速度。
2)使用Connection Pool機制。在數據庫處理中,資源花銷最大的是建立數據庫連接,而且用戶還會有一個較長的連接等待時間。解決的辦法就是復用現有的Connection,也就是使用Connection Pool對象機制,可以大大地提高系統的響應速度。
2.3.3 HQL語句的調整優化
系統在數據層使用hibernate框架,因此對hql語句進行優化也可以提高系統性能,包括:
1)盡量使用索引。
2)在多張表進行聯合查詢時,應注意各表的聯查次序及連接方式。
3)在子查詢中慎重使用IN或者NOT IN語句,使用where (NOT) exists的效果要好得多。
4)慎重使用視圖的聯合查詢,尤其是比較復雜的視圖之間的聯合查詢。一般對視圖的查詢最好都分解為對數據表的直接查詢效果要好一些。
5)可以在參數文件中設置SHARED_POOL_ RESERVED_SIZE參數,這個參數在SGA共享池中保留一個連續的內存空間,連續的內存空間有益于存放大的SQL程序包。
6)注意建立索引時的列順序。在多個列上面建立索引的時候,索引中列順序的不同,可以導致索引的作用效果不同,對性能產生很大的影響。
例如:假設有一個索引,名字為Idx_test,包含了表中的三個值,三個列在索引中的順序為:ID,SomeDate,SomeString,按照選擇性由大到小的順序排列(選擇性大小描述了數據差異的大小)。
對于這個索引,只有在查詢中的Where/Join的列按照索引中的列的順序使用的時候才是有效的。類似下面的查詢結構中是能夠發揮作用的,如:
… WHERE ID = @ID AND SomeDate = @dt AND SomeString = @str
… WHERE ID = @ID AND SomeDate = @dt
… WHERE ID = @ID
如果查詢是下面這樣的,如:
… WHERE SomeDate = @dt
或者… SomeDate = @dt AND SomeString = @str ,那么,這個索引就不會在上面的查詢中使用了,那么查詢在執行的時候就會掃描整表了。
三、結束語
提高系統性能需要一種系統的整體的方法。對性能問題的考慮應貫穿于開發階段的全過程,不應只在出現問題時才考慮性能問題。
為了保證應用系統的高效性和穩定性,本文從硬件性能、數據庫系統參數以及應用程序等方面,提出了具有針對性的優化方法。基于oracle數據庫應用系統的優化體現在系統設計、開發、運行等各個階段,需要程序員和數據庫管理員認真分析問題,對數據庫及應用程序等進行調整和性能調節,從而保證應用系統的高效、穩定運行。
參 考 文 獻
[1] 李學忠.ORACLE數據庫的優化使用.電子工藝技術,2003.24(5):219-224.
[2] 賈小恒.淺析Oracae數據庫的優化.軟件時空,2011.11.
[3] 符浩.ORACLE數據庫優化理論探討.科技資訊,2012.11.
[4] 陳建云,林春艷,曾昊川. ORACLE應用系統數據庫的優化探討.信息安全與技術,2014.12.