李曉英
(大慶油田天然氣分公司 工程技術(shù)大隊,黑龍江 大慶 163416)
隨著網(wǎng)絡(luò)模式系統(tǒng)應用的不斷深入,用戶訪問量、數(shù)據(jù)量越來越大,數(shù)據(jù)庫規(guī)模也隨之不斷擴大,數(shù)據(jù)庫系統(tǒng)的性能、編程效率和系統(tǒng)運行效率等問題就越來越突出,因此,除系統(tǒng)架構(gòu)設(shè)計合理外,如何對數(shù)據(jù)庫和程序代碼進行調(diào)優(yōu)是系統(tǒng)高效運行的關(guān)鍵。
目前油田大系統(tǒng)開發(fā)中基本都采用了Oracle作為數(shù)據(jù)庫服務器。Oracle數(shù)據(jù)庫服務器是高度可優(yōu)化的軟件產(chǎn)品,經(jīng)常性的調(diào)整可以優(yōu)化應用系統(tǒng)性能,防止出現(xiàn)系統(tǒng)瓶頸。數(shù)據(jù)庫性能優(yōu)化的基本原則就是:通過盡可能少的磁盤訪問獲得所需的數(shù)據(jù)。對Oracle數(shù)據(jù)庫進行性能調(diào)整時,應按照一定的順序進行,這樣避免系統(tǒng)開發(fā)后期或完成后,出現(xiàn)一些不必要的或者代價很大的調(diào)整。系統(tǒng)開發(fā)前期要充分對系統(tǒng)進行詳細的優(yōu)化設(shè)計,從如下3個階段入手。
為了充分利用Oracle數(shù)據(jù)庫的功能特性,設(shè)計系統(tǒng)時,根據(jù)業(yè)務情況(訪問量或客戶端數(shù)量)和現(xiàn)有資源狀況(服務器配置)考慮系統(tǒng)架構(gòu)和數(shù)據(jù)庫邏輯結(jié)構(gòu)的設(shè)計,對其邏輯結(jié)構(gòu)和物理結(jié)構(gòu)進行優(yōu)化設(shè)計,使之在滿足需求條件的情況下,系統(tǒng)性能達到最佳,系統(tǒng)開銷達到最小。
采取操作系統(tǒng)級、數(shù)據(jù)庫級的一些優(yōu)化措施來使系統(tǒng)性能最佳。
1.1.1 調(diào)整硬盤 I/O
在應用系統(tǒng)開發(fā)之前,DBA可將組成同一個表空間的數(shù)據(jù)文件放在不同的硬盤上,做到硬盤之間I/O負載均衡。在磁盤比較富裕(空間換時間)的情況下還應遵循以下原則:用戶表空間與系統(tǒng)表空間分開磁盤存放;創(chuàng)建表和索引時指定不同的表空間;創(chuàng)建回滾段專用的表空間,防止空間競爭影響事務的完成;創(chuàng)建臨時表空間用于排序操作,盡可能防止數(shù)據(jù)庫碎片存在于多個表空間中。
1.1.2 確定數(shù)據(jù)塊大小和存儲參數(shù)
由于數(shù)據(jù)庫塊的大小在數(shù)據(jù)庫創(chuàng)建以后就不能再修改,因此為了減少數(shù)據(jù)鏈接和行遷移,又提高磁盤空間的利用率,在設(shè)計數(shù)據(jù)庫時要確定合適的數(shù)據(jù)塊大小和存儲參數(shù)。通常我們是根據(jù)樣例數(shù)據(jù)確定數(shù)據(jù)塊大小,而根據(jù)業(yè)務現(xiàn)狀和未來發(fā)展趨勢確定存儲參數(shù)。
1.1.3 恰當使用分區(qū)、索引及存檔功能
業(yè)務數(shù)據(jù)量隨著應用時間不斷增長,考慮存放該數(shù)據(jù)庫表使用Oracle數(shù)據(jù)庫的分區(qū)功能;對于經(jīng)常訪問的數(shù)據(jù)庫表建立索引;對于經(jīng)常訪問但是當業(yè)務流程完成后不再變動的數(shù)據(jù),采用放入歷史檔案的方法來實現(xiàn)應用系統(tǒng)中訪問盡可能少的數(shù)據(jù)量。
程序優(yōu)化是指對解決同一問題的幾個不同的程序,進行比較、修改、調(diào)整程序,把一般程序變換為語句最少、占用內(nèi)存量少、處理速度最快、外部設(shè)備分時使用效率最高的最優(yōu)程序。
良好的SQL語句可以被數(shù)據(jù)庫重復使用而減少分析時間;恰當?shù)厥褂盟饕墒乖L問數(shù)據(jù)塊大大減少,從而減少響應時間。應用程序的執(zhí)行最終將歸結(jié)為數(shù)據(jù)庫中的SQL語句執(zhí)行,因此SQL語句的執(zhí)行效率決定了系統(tǒng)運行的性能。
2.1.1 減少訪問數(shù)據(jù)庫次數(shù)
當執(zhí)行每條SQL語句時,O racle內(nèi)部執(zhí)行了許多工作,相當費時,因此單條語句執(zhí)行,變多條語句組合一起執(zhí)行,能夠達到效率與易用的最佳結(jié)合,減少網(wǎng)絡(luò)傳輸次數(shù),可節(jié)省很多系統(tǒng)運行時間,如下語句:+

