【摘要】Oracle數(shù)據(jù)庫(kù)是當(dāng)前應(yīng)用最廣泛的大型數(shù)據(jù)庫(kù),隨著數(shù)據(jù)庫(kù)數(shù)據(jù)量的增大、并發(fā)用戶數(shù)量增多,系統(tǒng)常常出現(xiàn)吞吐量降低,響應(yīng)時(shí)間變長(zhǎng)的性能問(wèn)題,如何有效優(yōu)化、調(diào)整數(shù)據(jù)庫(kù)性能,避免系統(tǒng)瓶頸,是保證Oracle數(shù)據(jù)庫(kù)高效運(yùn)行的基礎(chǔ)。Oracle數(shù)據(jù)庫(kù)系統(tǒng)性能優(yōu)化、調(diào)整是一項(xiàng)復(fù)雜的系統(tǒng)工程,貫穿于系統(tǒng)的整個(gè)生存周期中。
【關(guān)鍵詞】性能調(diào)整與優(yōu)化內(nèi)存優(yōu)化磁盤I/O應(yīng)用程序
一、數(shù)據(jù)庫(kù)系統(tǒng)性能評(píng)價(jià)指標(biāo)
影響數(shù)據(jù)庫(kù)性能的要素有很多,具體表現(xiàn)為應(yīng)用程序、系統(tǒng)資源、并發(fā)數(shù)量等方面。一般情況下,主要通過(guò)以下性能指標(biāo)來(lái)評(píng)價(jià)數(shù)據(jù)庫(kù)系統(tǒng)的性能:系統(tǒng)響應(yīng)時(shí)間、系統(tǒng)吞吐量、數(shù)據(jù)庫(kù)的命中率以及內(nèi)存和I/O的使用情況。
1.1 系統(tǒng)吞吐量
系統(tǒng)吞吐量是指單位時(shí)間內(nèi)系統(tǒng)能處理的事物數(shù)量,對(duì)于數(shù)據(jù)庫(kù)系統(tǒng),也就是單位時(shí)間內(nèi)處理的SQL語(yǔ)句數(shù)量。因此,數(shù)據(jù)庫(kù)系統(tǒng)的吞吐量(tps)=SQL語(yǔ)句執(zhí)行的數(shù)量/時(shí)間。提高系統(tǒng)的吞吐量可以通過(guò)提高單個(gè)時(shí)間內(nèi)系統(tǒng)執(zhí)行事物的數(shù)量和提高單個(gè)事物的執(zhí)行效率。
1.2 響應(yīng)時(shí)間
響應(yīng)時(shí)間是指用戶在提交業(yè)務(wù)操作后到數(shù)據(jù)庫(kù)反饋信息給用戶所花費(fèi)的總體時(shí)間。提高響應(yīng)時(shí)間的途徑有減少系統(tǒng)的服務(wù)時(shí)間和用戶等待時(shí)間,兩種途徑是矛盾的統(tǒng)一體,減少系統(tǒng)的響應(yīng)時(shí)間也就是提高系統(tǒng)的吞吐量,減少用戶等待時(shí)間就是要提高系統(tǒng)的并發(fā)量,在實(shí)際應(yīng)用中,要依據(jù)具體的應(yīng)用情況來(lái)確定優(yōu)化響應(yīng)時(shí)間的主要方面。
1.3 數(shù)據(jù)庫(kù)命中率
數(shù)據(jù)庫(kù)命中率是數(shù)據(jù)庫(kù)性能的重要評(píng)價(jià)指標(biāo),主要包括數(shù)據(jù)庫(kù)緩沖區(qū)命中率和共享池命中率。緩沖區(qū)命中率決定了用戶需求的數(shù)據(jù)是否能在內(nèi)存中得到滿足,該比率等于高速緩存命中總數(shù)除以對(duì)高速緩存的查找總數(shù);共享池命中率決定了用戶提交的SQL語(yǔ)句是否需要進(jìn)行重新解析,該比率等于SQL語(yǔ)句的解析次數(shù)除以SQL語(yǔ)句總的執(zhí)行次數(shù)。通常情況,數(shù)據(jù)庫(kù)的命中率應(yīng)該在90%左右,低于這個(gè)值的系統(tǒng)均需要做出優(yōu)化和調(diào)整。
1.4 內(nèi)存使用效率
內(nèi)存使用效率主要體現(xiàn)在可共享內(nèi)存、永久性內(nèi)存和運(yùn)行時(shí)內(nèi)存這三者的分配使用上。內(nèi)存使用調(diào)整目標(biāo)主要有兩種,其一是集中精力解決可能產(chǎn)生最大利益的問(wèn)題,使利益最大化;其二是盡可能的減少系統(tǒng)的延遲和等待事物。
1.5 磁盤I/O
I/O是數(shù)據(jù)庫(kù)處理和產(chǎn)生數(shù)據(jù)必可少的步驟;I/O分為邏輯讀、邏輯寫、物理讀和物理寫,其中邏輯操作主要對(duì)象是內(nèi)存,物理操作的主要對(duì)象是磁盤,通過(guò)減少系統(tǒng)不必要的I/O次數(shù)可以提高系統(tǒng)的吞吐量,縮短系統(tǒng)響應(yīng)時(shí)間。其中磁盤I/O是影響數(shù)據(jù)庫(kù)性能最重要的方面,盡可能的減少磁盤I/O的次數(shù)是提高數(shù)據(jù)庫(kù)性能的主要手段。
二、數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)
2.1 內(nèi)存優(yōu)化
Oracle的信息存儲(chǔ)在內(nèi)存和磁盤上,由于訪問(wèn)內(nèi)存比訪問(wèn)磁盤快得多,因此若能把盡可能多的數(shù)據(jù)存放在內(nèi)存中,就可以達(dá)到加快執(zhí)行速度、縮短響應(yīng)時(shí)間、減少磁盤I/O等目的。Oracle數(shù)據(jù)庫(kù)內(nèi)存優(yōu)化主要通過(guò)調(diào)整SGA內(nèi)存結(jié)構(gòu)的大小來(lái)提高系統(tǒng)性能,其中共享池和緩沖區(qū)高速緩存是SGA兩個(gè)最重要的優(yōu)化區(qū)域。
(1)優(yōu)化共享池
共享池由庫(kù)緩沖區(qū)和數(shù)據(jù)字典緩沖區(qū)組成,其庫(kù)緩沖區(qū)存放已經(jīng)解釋并執(zhí)行過(guò)的SQL語(yǔ)句和PL/SQL程序代碼及其分析、執(zhí)行計(jì)劃等信息;數(shù)據(jù)字典緩沖區(qū)主要存放數(shù)據(jù)庫(kù)對(duì)象信息以及用戶權(quán)限等信息。通過(guò)合理設(shè)置共享池的大小來(lái)確保大多數(shù)語(yǔ)句能夠在共享池中查找到它們自己的一個(gè)已分析版本,就可以提高語(yǔ)句分析和執(zhí)行的效率,降低資源消耗。數(shù)據(jù)庫(kù)管理員通過(guò)庫(kù)緩存命中率以及數(shù)據(jù)字典緩存命中率來(lái)檢查共享池設(shè)置是否合適。
庫(kù)緩存命中率檢查方法為:
Select(sum(pins-reloads))/sum(pins))“Lib Cache”from v$1ibrarycache;
數(shù)據(jù)字典緩存命中率檢查方法為:
Select sum (gets)”Gets”,sum (getmisses)“Misses”,sum(gets)/ (sum (gets)+sum (getmisses))“Hit Ratio”from v $rowcache;
通常情況下,庫(kù)緩存命中率應(yīng)該高于99%,而數(shù)據(jù)字典緩存命中率應(yīng)該高于90%,否者需要調(diào)整SHARED-POOL-SIZE增加共享池大小。
(2)優(yōu)化緩沖區(qū)高速緩存
數(shù)據(jù)高速緩存(Data Buffer Cache)是用于緩存數(shù)據(jù)庫(kù)數(shù)據(jù)的內(nèi)存區(qū)域。從內(nèi)存讀數(shù)據(jù)和從磁盤讀數(shù)據(jù),在訪問(wèn)速度上是指數(shù)級(jí)的差別,緩沖區(qū)高速緩存越大,Oracle從內(nèi)存讀的數(shù)據(jù)就越多,磁盤的I/O就越少,系統(tǒng)性能就越好。數(shù)據(jù)庫(kù)管理員通過(guò)下述語(yǔ)句來(lái)查看數(shù)據(jù)庫(kù)數(shù)據(jù)緩沖區(qū)的使用情況:
P=1-(physical reads/(db block gets+consistent gets))。
SELECT name,value FROM v$sysstat
WHERE name IN (‘db block gets’,‘consistent gets’,‘physical reads’):
這個(gè)命中率應(yīng)該在90%以上,否則需要通過(guò)調(diào)整DB CACHE SIZE來(lái)增加Data Buffer Cache大小。
(3)調(diào)整重做日志緩沖區(qū)
重做日志緩沖區(qū)如果分配太小,會(huì)導(dǎo)致沒(méi)有足夠的空間來(lái)放重做日志而等待,LGWR進(jìn)程會(huì)頻繁將LOGBUFFER中的數(shù)據(jù)寫入磁盤增加I/O的次數(shù),影響系統(tǒng)性能。重做日志的任何瓶頸都可能導(dǎo)致系統(tǒng)中所有進(jìn)程的性能問(wèn)題,為了確保系統(tǒng)不會(huì)發(fā)生這類情況,應(yīng)該隨時(shí)監(jiān)控重做日志的競(jìng)爭(zhēng)情況。觀察重做日志緩沖區(qū)的工作情況的方法:
select name,Value from v$sysstat where name=’redo bufier allocation retrids’
“redo buffer allocation retrids”表示進(jìn)程申請(qǐng)寫入重做日志緩沖區(qū)失敗后的重試次數(shù),正常情況下應(yīng)該為0,否則應(yīng)該調(diào)整LOG BUFFER參數(shù)增加緩沖區(qū)的大小。
2.2 磁盤I/O優(yōu)化
對(duì)于數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),磁盤I/O操作是數(shù)據(jù)庫(kù)性能最重要的方面,為了避免與I/O相關(guān)的性能瓶頸,監(jiān)控磁盤I/O并保持其優(yōu)化非常重要。影響磁盤I/O性能的主要原因有磁盤競(jìng)爭(zhēng)、I/O次數(shù)過(guò)多和數(shù)據(jù)塊空間的分配管理等。具體的優(yōu)化I/O的方法包括以下幾方面。
(1)常使用的對(duì)象產(chǎn)生I/O爭(zhēng)用的機(jī)會(huì)較多,應(yīng)將訪問(wèn)量較大的數(shù)據(jù)文件放在獨(dú)立磁盤上,同一個(gè)表空間的多個(gè)數(shù)據(jù)文件應(yīng)盡可能地放在不同的磁盤上,為索引創(chuàng)建單獨(dú)的表空間,并將表和索引分開(kāi)在不同的表空間;(2)在內(nèi)存中修改過(guò)的數(shù)據(jù)先寫入重做日志文件中,重做日志文件要足夠大,要與數(shù)據(jù)文件存放在不同的磁盤上,減少對(duì)磁盤的競(jìng)爭(zhēng),重做日志文件分為幾個(gè)組,按順序循環(huán)寫入;(3)Oracle的文件和操作系統(tǒng)文件應(yīng)盡可能地放在不同的磁盤上,以減小I/O爭(zhēng)用的概率;(4)最好使用目前較流行的廉價(jià)磁盤冗余陣列(raid),它能自動(dòng)分離不同類型、訪問(wèn)頻率的數(shù)據(jù)庫(kù)文件,減小I/O進(jìn)程之間的競(jìng)爭(zhēng),優(yōu)化數(shù)據(jù)庫(kù)性能;(5)創(chuàng)建回滾段及其專用的表空間,以從系統(tǒng)操作的失敗中得到數(shù)據(jù)的恢復(fù),從而減小I/O進(jìn)程之間的競(jìng)爭(zhēng),防止空間競(jìng)爭(zhēng)影響事務(wù)的完成;(6)單獨(dú)創(chuàng)建用戶數(shù)據(jù)表空間,且要與系統(tǒng)表空間(system)分開(kāi)磁盤存放,創(chuàng)建臨時(shí)表空間用于排序操作,盡可能防止數(shù)據(jù)庫(kù)碎片存在于多個(gè)表空間中。
2.3 應(yīng)用程序優(yōu)化
系統(tǒng)中80%的性能問(wèn)題實(shí)際上與oracle數(shù)據(jù)庫(kù)的配置無(wú)關(guān),而是由于應(yīng)用程序中SQL語(yǔ)句的拙劣設(shè)計(jì)和糟糕實(shí)現(xiàn)引起。本節(jié)從與SQL執(zhí)行效率密切相關(guān)的幾個(gè)方面來(lái)介紹應(yīng)用程序優(yōu)化技術(shù),包括索引、SQL語(yǔ)句實(shí)現(xiàn)、使用存儲(chǔ)過(guò)程等。
1.創(chuàng)建適當(dāng)?shù)乃饕?/p>
建立“適當(dāng)”的索引是實(shí)現(xiàn)查詢優(yōu)化的首要前提。如果通過(guò)索引來(lái)訪問(wèn)數(shù)據(jù)庫(kù),可以大大減少對(duì)大型表的全表掃描,從而減少I/O的開(kāi)銷。當(dāng)使用索引時(shí),應(yīng)該注意以下原則:①不對(duì)小型表創(chuàng)建索引;②為經(jīng)常檢索大表中少于15%的行創(chuàng)建索引;③有很多空值并且查詢會(huì)涉及到空值的列不太適合索引;④不對(duì)大型字段創(chuàng)建索引;⑤索引不是越多越好,特別是大量從來(lái)或者幾乎不用的索引,對(duì)系統(tǒng)只有損害;⑥單列索引不如復(fù)合索引有效率;⑦為用于多表連接的字段加上索引,為經(jīng)常進(jìn)行連接的表使用簇;⑧將表和索引建立在不同的表空間內(nèi),不將應(yīng)用數(shù)據(jù)的對(duì)象存放到system表空間里,并確保數(shù)據(jù)表空間和索引表空間置于不同的物理磁盤。實(shí)際應(yīng)用中,索引的建立必須慎重,要注意索引導(dǎo)致的查詢語(yǔ)句性能的提高與更新數(shù)據(jù)時(shí)性能的降低之間的平衡。
2.SOL語(yǔ)句調(diào)優(yōu)
SQL語(yǔ)句優(yōu)化的實(shí)質(zhì)就是在結(jié)果正確的前提下,用優(yōu)化器可以識(shí)別的語(yǔ)句,充分利用索引來(lái)減少表掃描的I/O數(shù),盡量避免表搜索的發(fā)生。優(yōu)化的目的就是將性能低下的SQL語(yǔ)句轉(zhuǎn)換成目的相同的、性能優(yōu)異的SQL語(yǔ)句,使數(shù)據(jù)查找的路徑最簡(jiǎn)化,并盡量保持處理器時(shí)間和I/O的平衡。
SQL語(yǔ)句優(yōu)化原則:①采用綁定變量;②選擇聯(lián)合查詢的連接次序;③避免相關(guān)子查詢;④適當(dāng)使用臨時(shí)表來(lái)加速查詢;⑤消除對(duì)大數(shù)據(jù)表行數(shù)據(jù)的順序存??;⑥正確使用UNION和UNION ALL;⑦使用表的別名;⑧正確使用WHERE子句;⑨建立“適當(dāng)”的索引;⑩正確使用NULL、IN、EXIST、OR。
3.使用存儲(chǔ)過(guò)程
Oracle的存儲(chǔ)過(guò)程是SQL語(yǔ)句和可選控制流語(yǔ)句的預(yù)編譯集合,以一個(gè)名稱存儲(chǔ)作為一個(gè)單元處理,能完成一定功能并且存儲(chǔ)在Server端的PL/SQL的集合。相對(duì)于應(yīng)用程序的過(guò)程、函數(shù)而言,把SQL命令存儲(chǔ)在Server端。使用存儲(chǔ)過(guò)程,應(yīng)用程序不必再包含多個(gè)網(wǎng)絡(luò)操作的SQL語(yǔ)句去執(zhí)行數(shù)據(jù)庫(kù)服務(wù)器操作,而是簡(jiǎn)單調(diào)用存儲(chǔ)過(guò)程,在網(wǎng)絡(luò)上傳輸?shù)闹皇钦{(diào)用過(guò)程的名字和輸出結(jié)果,這樣就可減少大量的網(wǎng)絡(luò)I/O。
三、小結(jié)
Oracle 10g數(shù)據(jù)庫(kù)系統(tǒng)性能優(yōu)化與調(diào)整是一個(gè)復(fù)雜、繁瑣的系統(tǒng)工程,貫穿于數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)的整個(gè)過(guò)程。數(shù)據(jù)庫(kù)系統(tǒng)配置的調(diào)整,包括內(nèi)存結(jié)構(gòu)調(diào)整、磁盤I/O調(diào)整以及應(yīng)用程序優(yōu)化等,直接決定了整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的性能,應(yīng)該利用各種性能優(yōu)化手段進(jìn)行反復(fù)的調(diào)整、比較以消除瓶頸,獲得系統(tǒng)最優(yōu)性能。
參考文獻(xiàn)
[1]羅瑞明. Oracle數(shù)據(jù)庫(kù)的性能優(yōu)化方法研究.信息安全與技術(shù),2012(5).
[2]孫風(fēng)棟,閆海珍. Oracle 10g數(shù)據(jù)庫(kù)系統(tǒng)性能優(yōu)化與調(diào)整.計(jì)算機(jī)技術(shù)與發(fā)展,2009(2).
[3]李振宇. Oracle數(shù)據(jù)庫(kù)的優(yōu)化及方案.科技信息. 2010(13).