王曉燕
(太原學(xué)院,山西 太原 030032)
現(xiàn)代指揮控制體系,一般由信息收集分系統(tǒng)、信息傳遞分系統(tǒng)、信息處理分系統(tǒng)、信息顯示分系統(tǒng)、決策監(jiān)控分系統(tǒng)和執(zhí)行分系統(tǒng)有機(jī)結(jié)合,組成一個(gè)統(tǒng)一的整體。但隨著數(shù)據(jù)庫規(guī)模的增大,數(shù)據(jù)積累的增多和處理業(yè)務(wù)復(fù)雜程度的增加,可能導(dǎo)致應(yīng)用系統(tǒng)性能出現(xiàn)問題,影響系統(tǒng)的可靠性、抗毀性、保密性、抗干擾性、靈活性和互通性。解決問題的根本路徑在于對數(shù)據(jù)庫應(yīng)用系統(tǒng)的設(shè)計(jì)開發(fā)和管理程度。
研究表明,數(shù)據(jù)庫應(yīng)用系統(tǒng)的性能出現(xiàn)問題有一半都是由系統(tǒng)的設(shè)計(jì)引起的。就數(shù)據(jù)庫的性能優(yōu)化來說,過程是較為復(fù)雜的,這是由于在將系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)出之前,軟件設(shè)計(jì)師并沒有辦法對系統(tǒng)將來的用戶業(yè)務(wù)處理需求有進(jìn)一步的了解,所以在軟件設(shè)計(jì)中有一定漏洞,導(dǎo)致系統(tǒng)運(yùn)行一段時(shí)間后才出現(xiàn)這樣或那樣的問題。因而,提高oracle 數(shù)據(jù)庫應(yīng)用系統(tǒng)性能對于整個(gè)系統(tǒng)的順利運(yùn)行至關(guān)重要。本文針對當(dāng)前數(shù)據(jù)庫應(yīng)用系統(tǒng)性能出現(xiàn)的問題介紹了在實(shí)踐中總結(jié)的一些數(shù)據(jù)庫應(yīng)用系統(tǒng)性能優(yōu)化的方法。
數(shù)據(jù)庫系統(tǒng)性能的評價(jià)標(biāo)準(zhǔn)主要有幾個(gè)方面:一是系統(tǒng)的吞吐量。吞吐量是指數(shù)據(jù)庫在單位時(shí)間內(nèi)完成的SQL 的語句數(shù)量,如果把系統(tǒng)的數(shù)據(jù)處理量提高也可以同時(shí)提高數(shù)據(jù)庫對數(shù)據(jù)處理的速度,在同樣的資源環(huán)境下利用較少的時(shí)間做更多的工作。其計(jì)算方法用單位時(shí)間的事物量(tps)來表示。二是用戶的相應(yīng)時(shí)間。用戶提交SQL 語句后,到獲得結(jié)果集的第一行需要的時(shí)間,即應(yīng)用做出反應(yīng)的時(shí)間,單位時(shí)間為毫秒或秒。響應(yīng)時(shí)間包括系統(tǒng)的服務(wù)時(shí)間和用戶的等待時(shí)間。因而,可以通過提高數(shù)據(jù)庫的吞吐量來減少系統(tǒng)的服務(wù)時(shí)間,另外,若要減少用戶的等待時(shí)間,可以減少用戶訪問統(tǒng)一數(shù)據(jù)庫資源的沖突率。三是數(shù)據(jù)庫的命中率。用戶所需要的數(shù)據(jù)全部都是通過緩沖區(qū)告訴緩存來存取的。也就是說,衡量用戶是否能在內(nèi)存中對數(shù)據(jù)量的需求得到滿足的標(biāo)準(zhǔn)是緩沖區(qū)的告訴緩存命中率。其計(jì)算公式是告訴緩存命中總數(shù)除以對告訴緩存的查找總數(shù)[1]。四是內(nèi)存的使用狀況。一般內(nèi)存的使用狀況體現(xiàn)在共享內(nèi)存、永久性內(nèi)存和運(yùn)行時(shí)候的內(nèi)存三者的分配使用上。一般對內(nèi)存使用的調(diào)整我們傾向于考慮把精力和時(shí)間用于解決可能產(chǎn)生最大利益的問題上,在使用見到最小的基礎(chǔ)上已得到投資的最大回報(bào)。五是磁盤I/0。這是衡量數(shù)據(jù)庫性能方面較為重要的一個(gè)指標(biāo),由于數(shù)據(jù)庫對每一個(gè)數(shù)據(jù)的處理都要經(jīng)過I/0 這樣的活動(dòng)來進(jìn)行,而種種活動(dòng)既可以在內(nèi)存中也可以在磁盤上運(yùn)行,我們可以通過減少一些沒必要的I/0 活動(dòng)內(nèi)容,從而增加用戶獲得的吞吐量,縮短用戶的響應(yīng)時(shí)間。
B/S 連接方式相對于傳統(tǒng)的C/S 連接方式來說,雖然在一定程度上緩解了資源連接的壓力,但是缺乏數(shù)據(jù)庫連接池的管理,用戶數(shù)量的增加和應(yīng)用服務(wù)器的擴(kuò)大會(huì)導(dǎo)致連接的數(shù)量無法受到控制而不斷上升。
數(shù)據(jù)庫中業(yè)務(wù)流程處理缺乏合理的應(yīng)用結(jié)構(gòu)設(shè)計(jì),單純的數(shù)據(jù)關(guān)系很難承載多元的業(yè)務(wù)應(yīng)用需求,在實(shí)際的業(yè)務(wù)系統(tǒng)中,業(yè)務(wù)流程在不斷增加,現(xiàn)有數(shù)據(jù)庫的分析統(tǒng)計(jì)和決策支持并不能滿足實(shí)際的業(yè)務(wù)需要。
數(shù)據(jù)庫的設(shè)計(jì)僅僅能應(yīng)對簡單的數(shù)據(jù)存儲(chǔ),但是用戶數(shù)量在不斷增加,原有的數(shù)據(jù)庫整體分析和性能設(shè)計(jì)并不能滿足日益劇增的用戶量的需求,因而系統(tǒng)性能會(huì)隨之下降。
數(shù)據(jù)庫一定開發(fā)由于其本身管理員的能力有限而存在著許多不足,隨著系統(tǒng)的不斷增大,其系統(tǒng)的硬件配備和系統(tǒng)軟件兩方面有著先天不足,而且在管理維護(hù)中缺乏相應(yīng)的成熟技術(shù),因而提高數(shù)據(jù)庫管理員數(shù)據(jù)庫硬件軟件研究水平也非常重要。
數(shù)據(jù)庫對SQL 語句的執(zhí)行速度快慢也決定著應(yīng)用程序的執(zhí)行速度快慢。因此,我們應(yīng)該對SQL語句進(jìn)行適當(dāng)調(diào)整,就能提高數(shù)據(jù)庫系統(tǒng)的性能。SQL 語句優(yōu)化就是利用索引來減少表掃描的I/0 次數(shù),以避免表搜索的發(fā)生,其原理是將性能較為低下的SQL 語句轉(zhuǎn)換為性能相對優(yōu)異的,但是目的相同的SQL 語句,將數(shù)據(jù)查找的路徑簡單化[2]。具體的操作方法如下:
首先,查找出有問題的SQL 語句。搜集統(tǒng)計(jì)數(shù)據(jù),oracle 中可以通過DBMSSTATS 包進(jìn)行,用于搜集有關(guān)連接數(shù)據(jù)行的統(tǒng)計(jì)數(shù)據(jù),使用ANALYZE 命令可以搜集簇的數(shù)據(jù)情況,而其他情況可以使用DBMS -SATS 包。語法為 exec DBMS_SATS.gathertable_stats(“owname”,“tablename”,“partname”)??梢酝ㄟ^SQL Trace 工具對SQL 語句進(jìn)行分析,利用命令A(yù)LTER SESSION SET SQL-TRACE=TRUE會(huì)話將SQL-TRACE 激活,通過在udump 管理區(qū)創(chuàng)建跟蹤文件來了解各參數(shù),如執(zhí)行和返回?cái)?shù)據(jù)的次數(shù)、解析、CPU 時(shí)間、庫緩沖區(qū)命中率等。其次,是建立合適的SQL 語句。先建立合適的索引,其目的是為了提高查詢效率,為了降低I/0 競爭,索引不應(yīng)該和用戶表空間建立在同一個(gè)磁盤上。此外,還應(yīng)該盡量避免使用DSJTNITC、UNION、GROUP BY、ORDER BY等關(guān)鍵字,因?yàn)檫@些操作會(huì)啟動(dòng)SQL 引擎執(zhí)行一些耗費(fèi)資源的排序功能,因而增加運(yùn)行時(shí)間。這些語句可以通過其他的方式來實(shí)現(xiàn),因?yàn)閛racle 是從上而下的順序來解讀語句的,所以我們?nèi)绻押锌蛇^濾的數(shù)據(jù)條件寫在where 子句的末尾,那么就可以適當(dāng)加快SQL 的處理語句速度。例如:
SELECT A.*,B.*
FROM T_A A,T_B B
WHERE A.OP_DATE >='2006- 01- 01'
AND A.OP_DATE <='2007- 01- 01'
AND (A 和B 的關(guān)聯(lián)條件).
另外,用having 子句有時(shí)候會(huì)比where 子句處理速度更長。因?yàn)閣here 子句可以把不必要的條件和記錄過濾掉,所以它的運(yùn)行效率比having 子句的要高。
將不合理SQL 語句尋找出并給與修改這種方法耗費(fèi)的資源小,實(shí)施起來效果比較好,可以大范圍的提高數(shù)據(jù)庫應(yīng)用系統(tǒng)性能,但是,這并不能從本質(zhì)上優(yōu)化系統(tǒng)的性能,因?yàn)榻⑺饕龝?huì)受到很多限制,比如表上的索引如果太多會(huì)對INSERT、DELETE 以及UPDATE 等有影響,而且,日志中記錄了所有的操作,久而久之,磁盤I/0 的操作也會(huì)增加,數(shù)據(jù)量的加大最終導(dǎo)致系統(tǒng)性能也會(huì)下降。
服務(wù)器內(nèi)部參數(shù)調(diào)整極為復(fù)雜,對系統(tǒng)影響較大的參數(shù)一般包括共享池(Shared pool)、數(shù)據(jù)緩沖區(qū) (Database Buffer Cache)日志緩沖區(qū) (Redo log buffer)等。
數(shù)據(jù)庫緩沖區(qū)(Database Buffer Cache)是把從磁盤中讀取的數(shù)據(jù)塊存放于內(nèi)存緩存中,因而,如果數(shù)據(jù)庫的緩沖區(qū)大,其儲(chǔ)存的數(shù)據(jù)也會(huì)相應(yīng)的加大。這樣的話,磁盤讀取數(shù)據(jù)操作所花的時(shí)間就會(huì)減少,因此間接地使得系統(tǒng)的運(yùn)行效率得到提高。我們可以利用數(shù)據(jù)字典來得知數(shù)據(jù)緩沖區(qū)的活動(dòng)狀況,如果命中率小于0.85 的話,就可以為數(shù)據(jù)塊緩沖區(qū)分配更多內(nèi)存。
共享池(Shared pool)包括兩個(gè)部分,即數(shù)據(jù)字典緩沖區(qū)和庫告訴緩存區(qū),它的作用是儲(chǔ)存用戶最近使用的一些語句,并且利用有效的方式對其進(jìn)行管理。因而,共享池大小是否合適體現(xiàn)在兩者的命中率上面。庫緩沖區(qū)的設(shè)置應(yīng)該適度,不能太大,也不可太小,如果設(shè)置太大的話會(huì)提高CPU 的使用率,而如果設(shè)置太小會(huì)使語句源源不斷地被裝入而影響系統(tǒng)的性能。輸入命令select (1-sum(reloads/sum(pins) from v$librarycache 來查詢其命中率,若命中率<0.95,那么可以增加shared-poolsize 值來提高其命中率。另外,輸入命令select sum (1-(getmisses)/(sum(gets)+sum(getmisses))) form v$rowcache 來對數(shù)據(jù)字典高速緩存進(jìn)行查詢,若是結(jié)果<0.85,那么通過增大共享池的大小可以提高字典高速緩存可以使用的內(nèi)存數(shù)量。
日志緩沖區(qū)(Redo log buffer)若是分配小就缺乏足夠的空間來重做條目而需要進(jìn)行等待,通過輸入Select name、value from v$sysstat where name ='redo log space requests' 進(jìn)行查詢,查詢結(jié)果應(yīng)該接近零,若非如此的話,每次把Log-buffers 增大5%來輸入上面的語句進(jìn)行查詢,一直到最后結(jié)果接近零為止。
我們可以將數(shù)據(jù)庫運(yùn)行的各項(xiàng)操作進(jìn)行分解,對操作的記錄數(shù)進(jìn)行嚴(yán)格控制,或者將幾項(xiàng)操作同時(shí)進(jìn)行,這樣可以提高數(shù)據(jù)庫應(yīng)用系統(tǒng)的執(zhí)行率,從而優(yōu)化其性能。使用數(shù)據(jù)庫的分區(qū)技術(shù)是一個(gè)很好的辦法,它可以使得數(shù)據(jù)庫查詢的速度更為快捷、有效,而且增加了數(shù)據(jù)庫的可用性。在進(jìn)行查詢的初期,優(yōu)化器就可以將所需查詢數(shù)據(jù)的所在區(qū)辨識(shí)和識(shí)別出來,從而未包含所需查詢數(shù)據(jù)的分區(qū)可以避免讀取數(shù)據(jù),從而減少查詢的時(shí)間,提高其查詢效率[3]。而且,數(shù)據(jù)庫分區(qū)后,可以把使用頻率不同的表建立在不同的設(shè)備上,合理高效地分布表空間。另外,除了數(shù)據(jù)庫分區(qū),幾乎所有的Oracle 數(shù)據(jù)庫的操作都支持并行技術(shù)的,包括了查詢、數(shù)據(jù)的加載和插入等。并行指的是幾個(gè)處理器同時(shí)投入一條命令的運(yùn)行處理工作中,所以,用戶在創(chuàng)建數(shù)據(jù)對象的時(shí)候,可以設(shè)定并行參數(shù)使得數(shù)據(jù)庫系統(tǒng)性能得以提升。這樣做的好處是系統(tǒng)的運(yùn)行效率得到了提高,特別是大數(shù)據(jù)量的訪問支持情況較好,但是由于數(shù)據(jù)庫分區(qū)需要對數(shù)據(jù)表的增長趨勢進(jìn)行獨(dú)立分析,因而需要大量的硬件資源和專業(yè)的數(shù)據(jù)庫管理知識(shí),要求十分高,這從一定程度上降低了其可行性。
軟件性能由于壓力測試進(jìn)行不充分很多時(shí)候都不能滿足用戶的需求,因?yàn)橛脩粲袝r(shí)不但需要軟件完成一定功能,更加需要軟件來支持其業(yè)務(wù)的順利運(yùn)行。所以,我們?nèi)羰且獪y試軟件系統(tǒng)應(yīng)該著重關(guān)注它是否能有效的處理用戶的業(yè)務(wù)。由于系統(tǒng)通常在運(yùn)行一段長的時(shí)間后,處理速度和性能都會(huì)降低,所以我們在測試軟件的時(shí)候可以運(yùn)用數(shù)據(jù)對其測試,應(yīng)該注意的是數(shù)據(jù)量要大,否則難以測出系統(tǒng)性能。比如,oracle 數(shù)據(jù)庫中,如果我們設(shè)置pctfree 和pctused 的參數(shù)的話,數(shù)據(jù)塊可能會(huì)占據(jù)一半的空間導(dǎo)致系統(tǒng)性能下降,也有可能使數(shù)據(jù)庫記錄連接。這些問題在系統(tǒng)運(yùn)行了一段時(shí)間之后才會(huì)被發(fā)覺,因而加強(qiáng)對數(shù)據(jù)庫軟件測試非常重要。另外,若是只使用一個(gè)測試,我們經(jīng)常難以發(fā)現(xiàn)從真正意義上了解軟件的應(yīng)用和負(fù)載情況,所以,我們測試可以在好幾個(gè)并發(fā)運(yùn)行模塊的情況下進(jìn)行,比如,如果兩個(gè)軟件模塊都在向同一個(gè)表中插入記錄,查詢表中數(shù)據(jù),而運(yùn)行方式相同,兩個(gè)不同模塊的運(yùn)行很可能導(dǎo)致最后檢測的數(shù)據(jù)出現(xiàn)不一樣的情況。如果是這樣的情況,我們只能在同一時(shí)間內(nèi)好幾個(gè)用戶同時(shí)進(jìn)行軟件的操作,通過這種測試方式興許能找到問題所在。
數(shù)據(jù)庫在現(xiàn)代指揮控制領(lǐng)域得到廣泛應(yīng)用,日益增加的業(yè)務(wù)數(shù)據(jù)和日漸繁復(fù)的業(yè)務(wù)處理,要求對其系統(tǒng)的研發(fā)和管理技術(shù)在學(xué)術(shù)和實(shí)踐中不斷進(jìn)步,尤其是對于數(shù)據(jù)庫的性能優(yōu)化,有待于我們不斷地深入研究和探索合理的方法提升數(shù)據(jù)庫性能。筆者根據(jù)實(shí)踐討論了通過SQL 語句優(yōu)化、調(diào)整服務(wù)器分配、利用數(shù)據(jù)庫分區(qū)和并行技術(shù)和對軟件測試的優(yōu)化等方式對系統(tǒng)數(shù)據(jù)進(jìn)行性能優(yōu)化,除此之外,通過更多的相關(guān)人員的不懈努力和積極探尋,必然能找到更多新的提高數(shù)據(jù)性能辦法。