(中國軟體網訊)分析評價Oracle資料庫性能主要有資料庫吞吐量、資料庫用戶響應時間兩項指標。資料庫用戶響應時間又可以分為系統服務時間和用戶等待時間兩項,即:資料庫用戶響應時間=系統服務時間+用戶等待時間。
因此,獲得滿意的用戶響應時間有兩個途徑:一是減少系統服務時間,即提高資料庫的吞吐量;二是減少用戶等待時間,即減少用戶訪問同一資料庫資源的衝突率。
資料庫性能優化包括如下幾個部分:
1.調整數據結構的設計 這一部分在開發信息系統之前完成,程式設計師需要考慮是否使用Oracle資料庫的分區功能,對於經常訪問的資料庫表是否需要建立索引等。
2.調整應用程式結構設計 這一部分也是在開發信息系統之前完成的。程式設計師在這一步需要考慮應用程式使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程式體系結構要求的資料庫資源
3.調整資料庫SQL語句 應用程式的執行最終將歸結為資料庫中的SQL語句執行,因此SQL語句的執行效率最終決定了Oracle資料庫的性能。Oracle公司推薦使用Oracle語句優化器(Oracle Optimizer)和行鎖管理器(Row-Level Manager)來調整優化SQL語句。
4.調整伺服器內存分配 內存分配是在信息系統運行過程中優化配置的。資料庫管理員根據資料庫的運行狀況不僅可以調整資料庫系統全局區(SGA區)的數據緩衝區、日誌緩衝區和共享池的大小,而且還可以調整程序全局區(PGA區)的大小。
5.調整硬碟I/O這一步是在信息系統開發之前完成的。資料庫管理員可以將組成同一個表空間的數據文件放在不同的硬碟上,做到硬碟之間I/O負載均衡。
6.調整作業系統參數 例如:運行在Unix作業系統上的Oracle資料庫,可以調整Unix數據緩衝區的大小、每個進程所能使用的內存大小等參數。
下面為一些參數調優參考:
一、db_file_multiblock_read_count:
oracle讀取數據有兩種方式:
1)通過rowid(即索引掃描)
2)通過全表掃描
如果是全表掃描時,oracle會一次讀取多個blocks,每次讀取的塊數將受初始化參數db_file_multiblock_read_count和作業系統的I/o緩衝區大小的限制。
設置DB_FILE_MULTIBLOCK_READ_COUNT以充分利用作業系統I/O緩衝區的大小。應考慮DB_FILE_MULTIBLOCK_READ_COUNT <=作業系統I/O緩衝區/ Oracle Block的大小,如果DB_FILE_MULTIBLOCK_READ_COUNT設置的太大,會使優化器認為全表掃描更有效而改變執行計劃,然後實際情況並非如此。
二、pga_aggregate_target:
Oracle9i中,PGA_AGGREGATE_TARGET參數僅對專用伺服器模式下(Dedicated Server)的專屬連接有效,對共享伺服器(Shared Server)連接無效;10g後對專用伺服器和共享伺服器都起作用,設置pga_aggregate_target,需要考慮最大並發連接後所需要的pga內存。
三、sga_max_size:
sga在32位的資料庫中最大不超過1.7G,而64位的資料庫則可以無限大,只要伺服器的物理內存足夠大。
設置sga大小需要考慮幾個問題:
1)物理內存多大
2)作業系統估計需要使用多少內存
3)資料庫是使用文件系統還是裸設備
4)有多少並發連接
5)應用是OLTP類型還是OLAP類型
有一個經驗公式:
OS使用內存+SGA+並發執行進程數*(sort_area_size+hash_ara_size+2M) < 0.7*總內存
四、log_buffer
對於日誌緩衝區的大小設置,通常我覺得沒有過多的建議,因為參考LGWR寫的觸發條件之後,我們會發現通常超過3M意義不是很大。作為一個正式系統,可能考慮先設置log_buffer=1~3M大小,然後針對具體情況再調整。
五、large_pool_size
對於大緩衝池的設置,假如不使用MTS,建議在20~30M足夠了。這部分主要用來保存並行查詢時候的一些信息,還有就是RMAN的備份的時候可能會使用到。如果設置了MTS,則由於UGA部分要移入這裡,則需要具體根據session最大數量和sort_ares_size等相關會話內存參數的設置來綜合考慮這部分大小的設置,一般可以考慮為session * (sort_area_size +2M)。這裡要提醒一點,不是必須使用MTS,我們都不主張使用MTS,尤其同時在線用戶數小於500的情況下。
六、java_pool_size:
假如資料庫沒有使用JAVA,我們通常認為保留10~20M大小足夠了。事實上可以更少,甚至最少只需要32k,但具體跟安裝資料庫的時候的組件相關(比如http server)。
七、shared_pool_size:
這是迄今為止最具有爭議的一部分內存設置。按照很多文檔的描述,這部分內容應該幾乎和數據緩衝區差不多大小。但實際上情況卻不是這樣的。首先我們要考究一個問題,那就是這部分內存的作用,它是為了緩存已經被解析過的SQL,而使其能被重用,不再解析。這樣做的原因是因為,對於一個新的SQL(shared_pool裡面不存在已經解析的可用的相同的SQL),資料庫將執行硬解析,這是一個很消耗資源的過程。而若已經存在,則進行的僅僅是軟分析(在共享池中尋找相同SQL),這樣消耗的資源大大減少。所以我們期望能多共享一些SQL,並且如果該參數設置不夠大,經常會出現ora-04031錯誤,表示為了解析新的SQL,沒有可用的足夠大的連續空閒空間,這樣自然我們期望該參數能大一些。但是該參數的增大,卻也有負面的影響,因為需要維護共享的結構,內存的增大也會使得SQL的老化的代價更高,帶來大量的管理的開銷,所有這些可能會導致CPU的嚴重問題。
在一個充分使用綁定變量的比較大的系統中,shared_pool_size的開銷通常應該維持在300M以內。除非系統使用了大量的存儲過程、函數、包,比如oracle erp這樣的應用,可能會達到500M甚至更高。於是我們假定一個1G內存的系統,可能考慮設置該參數為100M,2G的系統考慮設置為150M,8G的系統可以考慮設置為200~300M。對於一個沒有充分使用或者沒有使用綁定變量系統,這可能給我們帶來一個嚴重的問題。所謂沒有使用bind var的SQL,我們稱為Literal SQL。
八、Data buffer:
現在我們來談數據緩衝區,在確定了SGA的大小並分配完了前面部分的內存後,其餘的,都分配給這部分內存。通常,在允許的情況下,我們都嘗試使得這部分內存更大。這部分內存的作用主要是緩存DB BLOCK,減少甚至避免從磁碟上獲取數據,在8i中通常由db_block_buffers*db_block_size來決定大小的。如果我們設置了buffer_pool_keep和buffer_pool_recycle,則應該加上後面這兩部分內存的大小。
九、db_writer_processes:
在oracle中一個重要的後臺進程DBWO,這個進程負責將髒緩存塊寫回到數據文件中去,稱為資料庫書寫器進程(Database Writer Process),DB_WRITER_PROCESSES=MAX(1,TRUNC(CPU數/8))。也就是說,cpu數小於8時,DB_WRITER_PROCESSES為1,即只有一個寫進程DBWO。這對於一般的系統來說也是足夠用。當你的系統的修改數據的任務很重,並且已經影響到性能時,可以調整這個參數,這個參數不要超過cpu數,否則多出的進程也不會起作用,另外,它的最大值不能超過20。
十、parallel_min_server和parallel_max_server
parallel_min_server< cpu個數
parallel_max_server< 10*cpu個數,參數用於設置系統中允許的最大並行進程數
對於9i
如果PARALLEL_AUTOMATIC_TUNING=FALSE
PARALLEL_MAX_SERVERS=5
如果PARALLEL_AUTOMATIC_TUNING=TRUE
PARALLEL_MAX_SERVERS=CPU_COUNT x 10
9i中PARALLEL_AUTOMATIC_TUNING默認為FALSE,所以PARALLEL_MAX_SERVERS默認為5
對於10g
如果PGA_AGGREGATE_TARGET >0
PARALLEL_MAX_SERVERS=CPU_COUNT x PARALLEL_THREADS_PER_CPU x 10
如果PGA_AGGREGATE_TARGET=0
PARALLEL_MAX_SERVERS=CPU_COUNT x PARALLEL_THREADS_PER_CPU x 5
parallel_execution_message_size:信息的發送大小,改善並發時的等待時間,最大不超過64k。
說明:
利用oracle的alter system set ……scope=spfile參數修改後,必須重新啟動資料庫,修改設置才能生效。
從oracle9i開始,alter system命令增加了一個新的選項,scope,這個參數有3個可選值,分別是:
Memory:只改變當前運行的實例,重啟數據後失效。
Spfile:只改變當前運行的實例,重啟資料庫後失效。
Both:同時改變實例以及spfile文件,當前更改立即生效,重啟資料庫後仍然有效,這個選項相當於不帶參數的alter s ystem語句
設置oracle客戶端中文顯示:
nls_lang_z AMERICAN_AMERICA.ZHS16GBK
nls_lang AMERICAN_AMERICA.us7ascii