循環(huán)S QL數(shù)組,每次循環(huán)都產(chǎn)生一條SQL語句,若在循環(huán)體內(nèi)依次執(zhí)行,增加了數(shù)據(jù)庫的連接和關(guān)閉次數(shù),嚴重降低系統(tǒng)運行效率,若采用將數(shù)組保存在SQL語句,一起執(zhí)行,只需一次數(shù)據(jù)庫的連接就可以執(zhí)行多條SQL語句。
2.1.2 select子句中避免使用“*”
O racle在解析過程中會將“*”依次轉(zhuǎn)換成所有列名,這將意味著耗費更多的時間,因此,在使用select語句時,最好寫全列名。
但有一點特殊,計算記錄條數(shù)語句 Count(*)卻比 count(1)稍快,如果可以通過索引列檢索,對索引列的計數(shù)仍是最快的。
一次性取出數(shù)據(jù)存于虛擬表中供程序處理,利用內(nèi)存的高速性,達到提高程序處理速度的目的。反之,把處理的數(shù)據(jù)先存于虛擬表中,處理好后再一次性存入實表中,也可達到同樣目的。
減少循環(huán)和嵌套語句結(jié)構(gòu),循環(huán)和嵌套層數(shù)越多,運算速度越慢(相對重復執(zhí)行的語句多),減少循環(huán)和嵌套層數(shù),或不用循環(huán)嵌套語句,就可提高程序執(zhí)行速度。
有時為了提高數(shù)據(jù)處理、查詢速度,可適當增加一些中間表、一些多余的數(shù)據(jù)項,以達到提高系統(tǒng)效率的目的。
如:(1)把計算項、合計項存入表中,來提高查詢速度。
(2)建立輔助表,描述單表間關(guān)系,方便編程,提高程序運行效率。
如天然氣裝置運行成本對標系統(tǒng)中成本核算統(tǒng)計表中的HJL(合計量)、HJZQ(合計周期)字段,就是為提高數(shù)據(jù)匯總查詢及讀取速度而增加的數(shù)據(jù)項。
設(shè)計錄入功能時,把很多數(shù)據(jù)檢驗放到客戶端,對于每個用戶而言,其計算機只承擔自身的工作,若將大量的數(shù)據(jù)檢驗都放到服務器端,其要承擔很大的壓力,占用很多服務器和網(wǎng)絡(luò)資源。所以客戶端與服務器大量交互式的最佳優(yōu)化模式就是客戶端校驗的效率與易用的最佳結(jié)合,以及盡量減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸。
配置性能高配的服務器,為系統(tǒng)提供高質(zhì)量硬件平臺;配置智能三層交換機,保證網(wǎng)絡(luò)高效、穩(wěn)定運行。
隨著計算機軟硬技術(shù)的迅猛發(fā)展,系統(tǒng)開發(fā)的軟硬環(huán)境也越來越復雜,如今系統(tǒng)開發(fā)模式已發(fā)展成了多用戶的網(wǎng)絡(luò)模式,在網(wǎng)絡(luò)模式下的多用戶系統(tǒng)開發(fā)過程中,編程技巧的使用不僅是高效系統(tǒng)開發(fā)的基礎(chǔ),更是系統(tǒng)高效運行的保障。