Oracle性能調整是一個范圍比較廣且有點復雜的主題,普通DBA面對的最大的問題是從哪裡開始以及該做些什麼。你知道的所有信息可能是有人(一個用戶)報告了一個關於應用程序或查詢性能下降的問題,當你面對這樣的問題時該從何下手呢?
Oracle的調整方法
對那些已經取得了Oracle 8i性能調整認證考試的人而言,有一個試驗區域實驗Oracle的調整方法,當Oracle 9i發布時Oracle強調了這個方法有所改動,這個方法從8i到9i/10g發生一些變化,兩個方法都不完全一樣,它們都有各自的優勢和缺點,在Oracle 8i中,由下面的步驟組成:
1、調整業務規則
2、調整數據設計
3、調整應用程序設計
4、調整數據庫邏輯結構
5、調整數據庫操作
6、調整訪問路徑
7、調整內存分配
8、調整I/O和物理結構
9、調整資源連接
10、調整基礎平台
Oracle 9i的基本原則性方法,原則即優先級順序:
優先級描述
第一 清楚地定義問題,然後指定一個調整目標
第二 檢查主機系統和搜集Oracle統計信息
第三 將識別的問題與Oracle 9i提供的通用數據庫性能方法(版本1)/數據庫性能計劃(版本2)進行對比
第四 使用第二步搜集的統計信息獲得一個在系統上可能發生了什麼的大概設想
第五 標識所做的改動,然後實施那些改動
第六 確定是否符合第一步中確定的目標,如何符合就停止調整,如果還不符合就重復第五和第六步直到符
合調整目標
Oracle 10g R2性能調整指導認同所有Oracle性能改善方法的處理過程,步驟已經擴展了,但是總體來說還是保留了一些相同的地方。
1、執行下面的初始化標准檢查:
a.從用戶那裡獲取真實的反饋,確定性能設計范圍和性能目標,以及將來的性能目標,這個過程對未來容量的規劃很關鍵。
b.在性能好和差的時候,都要獲取全套操作系統,數據庫和從系統獲取應用程序統計信息,如果這些不可用,就獲取任何有用的信息,丟失統計信息與丟失犯罪證據類似:使得偵探工作更困難並且更浪費時間。
c.對所有涉及用戶性能的機器進行操作系統健全檢查,通過對操作系統的健全檢查,你可以查看被完全利用的硬件和操作系統資源,列出所有過度使用的資源作為後面分析的症狀,此外,檢查所有硬件錯誤或進行診斷。
2、檢查前十個Oracle常見錯誤,並確定這些是否可能成為真正的問題,把它們列出來作為後面分析的症狀,因為它們代表了大多數可能的問題,ADDM自動檢查並報告前十個問題中的九個。查看第6章“自動性能診斷”【http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14211/diagnsis.htm#g41683】和“Oracle系統中發現的前十個錯誤”【http://download-west.Oracle.com/docs/cd/B19306_01/server.102/b14211/technique.htm#i11221】
3、建立一個在系統上發生了什麼的概念模型,使用症狀作為提示理解是什麼導致了性能問題,查看“一個性能概念模型的簡單決策過程”【http://download-west.Oracle.com/docs/cd/B19306_01/server.102/b14211/technique.htm#i11199】
4、計劃一系列補救動作和預先考慮系統的工作情況,然後按順序應用將使應用程序最大受益,ADDM產生的每個建議都包括了預期的受益分析,不幸的是,系統停機時可能會阻止這樣一個嚴格的調查方法,如果同時應用了多個修改,那麼要嘗試確保它們是被隔離的,以便可以獨立證明每個修改的影響。
5、確認所做的修改是否達到了預期的作用,並了解用戶對性能的感受是否有所改善,另外,尋找更多的瓶頸,繼續改進概念模型直到你對應用程序的理解更准確。
6、重復後面的三步直到達到性能目標或由於其他約束而變得不可能。
變化是問題的一部分
從一個自頂向下的構造方法到一個以原則為基礎的“使它停止傷害”的方法是問題的一部分,搜集統計數據顯得很重要因為你如何知道你已經對問題做了改進(或使問題更糟)?對其他方法,你仍然要保留兩個最初的問題:我要尋找什麼以及我如何使它變得更好?如果結構化方法使你頭疼,那原則性方法只會添加混亂。
能夠幫助初學者(不承諾:我遠遠還不夠專家的資格)評估(配置、終端和調整)的調整項目清單:
·調整緩沖區高速緩存(Buffer Cache)
·調整重做日志緩沖區(Redo Log Buffer)
·調整共享池內存(Shared Pool Memory)
·優化數據存儲器
·優化表空間
·調整Undo段
·檢測鎖爭用
·SQL調整
這些調整措施使得Oracle RDBMS和實例從上到下都更漂亮了,本文剩下的部分將集中在SQL調整或更精密地預防慢速SQL被執行,這些不是同一件事嗎?大概是吧,但是在開發方面一個通用的方法是編寫執行得夠好夠塊的語句,每條語句不用是最佳的,但是某些思想必須體現在代碼中,你沒有時間優化成百甚至上千的SQL語句,但同時你可以遵循一些指導方針,以避免常見的錯誤和不良的編碼習慣。
有效避免問題查詢的17條提示
這17條提示來源於Hassan Afyouni編寫的“Oracle9i性能調整:優化數據庫生產率”,這些提示為兩個結果打下了堅固的基礎:使SQL語句執行效率更佳和確定在這一點上無事可做(如:你已經為SQL語句做了你力所能及的努力,該繼續另一個調整項目了)。
這17條提示就是:
1、避免笛卡爾結果
2、避免在大表上全表掃描
3、使用SQL標准和規范減少解析
4、缺少包含在where子句中列的索引
5、避免連接太多的表
6、監視V$session_longops檢測長時間運行的操作
7、使用適當的提示
8、使用shared_cursor參數
9、使用基於規則的優化器(如果它比基於成本的優化器要更好的話)
10、避免不必要的排序
11、監視索引變暗(定期刪除,必要時重建)
12、小心使用混合索引(不要重復列)
13、監視查詢統計情況
14、為表和索引使用不同的表空間(作為一個通用規則,這雖然有點守舊,但主要目的是為了減少I/O爭用)
15、在適當的時候使用分區表(和本地索引)(分區是一個額外的成本特性)
16、在where子句中使用直接量(使用綁定變量)
17、保存統計數據時常更新
這是一個相當全面、徹底、准確的列表,步驟9參考了基於規則的優化器的使用,可能引起一個Oracle已經認定作為一個將來的項目特性的依賴或相關性被反對,最後你不得不使用CBO來解決這個問題,因此現在你可能還要開始忘掉CBO,步驟14應該按照減少I/O爭用的目標做一些改動而不只停留在它當前描述的為表和索引分配單獨的表空間。
小結
本系列的下一篇文章,我們將查看一些這些提示中包含的步驟,例如:在許多網站上給出的關於如何改善SQL語句性能的建議通常都包括“使用綁定變量”,我相信許多人都有這樣一個問題:“我如何正確地做好這件事?”實際上它相當簡單,因為有很多有關如何使用這些提示的詳細信息。