李曉英
(大慶油田天然氣分公司 工程技術(shù)大隊(duì),黑龍江 大慶 163416)
隨著網(wǎng)絡(luò)模式系統(tǒng)應(yīng)用的不斷深入,用戶訪問量、數(shù)據(jù)量越來越大,數(shù)據(jù)庫規(guī)模也隨之不斷擴(kuò)大,數(shù)據(jù)庫系統(tǒng)的性能、編程效率和系統(tǒng)運(yùn)行效率等問題就越來越突出,因此,除系統(tǒng)架構(gòu)設(shè)計(jì)合理外,如何對(duì)數(shù)據(jù)庫和程序代碼進(jìn)行調(diào)優(yōu)是系統(tǒng)高效運(yùn)行的關(guān)鍵。
目前油田大系統(tǒng)開發(fā)中基本都采用了Oracle作為數(shù)據(jù)庫服務(wù)器。Oracle數(shù)據(jù)庫服務(wù)器是高度可優(yōu)化的軟件產(chǎn)品,經(jīng)常性的調(diào)整可以優(yōu)化應(yīng)用系統(tǒng)性能,防止出現(xiàn)系統(tǒng)瓶頸。數(shù)據(jù)庫性能優(yōu)化的基本原則就是:通過盡可能少的磁盤訪問獲得所需的數(shù)據(jù)。對(duì)Oracle數(shù)據(jù)庫進(jìn)行性能調(diào)整時(shí),應(yīng)按照一定的順序進(jìn)行,這樣避免系統(tǒng)開發(fā)后期或完成后,出現(xiàn)一些不必要的或者代價(jià)很大的調(diào)整。系統(tǒng)開發(fā)前期要充分對(duì)系統(tǒng)進(jìn)行詳細(xì)的優(yōu)化設(shè)計(jì),從如下3個(gè)階段入手。
為了充分利用Oracle數(shù)據(jù)庫的功能特性,設(shè)計(jì)系統(tǒng)時(shí),根據(jù)業(yè)務(wù)情況(訪問量或客戶端數(shù)量)和現(xiàn)有資源狀況(服務(wù)器配置)考慮系統(tǒng)架構(gòu)和數(shù)據(jù)庫邏輯結(jié)構(gòu)的設(shè)計(jì),對(duì)其邏輯結(jié)構(gòu)和物理結(jié)構(gòu)進(jìn)行優(yōu)化設(shè)計(jì),使之在滿足需求條件的情況下,系統(tǒng)性能達(dá)到最佳,系統(tǒng)開銷達(dá)到最小。
采取操作系統(tǒng)級(jí)、數(shù)據(jù)庫級(jí)的一些優(yōu)化措施來使系統(tǒng)性能最佳。
1.1.1 調(diào)整硬盤 I/O
在應(yīng)用系統(tǒng)開發(fā)之前,DBA可將組成同一個(gè)表空間的數(shù)據(jù)文件放在不同的硬盤上,做到硬盤之間I/O負(fù)載均衡。在磁盤比較富裕(空間換時(shí)間)的情況下還應(yīng)遵循以下原則:用戶表空間與系統(tǒng)表空間分開磁盤存放;創(chuàng)建表和索引時(shí)指定不同的表空間;創(chuàng)建回滾段專用的表空間,防止空間競爭影響事務(wù)的完成;創(chuàng)建臨時(shí)表空間用于排序操作,盡可能防止數(shù)據(jù)庫碎片存在于多個(gè)表空間中。
1.1.2 確定數(shù)據(jù)塊大小和存儲(chǔ)參數(shù)
由于數(shù)據(jù)庫塊的大小在數(shù)據(jù)庫創(chuàng)建以后就不能再修改,因此為了減少數(shù)據(jù)鏈接和行遷移,又提高磁盤空間的利用率,在設(shè)計(jì)數(shù)據(jù)庫時(shí)要確定合適的數(shù)據(jù)塊大小和存儲(chǔ)參數(shù)。通常我們是根據(jù)樣例數(shù)據(jù)確定數(shù)據(jù)塊大小,而根據(jù)業(yè)務(wù)現(xiàn)狀和未來發(fā)展趨勢(shì)確定存儲(chǔ)參數(shù)。
1.1.3 恰當(dāng)使用分區(qū)、索引及存檔功能
業(yè)務(wù)數(shù)據(jù)量隨著應(yīng)用時(shí)間不斷增長,考慮存放該數(shù)據(jù)庫表使用Oracle數(shù)據(jù)庫的分區(qū)功能;對(duì)于經(jīng)常訪問的數(shù)據(jù)庫表建立索引;對(duì)于經(jīng)常訪問但是當(dāng)業(yè)務(wù)流程完成后不再變動(dòng)的數(shù)據(jù),采用放入歷史檔案的方法來實(shí)現(xiàn)應(yīng)用系統(tǒng)中訪問盡可能少的數(shù)據(jù)量。
程序優(yōu)化是指對(duì)解決同一問題的幾個(gè)不同的程序,進(jìn)行比較、修改、調(diào)整程序,把一般程序變換為語句最少、占用內(nèi)存量少、處理速度最快、外部設(shè)備分時(shí)使用效率最高的最優(yōu)程序。
良好的SQL語句可以被數(shù)據(jù)庫重復(fù)使用而減少分析時(shí)間;恰當(dāng)?shù)厥褂盟饕墒乖L問數(shù)據(jù)塊大大減少,從而減少響應(yīng)時(shí)間。應(yīng)用程序的執(zhí)行最終將歸結(jié)為數(shù)據(jù)庫中的SQL語句執(zhí)行,因此SQL語句的執(zhí)行效率決定了系統(tǒng)運(yùn)行的性能。
2.1.1 減少訪問數(shù)據(jù)庫次數(shù)
當(dāng)執(zhí)行每條SQL語句時(shí),O racle內(nèi)部執(zhí)行了許多工作,相當(dāng)費(fèi)時(shí),因此單條語句執(zhí)行,變多條語句組合一起執(zhí)行,能夠達(dá)到效率與易用的最佳結(jié)合,減少網(wǎng)絡(luò)傳輸次數(shù),可節(jié)省很多系統(tǒng)運(yùn)行時(shí)間,如下語句:+
循環(huán)S QL數(shù)組,每次循環(huán)都產(chǎn)生一條SQL語句,若在循環(huán)體內(nèi)依次執(zhí)行,增加了數(shù)據(jù)庫的連接和關(guān)閉次數(shù),嚴(yán)重降低系統(tǒng)運(yùn)行效率,若采用將數(shù)組保存在SQL語句,一起執(zhí)行,只需一次數(shù)據(jù)庫的連接就可以執(zhí)行多條SQL語句。
2.1.2 select子句中避免使用“*”
O racle在解析過程中會(huì)將“*”依次轉(zhuǎn)換成所有列名,這將意味著耗費(fèi)更多的時(shí)間,因此,在使用select語句時(shí),最好寫全列名。
但有一點(diǎn)特殊,計(jì)算記錄條數(shù)語句 Count(*)卻比 count(1)稍快,如果可以通過索引列檢索,對(duì)索引列的計(jì)數(shù)仍是最快的。
一次性取出數(shù)據(jù)存于虛擬表中供程序處理,利用內(nèi)存的高速性,達(dá)到提高程序處理速度的目的。反之,把處理的數(shù)據(jù)先存于虛擬表中,處理好后再一次性存入實(shí)表中,也可達(dá)到同樣目的。
減少循環(huán)和嵌套語句結(jié)構(gòu),循環(huán)和嵌套層數(shù)越多,運(yùn)算速度越慢(相對(duì)重復(fù)執(zhí)行的語句多),減少循環(huán)和嵌套層數(shù),或不用循環(huán)嵌套語句,就可提高程序執(zhí)行速度。
有時(shí)為了提高數(shù)據(jù)處理、查詢速度,可適當(dāng)增加一些中間表、一些多余的數(shù)據(jù)項(xiàng),以達(dá)到提高系統(tǒng)效率的目的。
如:(1)把計(jì)算項(xiàng)、合計(jì)項(xiàng)存入表中,來提高查詢速度。
(2)建立輔助表,描述單表間關(guān)系,方便編程,提高程序運(yùn)行效率。
如天然氣裝置運(yùn)行成本對(duì)標(biāo)系統(tǒng)中成本核算統(tǒng)計(jì)表中的HJL(合計(jì)量)、HJZQ(合計(jì)周期)字段,就是為提高數(shù)據(jù)匯總查詢及讀取速度而增加的數(shù)據(jù)項(xiàng)。
設(shè)計(jì)錄入功能時(shí),把很多數(shù)據(jù)檢驗(yàn)放到客戶端,對(duì)于每個(gè)用戶而言,其計(jì)算機(jī)只承擔(dān)自身的工作,若將大量的數(shù)據(jù)檢驗(yàn)都放到服務(wù)器端,其要承擔(dān)很大的壓力,占用很多服務(wù)器和網(wǎng)絡(luò)資源。所以客戶端與服務(wù)器大量交互式的最佳優(yōu)化模式就是客戶端校驗(yàn)的效率與易用的最佳結(jié)合,以及盡量減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸。
配置性能高配的服務(wù)器,為系統(tǒng)提供高質(zhì)量硬件平臺(tái);配置智能三層交換機(jī),保證網(wǎng)絡(luò)高效、穩(wěn)定運(yùn)行。
隨著計(jì)算機(jī)軟硬技術(shù)的迅猛發(fā)展,系統(tǒng)開發(fā)的軟硬環(huán)境也越來越復(fù)雜,如今系統(tǒng)開發(fā)模式已發(fā)展成了多用戶的網(wǎng)絡(luò)模式,在網(wǎng)絡(luò)模式下的多用戶系統(tǒng)開發(fā)過程中,編程技巧的使用不僅是高效系統(tǒng)開發(fā)的基礎(chǔ),更是系統(tǒng)高效運(yùn)行的保障。