如何做資料庫最佳化

531968912發表於2016-12-30
Oracle能最佳化的地方很多。拋開其他因素,單從DBA的角度來說,個人覺得可以分為以下幾個方面進行最佳化,從各個層面進行最佳化,進而達到最佳效果。


作業系統核心引數最佳化
 以Linux平臺為例,下面的引數設定的大小,
 kernel.shmall =
 kernel.shmmax =
 kernel.shmmni =
 hugepage是否啟用
 Solaris中DISM的設定
 Hp-Ux非同步IO的設定
 AIX VMM(Virtual Memory Manager)的設定

資料庫架構上的最佳化
  A.透過安裝規範(Grid Infrastructure, Database, Dataguard),可以減少很多誤操作,方便管理歸檔、邏輯備份、物理備份等,進而提高工作效率,也可以減少故障率
  B.RAID級別的設定,RAID組的規劃,儲存Cache的設定,ASM磁碟組的磁碟的大小,LUN的劃分等
  C.表空間大小、表空間多少、LOB儲存
  D.表是否分割槽、是否採用壓縮、是否有合適的索引、合適的pctfree(減少行連線和行遷移,也可以減少cache buffers chains)、合適的storage減少表碎片
  E.邏輯備份的規劃
  F.物理備份的規劃
  G.作業系統、資料庫監控的規劃
一個好的、長期的規劃,可以保證資料庫執行平穩,方便管理,以及後續的升級、遷移都不是問題

資料庫層面最優
 A. 透過分析AWR,我們可以手動指定各個元件的大小
     Oracle推出了AMM,ASMM等SGA自動化管理,但是這些自動化當然也會帶來一定的弊端,比如內部資源協調等,這些都需要latch,也會帶來CPU的爭用
    db_cache_advice引數相關的latch
    simulator lru latch,simulator hash latch
 
    _library_cache_advice引數相關的latch
    shared pool simulator    
    透過設定_library_cache_advice為false,可以關閉shared pool的建議。使用statistics_level=basic也可以關閉,
    但是不建議調節statistics_level,這也會關閉其他資訊的收集
 B. 一些新功能是否啟用等
 C. Cursor相關引數
 D. Optimizer相關引數
 E. IO相關引數
客戶端層面最佳化
  A.客戶端可能使用的有.NET,Java開發的程式比較多,可以啟用連線池,還可以啟用statement cache並設定大小,提高軟解析的次數
  B.根據情況,還可以適當調整SDU,SEND_BUF_SIZE,RECV_BUF_SIZE
最後一步sql最佳化
  SQL最佳化是重中之重,也是最難的一部分,尤其是SQL語句的改寫,涉及到業務邏輯。常見的方法
  A.使用合適的統計資訊收集的方式
  B.設定表、索引或列的資訊
  C.使用profile
  D.透過Hint
  E.使用DBMS_SQLDIAG
  F.使用DBMS_SPM
  G.建立合理的索引
  H.調整業務邏輯,減少執行頻率
  I.使用臨時表或檢視
  J.改寫SQL

常用的工具

AWR, ASH, ADDM and Sql Tuning Advisor,SQL Access Advisor,SQLT,SQLHC,ASHV,EM,Grid Control,Cloud Control


摘自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2131683/,如需轉載,請註明出處,否則將追究法律責任。

相關文章