想提高Oracle性能,如何優(yōu)化數(shù)據(jù)庫?
我們今天主要向大家介紹的是如何優(yōu)化數(shù)據(jù)庫來大提高Oracle性能,以下我們就介紹幾個比較簡單的步驟來大幅的提高Oracle性能,沃爾瑪你很形象將其比喻成優(yōu)化數(shù)據(jù)庫的三板斧,數(shù)據(jù)庫優(yōu)化的討論可以說是一個永恒的主題。
資深的Oracle優(yōu)化人員通常會要求提出Oracle性能問題的人對數(shù)據(jù)庫做一個statspack,貼出數(shù)據(jù)庫配置等等。還有的人認為要抓出執(zhí)行最慢的語句來進行優(yōu)化。
但實際情況是,提出疑問的人很可能根本不懂執(zhí)行計劃,更不要說statspack了。而我認為,數(shù)據(jù)庫優(yōu)化,應該首先從大的方面考慮:網(wǎng)絡、服務器硬件配置、操作系統(tǒng)配置、Oracle服務器配置、數(shù)據(jù)結(jié)構(gòu)組織、然后才是具體的調(diào)整。
實際上網(wǎng)絡、硬件等往往無法決定更換,應用程序一般也無法修改,因此應該著重從數(shù)據(jù)庫配置、數(shù)據(jù)結(jié)構(gòu)上來下手,首先讓數(shù)據(jù)庫有一個良好的配置,然后再考慮具體優(yōu)化某些過慢的語句。我在給我的用戶系統(tǒng)進行優(yōu)化的過程中,總結(jié)了一些基本的,簡單易行的辦法來優(yōu)化數(shù)據(jù)庫,算是我的三板斧。
不過請注意,這些不一定普遍使用,甚至有的會有副作用,但是對OLTP系統(tǒng)、基于成本的數(shù)據(jù)庫往往行之有效,不妨試試。(注:附件是Burleson寫的用來報告數(shù)據(jù)庫Oracle性能等信息的腳本,本文用到)
一.設置合適的SGA
常常有人抱怨服務器硬件很好,但是Oracle就是很慢。很可能是內(nèi)存分配不合理造成的。(1)假設內(nèi)存有512M,這通常是小型應用。建議Oracle性能的SGA大約240M,其中:共享池(SHARED_POOL_SIZE)可以設置60M到80M,根據(jù)實際的用戶數(shù)、查詢等來定。數(shù)據(jù)塊緩沖區(qū)可以大致分配120M-150M,8i下需要設置DB_BLOCK_BUFFERS,DB_BLOCK_BUFFER*DB_BLOCK_SIZE等于數(shù)據(jù)塊緩沖區(qū)大小。
9i 下的數(shù)據(jù)緩沖區(qū)可以用db_cache_size來直接分配。
(2)假設內(nèi)存有1G,Oracle 的SGA可以考慮分配500M:共享池分配100M到150M,數(shù)據(jù)緩沖區(qū)分配300M到400M。
(3)內(nèi)存2G,SGA可以考慮分配1.2G,共享池300M到500M,剩下的給數(shù)據(jù)塊緩沖區(qū)。
(4)內(nèi)存2G以上:共享池300M到500M就足夠啦,再多也沒有太大幫助;(Biti_rainy有專述)數(shù)據(jù)緩沖區(qū)是盡可能的大,但是一定要注意兩個問題:一是要給操作系統(tǒng)和其他應用留夠內(nèi)存,二是對于32位的操作系統(tǒng),Oracle的SGA有1.75G的限制。有的32位操作系統(tǒng)上可以突破這個限制,方法還請看Biti的大作吧。
二.分析表和索引,更改優(yōu)化模式
Oracle性能默認優(yōu)化模式是CHOOSE,在這種情況下,如果表沒有經(jīng)過分析,經(jīng)常導致查詢使用全表掃描,而不使用索引。這通常導致磁盤I/O太多,而導致查詢很慢。如果沒有使用執(zhí)行計劃穩(wěn)定性,則應該把表和索引都分析一下,這樣可能直接會使查詢速度大幅提升。
分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令。對于少于100萬的表,可以考慮分析整個表,對于很大的表,可以按百分比來分析,但是百分比不能過低,否則生成的統(tǒng)計信息可能不準確。可以通過DBA_TABLES的LAST_ANALYZED列來查看表是否經(jīng)過分析或分析時間,索引可以通過DBA_INDEXES的LAST_ANALYZED列。
下面通過例子來說明分析前后的速度對比。(表CASE_GA_AJZLZ大約有35萬數(shù)據(jù),有主鍵)首先在SQLPLUS中打開自動查詢執(zhí)行計劃功能。(***次要執(zhí)行\(zhòng)RDBMS\ADMIN\utlxplan.sql來創(chuàng)建PLAN_TABLE這個表
- SQL> SET AUTOTRACE ON
- SQL>SET TIMING ON
通過SET AUTOTRACE ON 來查看語句的執(zhí)行計劃,通過SET TIMING ON 來查看語句運行時間
- SQL> select count(*) from CASE_GA_AJZLZ;
- COUNT(*)
- ----------
- 346639
已用時間: 00: 00: 21.38
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'CASE_GA_AJZLZ'
……………………
請注意上面分析中的TABLE ACCESS(FULL),這說明該語句執(zhí)行了全表掃描。而且查詢使用了21.38秒。這時表還沒有經(jīng)過分析。下面我們來對該表進行分析
- SQL> analyze table CASE_GA_AJZLZ compute statistics;
表已分析。已用時間: 00: 05: 357.63。然后再來查詢:
- SQL> select count(*) from CASE_GA_AJZLZ;
- COUNT(*)
- ----------
- 346639
- Execution Plan
- 0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)
- 1 0 SORT (AGGREGATE)
- 2 1 INDEX (FAST FULL SCAN) OF 'PK_AJZLZ' (UNIQUE) (Cost=351
- Card=346351)
- …………………………
請注意,這次時間僅僅用了0.71秒!這要歸功于INDEX(FAST FULL SCAN)。通過分析表,查詢使用了PK_AJZLZ索引,磁盤I/O大幅減少,速度也大幅提升!下面的實用語句可以
【編輯推薦】