前言
最近hyddd一直看Oracle的資料,今天特地總結一下這段時間了解到的關於Oracle性能優化的下手點。
一.數據庫優化的方向
1.程序設計(這點最重要,如果程序本身設計有問題,再怎麼進行下面的優化都是徒勞的。)
2.操作系統優化
3.硬件優化
4.數據庫優化
5.SQL語句優化
二.硬件優化
這裡涉及到的硬件主要有:硬盤,內存。
1.硬盤的讀寫速度:建議增加硬盤的數量,從而增加每秒的並發操作。
2.內存大小。
三.數據庫優化
以上是Oracle 9i的體系結構,關於Oracle數據庫的優化,很大程度上圖有關。
1.根據數據庫的使用方式得出合理的優化策略
(1)OLTP:連機事務處理。
需要實時處理大量請求,而每次處請求的數據量都是很小的。OLTP是傳統的關系型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。
性能好壞的重要指標:響應時間與請求處理並發數。
(2)OLAP:聯機分析處理。
可以簡單地理解為在海量數據中得出統計/綜合信息,是數據倉庫的主要應用。做OLAP應用的數據庫,數據量通常量非常大。和OLTP不同,OLAP應用的並發處理量是很低的,所以基本不用考慮並發問題。而在處理數據量方面,OLAP每次操作所需要處理的數據量通常都是非常大的,這點也和OLTP相反。
性能好壞的重要指標:查詢大量數據的速度。
由於OLTP和OLAP是兩個不同應用方向,所以在優化數據庫時應采取不同的優化策略。
2.內存分配比例:2:1:1
內存分配的較佳方案:SGA占50%的物理內存,PGA和操作系統各占25%的物理內存,當然這也不是絕對的,但是SGA占的物理內存不能超過75%,最多只能占70%,否則Oracle可能會出現各種的異常。
3.SGA中各個POOL的內存分配
(1)Shared Pool:要分配多少內存不定,只要滿足以下兩個條件即可:
-Lib Cache的命中率>98%
-Data Dictionary Cache的命中率>85%
(2)Large Pool
-專用服務器:100-200M
-共享服務器:Session * (Sort_area_size + 2)
(3)Java Pool:無需使用,一般不分配空間。
(4)Redo Log Buffer Cache:小於5M,因為它的信息非常重要,應盡快把緩存數據寫到文件中。
(5)DB_Buffer_Cache:盡量大。
4.在Oracle 10g中,如果我們定義了SGA_MAX_SIZE後,其實我們通過SGA_TARGET讓Oracle自動調整SGA的內存分配。
5.Redo log files,Data files,Achived log files盡量放在不同的磁盤上,以均衡I/O。特別是Redo Log files和Achived log files。
6.Undo Segment容量大小要符合實際應用,不能太小。
7.熱點文件特殊處理
(1)分開存放Index Segment和Data Segment。
(2)使用分區表。
8.索引(Index)問題
(1)適當使用BTREE,BITMAP以及反向索引:不同索引適用於不同的表,設置索引之前要考慮這個問題。
(2)一個表的索引數最多不要超過5個,否則可能影響性能。
(3)索引樹的高度<4,否則考慮重構索引。(單邊樹索引重構時可考慮使用反向索引降低索引樹高度)
(4)注意索引是否失效,這一般是比較爛的SQL語句引起的問題。
9.盡量減少“全表掃描操作” & “排序操作”
10.看執行計劃有助於各位DBA找出性能問題。
四.SQL語句優化
1.通過v$librarycache了解命中率,這和3.1中提到的Shared Pool有關系,避免重復解析SQL語句,有助於提高數據庫性能。
2.使用“物化視圖”提高查詢性能。
後記
本文列了一些Oracle性能優化要點,如果大家要進行Oracle基礎優化時,可參考以上要點。
如有錯漏,請各位指出。