Oracle數據庫性能優化

此文章主要介紹的是通過優化數據庫來大幅度的提高Oracle數據庫性能,以下幾個簡單的相關步驟就可以簡單實現Oracle數據庫性能,下面就是文章的具體內容的描述,望你瀏覽之後會對其有所瞭解。

數據庫優化的討論可以說是一個永恆的主題。資深的Oracle優化人員通常會要求提出Oracle數據庫性能問題的人對數據庫做一個statspack,貼出數據庫配置等等。還有的人認爲要抓出執行最慢的語句來進行優化。

但實際情況是,提出疑問的人很可能根本不懂執行計劃,更不要說statspack了。而我認爲,數據庫優化,應該首先從大的方面考慮:網絡、服務器硬件配置、操作系統配置、Oracle服務器配置、數據結構組織、然後纔是具體的調整。

實際上網絡、硬件等往往無法決定更換,應用程序一般也無法修改,因此應該着重從數據庫配置、數據結構上來下手,首先讓數據庫有一個良好的配置,然後再考慮 具體優化某些過慢的語句。我在給我的用戶系統進行優化的過程中,總結了一些基本的,簡單易行的辦法來優化數據庫,算是我的三板斧,呵呵。

不過請注意,這些不一定普遍使用,甚至有的會有副作用,但是對OLTP系統、基於成本的數據庫往往行之有效,不妨試試。(注:附件是Burleson寫的用來報告Oracle數據庫性能等信息的腳本,本文用到)

一.設置合適的SGA

常常有人抱怨服務器硬件很好,但是Oracle就是很慢。很可能是內存分配不合理造成的。(1)假設內存有512M,這通常是小型應用。建議Oracle 的SGA大約240M,其中:共享池(SHARED_POOL_SIZE)可以設置60M到80M,根據實際的用戶數、查詢等來定。

數據塊緩衝區可以大致分配120M-150M,8i下需要設置DB_BLOCK_BUFFERS,DB_BLOCK_BUFFER*DB_BLOCK_SIZE等於數據塊緩衝區大小。9i 下的數據緩衝區可以用db_cache_size來直接分配。

(2)假設內存有1G,Oracle 的SGA可以考慮分配500M:共享池分配100M到150M,數據緩衝區分配300M到400M。

(3)內存2G,SGA可以考慮分配1.2G,共享池300M到500M,剩下的給數據塊緩衝區。

(4)內存2G以上:共享池300M到500M就足夠啦,再多也沒有太大幫助;(Biti_rainy有專述)數據緩衝區是儘可能的大,但是一定要注意兩 個問題:一是要給操作系統和其他應用留夠內存,二是對於32位的操作系統,Oracle的SGA有1.75G的限制。有的32位操作系統上可以突破這個限 制,方法還請看Biti的大作吧。

二.分析表和索引,更改優化模式

Oracle數據庫性能默認優化模式是CHOOSE,在這種情況下,如果表沒有經過分析,經常導致查詢使用全表掃描,而不使用索引。這通常導致磁盤I/O太多,而導致查詢很慢。如果沒有使用執行計劃穩定性,則應該把表和索引都分析一下,這樣可能直接會使查詢速度大幅提升。

分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令。對於少於100萬的表,可以考慮分析整個表,對於很大的表,可以按百分比來分析,但是百分比不能過低,否則生成的統計信息可能不準確。可 以通過DBA_TABLES的LAST_ANALYZED列來查看錶是否經過分析或分析時間,索引可以通過DBA_INDEXES的 LAST_ANALYZED列。

下面通過例子來說明分析前後的速度對比。(表CASE_GA_AJZLZ大約有35萬數據,有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能。(第一次要執行\\RDBMS\\ADMIN\\utlxplan.sql來創建PLAN_TABLE這個表)

  1. SQL> SET AUTOTRACE ON    
  2. SQL>SET TIMING ON    
  3. 通過SET AUTOTRACE ON 來查看語句的執行計劃,通過SET TIMING ON 來查看語句運行時間。  
  4.   
  5. SQL> select count(*) from CASE_GA_AJZLZ;    
  6. COUNT(*)    
  7. 346639   
  8. 已用時間: 00: 00: 21.38  
  9.   
  10. Execution Plan    
  11. select STATEMENT Optimizer=CHOOSE   
  12. 1 0 SORT (AGGREGATE)    
  13. 2 1 TABLE ACCESS (FULLOF 'CASE_GA_AJZLZ'    
  14. ……………………    
  15. 請注意上面分析中的TABLE ACCESS(FULL),這說明該語句執行了全表掃描。而且查詢使用了21.38秒。這時表還沒有經過分析。下面我們來對該表進行分析:  
  16.   
  17. SQL> analyze table CASE_GA_AJZLZ compute statistics;    
  18. 表已分析。已用時間: 00: 05: 357.63。然後再來查詢:  
  19.   
  20. SQL> select count(*) from CASE_GA_AJZLZ;    
  21. COUNT(*)    
  22. 346639   
  23. 已用時間: 00: 00: 00.71  
  24.    
  25.   
  26. Execution Plan    
  27. select STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)    
  28. 1 0 SORT (AGGREGATE)    
  29. 2 1 INDEX (FAST FULL SCAN) OF 'PK_AJZLZ' (UNIQUE) (Cost=351   
  30. Card=346351)    
  31. …………………………     



請注意,這次時間僅僅用了0.71秒!這要歸功於INDEX(FAST FULL SCAN)。通過分析表,查詢使用了PK_AJZLZ索引,磁盤I/O大幅減少,速度也大幅提升!下面的實用語句可以 ,上述的相關內容就是對大幅度提高Oracle數據庫性能的描述,希望會給你帶來一些幫助在此方面。

本文轉載於 http://www.itjianghu.net/120128/40936585844907443.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章