劉哲
(武漢紡織大學(xué),湖北 武漢430200)
大型關(guān)系數(shù)據(jù)庫Oracle已經(jīng)廣泛應(yīng)用于各行各業(yè),如政府、交通、公安、電信、金融、能源等部門,并已逐漸成為企業(yè)信息化建設(shè)的重要數(shù)據(jù)庫平臺(tái),但隨著Oracle數(shù)據(jù)庫規(guī)模的擴(kuò)大,數(shù)據(jù)庫用戶人數(shù)的增加,數(shù)據(jù)庫性能問題越來越突出。因此,有必要對Oracle數(shù)據(jù)庫性能進(jìn)行調(diào)整與優(yōu)化,使之在滿足需求條件下,系統(tǒng)性能達(dá)到最佳和系統(tǒng)開銷最小。
數(shù)據(jù)庫吞吐量指在單位時(shí)間內(nèi)數(shù)據(jù)庫所能完成的SQL語句事務(wù)數(shù)量,吞吐量=事務(wù)量/時(shí)間,通常用TPS(每秒鐘的事務(wù)量)來表示。對某些特定的系統(tǒng)而言,系統(tǒng)調(diào)整最終要的目的可能就是對系統(tǒng)吞吐量的調(diào)整。
響應(yīng)時(shí)間是指從用戶提交SQL語句到數(shù)據(jù)庫返回結(jié)果集的第一行數(shù)據(jù)所需要的時(shí)間,縮短響應(yīng)時(shí)間可以通過減小系統(tǒng)服務(wù)時(shí)間或用戶等待時(shí)間來實(shí)現(xiàn),通過使用ms來表示,通過縮短響應(yīng)時(shí)間,既能減少用戶請求的處理時(shí)間,又能提高系統(tǒng)資源利用率。
Oracle數(shù)據(jù)庫將數(shù)據(jù)儲(chǔ)存在磁盤和內(nèi)存中,想要往Oracle中寫入和讀取數(shù)據(jù)基本上都會(huì)涉及到I/O操作,通過對磁盤合理的進(jìn)行規(guī)劃,利用高速緩存技術(shù),可以提高系統(tǒng)吞吐量,縮短用戶響應(yīng)時(shí)間,盡可能有效地利用系統(tǒng)物理內(nèi)存而盡量避免或推遲使用磁盤I/O操作。
Oracle用戶進(jìn)程所需的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取的。用戶對數(shù)據(jù)的需求能否在內(nèi)存中得到滿足,給出快速的響應(yīng),可用緩沖區(qū)高速緩存命中率來衡量。
在大量并發(fā)用戶數(shù)下,若Oracle內(nèi)存尺寸不夠會(huì)降低程序的處理效率,延緩數(shù)據(jù)庫的響應(yīng)時(shí)間,內(nèi)存是否合理使用,一般可以從使投資得到最大回報(bào)和使?fàn)幱脺p到最小這兩個(gè)指標(biāo)來判斷,通過合理使用內(nèi)存,可以大大提高系統(tǒng)性能。
當(dāng)用戶提交的SQL語句含有聚合函數(shù)或者有排序時(shí),這些排序可能在內(nèi)存中進(jìn)行,也可能在物理磁盤上進(jìn)行。由于物理磁盤自身結(jié)構(gòu)的原因,其讀寫速度遠(yuǎn)遠(yuǎn)慢于內(nèi)存讀寫,因此一個(gè)優(yōu)化的原則是盡可能減少物理磁盤排序操作。
影響Oracle數(shù)據(jù)性能的因素有很多,如操作系統(tǒng),CPU性能,內(nèi)存分配不合理,Oracle配置,I/O沖突,網(wǎng)絡(luò)速度低以及SQL使用常見錯(cuò)誤等都會(huì)影響數(shù)據(jù)庫的性能。
(1)操作系統(tǒng)。Oracle數(shù)據(jù)庫服務(wù)器很大程度上依賴于運(yùn)行服務(wù)器的操作系統(tǒng),操作系統(tǒng)配置不合理會(huì)直接降低Oracle性能。
(2)CPU占用過高。CPU是服務(wù)器中一個(gè)重要的資源,CPU資源被其它應(yīng)用占用或被某個(gè)數(shù)據(jù)庫事務(wù)占用,會(huì)導(dǎo)致其它數(shù)據(jù)庫事務(wù)運(yùn)行停滯,而使數(shù)據(jù)庫響應(yīng)遲鈍,比如:空閑時(shí),CPU占用率超過90%,則說明Oracle服務(wù)器CPU資源不足,低效率的SQL語句、鎖沖突、SQL語句的重解析等原因都會(huì)引起CPU資源不足。
(3)I/O沖突。由于磁盤在同一時(shí)刻只能滿足一個(gè)進(jìn)程的需要,當(dāng)多個(gè)進(jìn)程同時(shí)訪問同一個(gè)磁盤時(shí),會(huì)引起讀寫盤沖突,進(jìn)而降低整個(gè)系統(tǒng)的速度。
(4)Oracle配置。每一個(gè)Oracle實(shí)例都是由一組Oracle后臺(tái)進(jìn)程和系統(tǒng)全局區(qū)的一個(gè)內(nèi)存區(qū)所組成的,正確調(diào)整Oracle配置將會(huì)對系統(tǒng)性能產(chǎn)生重大的影響。
(5)內(nèi)存分配不合理。多數(shù)操作系統(tǒng)使用虛擬內(nèi)存來擴(kuò)大內(nèi)存,它實(shí)際上屬于磁盤空間。當(dāng)實(shí)際的內(nèi)存空間不能滿足應(yīng)用軟件的要求時(shí),操作系統(tǒng)就將這部分的磁盤空間與內(nèi)存中的信息進(jìn)行頁面替換,這將引起大量的磁盤I/O操作,使整個(gè)服務(wù)器的性能下降。調(diào)整操作系統(tǒng)的主要目的就是減少內(nèi)存交換,減少分頁,使SGA留駐內(nèi)存。
(6)網(wǎng)絡(luò)速度低。網(wǎng)絡(luò)的帶寬會(huì)在一定程度上影響系統(tǒng)的整體性能,網(wǎng)絡(luò)速度過低會(huì)增加網(wǎng)絡(luò)如負(fù)荷量,從而降低數(shù)據(jù)庫系統(tǒng)的吞吐量并延長用戶響應(yīng)時(shí)間。
(7)SQL使用常見錯(cuò)誤。配置和數(shù)據(jù)遷移的錯(cuò)誤,大量遞歸SQL語句的存在,長時(shí)間的全表掃描,一些數(shù)據(jù)庫結(jié)構(gòu)的設(shè)置不合理,重做日志文件的不合理設(shè)置I/O設(shè)備的不合理的規(guī)劃,非標(biāo)準(zhǔn)參數(shù)的使用,執(zhí)行效率很差的SQL語句,游標(biāo)和共享池的錯(cuò)誤使用。
要在良好的Oracle方案中實(shí)現(xiàn)最優(yōu)的性能,最關(guān)鍵的是要有一個(gè)很好的數(shù)據(jù)庫設(shè)計(jì)方案。這一部分應(yīng)在開發(fā)信息系統(tǒng)之前完成。盡管Oracle系統(tǒng)本身己經(jīng)提供了若干種對系統(tǒng)性能進(jìn)行調(diào)節(jié)的技術(shù),但是,如果數(shù)據(jù)庫設(shè)計(jì)本身就有問題特別是結(jié)構(gòu)設(shè)計(jì),那么再怎么對數(shù)據(jù)庫進(jìn)行調(diào)整和優(yōu)化都達(dá)不到很好的效果。因此提高數(shù)據(jù)庫應(yīng)用系統(tǒng)的性能首先應(yīng)從數(shù)據(jù)庫設(shè)計(jì)開始。
數(shù)據(jù)庫設(shè)計(jì)分為邏輯設(shè)計(jì)和物理設(shè)計(jì)。邏輯設(shè)計(jì)包括使用數(shù)據(jù)庫組件為業(yè)務(wù)需求和數(shù)據(jù)建模,而無須考慮如何或在哪里物理存儲(chǔ)這些數(shù)據(jù)。物理設(shè)計(jì)包括將邏輯設(shè)計(jì)映射到物理媒體上、利用可用的硬件和軟件功能盡可能快地對數(shù)據(jù)進(jìn)行物理訪問和維護(hù),包括索引技術(shù)。邏輯設(shè)計(jì)主要是消除冗余數(shù)據(jù),提高數(shù)據(jù)的吞吐速度,保證數(shù)據(jù)的完整性,但對于多表之間關(guān)聯(lián)查詢(尤其是大數(shù)據(jù)表),將會(huì)影響其性能。因此,在物理設(shè)計(jì)時(shí)需要折衷考慮,根據(jù)業(yè)務(wù)規(guī)則和關(guān)聯(lián)表的數(shù)據(jù)量大小、數(shù)據(jù)項(xiàng)訪問頻度,對關(guān)聯(lián)查詢頻繁的數(shù)據(jù)表適當(dāng)提高數(shù)據(jù)冗余設(shè)計(jì)。
Oracle的信息存儲(chǔ)在內(nèi)存和磁盤上,由于訪問內(nèi)存比訪問磁盤快得多,在大量并發(fā)用戶數(shù)下,如果Oracle內(nèi)存尺寸不夠會(huì)降低程序的處理效率,延緩數(shù)據(jù)庫的響應(yīng)時(shí)間,提高數(shù)據(jù)庫性能需要設(shè)置合適的內(nèi)存尺寸,Oracle內(nèi)存包括系統(tǒng)全局區(qū)(SGA)和程序全局(PGA)。
4.2.1 調(diào)整SGA的大小
根據(jù)數(shù)據(jù)庫運(yùn)行狀況重新調(diào)整SGA的大小,對每個(gè)節(jié)點(diǎn)修改SGA大小的方法如下:
SQL>alter system set sga_target=300mscope=both sid='***'。
4.2.2 提高共享池性能
共享池主要是用來存放最近使用過的SQL語句,共享池內(nèi)存分配算法保證了數(shù)據(jù)字典數(shù)據(jù)比庫緩沖區(qū)數(shù)據(jù)在內(nèi)存停留時(shí)間更長,命中率更高,應(yīng)優(yōu)先調(diào)整庫緩沖區(qū)。
通過調(diào)整參數(shù)SHARED POOL SIZE的值,可以根據(jù)實(shí)際情況對每個(gè)節(jié)點(diǎn)共享池的大小進(jìn)行調(diào)整;為了提高共享池命中率,可以使用代碼重用方法;對于比較大的對象,如自定義的過程與包,在載人共享池以及硬解析的過程中需要共享池付出很大的代價(jià),把重要的大對象保持在內(nèi)存中,可以大大提高共享池性能。
4.2.3 優(yōu)化數(shù)據(jù)緩沖區(qū)高速緩存性能
為減少系統(tǒng)磁盤I/O開銷,應(yīng)調(diào)整數(shù)據(jù)緩沖區(qū)的尺寸,使服務(wù)器進(jìn)程盡量在緩沖區(qū)中找到所需的數(shù)據(jù),盡量減少等待數(shù)據(jù)塊或空閑緩沖區(qū)的時(shí)間。加大Buffer Cache的大小,可以通過調(diào)整DB_ACHE_SIZE參數(shù)的值增大Buffer Cache。使用多個(gè)緩沖池,Keep池中數(shù)據(jù)傾向于一直保存,Recycle池中的數(shù)據(jù)傾向于即時(shí)老化,而Default池則存放未指定存儲(chǔ)池的數(shù)據(jù),通過使用多個(gè)緩沖池提高Buffer Cache的命中率。
數(shù)據(jù)庫的數(shù)據(jù)最終要存儲(chǔ)在物理磁盤上。磁盤I/O操作是數(shù)據(jù)庫性能最重要的方面,它是系統(tǒng)消耗最大的Oracle數(shù)據(jù)庫操作。為了避免與I/O相關(guān)的性能瓶頸,監(jiān)控磁盤I/O并對其進(jìn)行調(diào)整非常重要。影響磁盤UO的性能的主要原因有磁盤競爭、I/O次數(shù)過多和數(shù)據(jù)塊空間的分配管理。
SQL語句優(yōu)化的實(shí)質(zhì)就是在結(jié)果正確的前提下,用優(yōu)化器可以識別的語句,充分利用索引來減少表掃描的I/O次數(shù),盡量避免表搜索的發(fā)生.優(yōu)化的目的就是將性能低下的SQL語句轉(zhuǎn)換成目的相同的、性能優(yōu)異的SQL語句,使數(shù)據(jù)查找的路徑最簡化,并盡量保持處理器時(shí)間和I/O時(shí)間的平衡。
盡量減少對數(shù)據(jù)庫的查詢次數(shù),對幾個(gè)表查詢時(shí)FROM子句的順序,按照由內(nèi)及外的訪問順序應(yīng)把可篩選出較少記錄的表放在前面,執(zhí)行時(shí)最先查找出這個(gè)表的幾個(gè)記錄,再和其他表的記錄相連接;為了充分利用庫緩沖區(qū)的SQL解析信息,對于經(jīng)常運(yùn)行條件子句變量值不同的SQL語句,應(yīng)將這些變量改為統(tǒng)一的綁定變量;避免不帶任何where條件的SQL語句的執(zhí)行,使用order by,group by,union等條件的SQL語句會(huì)對查詢完的數(shù)據(jù)進(jìn)行排序,增大了PGA或TEMP的負(fù)擔(dān),優(yōu)化這些語句時(shí)可在使用這些條件的列上加上有序索引;對SQL語句的索引進(jìn)行優(yōu)化,索引的目的是提高數(shù)據(jù)訪問速度,Oracle的索引都是獨(dú)立于與之相關(guān)的表或簇中的數(shù)據(jù)的。如果對索引進(jìn)行良好的配置和優(yōu)化,則可以大大降低數(shù)據(jù)庫中數(shù)據(jù)文件的I/O操作并提高系統(tǒng)性能和響應(yīng)速度。
選取約為4G左右的東風(fēng)日產(chǎn)管理系統(tǒng)作為數(shù)據(jù)庫優(yōu)化實(shí)例,該數(shù)據(jù)庫運(yùn)行在HP DL380G7 583917-B21服務(wù)器上,使用Linux操作系統(tǒng),優(yōu)化結(jié)果如圖1。從圖1可以看出,數(shù)據(jù)庫經(jīng)過調(diào)整優(yōu)化數(shù)據(jù)庫、調(diào)整與優(yōu)化內(nèi)存、調(diào)整與優(yōu)化I/O和SQL優(yōu)化后,響應(yīng)時(shí)間變得越來越短,系統(tǒng)性能得到逐步提高。
圖1 性能調(diào)優(yōu)
隨著Oracle數(shù)據(jù)庫規(guī)模的擴(kuò)大,用戶數(shù)量的增加,Oracle數(shù)據(jù)庫性能問題越來越突出,Oracle數(shù)據(jù)庫的性能優(yōu)化涉及的方面很廣,優(yōu)化與調(diào)整是一個(gè)需要通過不斷摸索、總結(jié)的過程,在實(shí)踐中,必須先了解影響數(shù)據(jù)庫系統(tǒng)性能的因素,針對這些不同的因素選擇合理的優(yōu)化調(diào)整策略予以調(diào)整,同時(shí)也需要采取更加先進(jìn)的技術(shù)來對數(shù)據(jù)庫進(jìn)行調(diào)優(yōu),使得數(shù)據(jù)庫系統(tǒng)獲得最優(yōu)性能。
[1]蓋國強(qiáng).循序漸進(jìn)Oracle數(shù)據(jù)庫管理、優(yōu)化與備份恢復(fù)[M].北京:人民郵電出版社,2007.
[2]趙夢勤,李秀蘭.ORACLE數(shù)據(jù)庫應(yīng)用系統(tǒng)的優(yōu)化策略[J].計(jì)算機(jī)工程與應(yīng)用.2003(27):217~218.
[3]潘 敏.Oracle數(shù)據(jù)庫性能優(yōu)化的分析[J].電腦編程技巧與維護(hù),2010(20):21~22.
[4]韓云波.Oracle性能調(diào)整技術(shù)研究[J].電腦知識與技術(shù),2010(7):65~66.