左 娜
(天津鋼鐵集團(tuán)有限公司煉鋼廠,天津300301)
Oracle數(shù)據(jù)庫是當(dāng)前應(yīng)用最為廣泛的大型關(guān)系數(shù)據(jù)庫之一,其性能直接關(guān)系到整個應(yīng)用系統(tǒng)的運行效率,在現(xiàn)代化的冶金企業(yè)得到了充分的應(yīng)用,引起信息化數(shù)據(jù)維護(hù)人員對其性能優(yōu)化的高度重視。天津鋼鐵集團(tuán)有限公司煉鋼廠的二級系統(tǒng),無論是轉(zhuǎn)爐區(qū)域還是連鑄區(qū)域應(yīng)用的都是Oracle9i數(shù)據(jù)庫,所以本文以O(shè)racle數(shù)據(jù)庫在轉(zhuǎn)爐區(qū)域的應(yīng)用為例,進(jìn)行分析研究。
在轉(zhuǎn)爐區(qū)域的二級系統(tǒng)中,現(xiàn)場數(shù)據(jù)采集采取直接與PLC通訊,讀取PLC原始數(shù)據(jù),并根據(jù)采集到的數(shù)據(jù)進(jìn)行邏輯判斷,對生產(chǎn)狀態(tài)進(jìn)行判斷,根據(jù)不同的工藝過程進(jìn)行生產(chǎn)信息整合存檔,將整合好的數(shù)據(jù)存儲到服務(wù)器的數(shù)據(jù)庫中。根據(jù)現(xiàn)場生產(chǎn)的需要,各個工位都有二級客戶端進(jìn)行現(xiàn)場顯示生產(chǎn)狀態(tài),分布圖見圖1。
當(dāng)二級系統(tǒng)中頻繁調(diào)用生產(chǎn)數(shù)據(jù),大量的數(shù)據(jù)交換使數(shù)據(jù)存儲出現(xiàn)響應(yīng)速度慢或無反映,二級客戶端不能及時準(zhǔn)確地顯示現(xiàn)場生產(chǎn)狀況,影響調(diào)度人員對現(xiàn)場的生產(chǎn)節(jié)奏的掌控,影響生產(chǎn)。所以,一個性能良好的數(shù)據(jù)庫后臺對于二級系統(tǒng)極其重要,同時,對于數(shù)據(jù)庫系統(tǒng)優(yōu)化也是數(shù)據(jù)庫維護(hù)人員的重要職責(zé),筆者結(jié)合工作中遇到的問題進(jìn)行解決和歸納,提出幾種數(shù)據(jù)庫優(yōu)化的簡單而有效的方法。
圖1 數(shù)據(jù)通訊分布圖
如轉(zhuǎn)爐二級系統(tǒng)的合金上料部分,一個生產(chǎn)爐次需要多次添加合金料,每次的加料數(shù)據(jù)(合金料名稱和添加重量及添加時間)都需要存儲在數(shù)據(jù)庫中,并以熔煉號為關(guān)鍵字進(jìn)行查詢匯總,在二級客戶端對工藝人員進(jìn)行顯示。對于該功能數(shù)據(jù)庫后臺數(shù)據(jù)結(jié)構(gòu)設(shè)計部分,有兩種方法進(jìn)行實現(xiàn)。
一種可以在建合金加料(BOF_ALLOY_PROD)表中,建立多個合金料名稱(MAT_name)及其對應(yīng)重 量 的 字 段 (MAT_weight), 如 MAT_name_i、MAT_weight_i(i=1……n),即每一爐的投料只有一條加料數(shù)據(jù);對于這種表結(jié)構(gòu)就需要設(shè)計人員對于生產(chǎn)過程中添加合金料的次數(shù)有所了解和預(yù)估值,因為表結(jié)構(gòu)固定后,對于添加合金料的次數(shù)就會由數(shù)據(jù)庫表結(jié)構(gòu)的字段約束,對于少于表字段定義的次數(shù)的合金添加數(shù)據(jù)都會進(jìn)行記錄,相反,超出數(shù)據(jù)結(jié)構(gòu)定義部分會無法記錄,對于生產(chǎn)過程中,出現(xiàn)異常多次添加合金料的數(shù)據(jù)就會丟失。對于這種數(shù)據(jù)結(jié)構(gòu)定義的優(yōu)點,就是數(shù)據(jù)查詢響應(yīng)速度快,數(shù)據(jù)庫負(fù)載小,對于現(xiàn)場越多處調(diào)用數(shù)據(jù)時優(yōu)勢顯示的越明顯。
另一種可以在建合金加料(BOF_ALLOY_PROD)表中,建立一個合金料名稱(MAT_name)及其記錄重量的字段(MAT_weight),也就是每投一次料就生成條數(shù)據(jù)記錄,就是在冶煉一爐鋼水的過程中,會出現(xiàn)多條添加合金料的生產(chǎn)數(shù)據(jù)。對于這種數(shù)據(jù)結(jié)構(gòu),對于生產(chǎn)過程中的添加次數(shù)沒有定值約束,只要生產(chǎn)就會生成一條記錄存入數(shù)據(jù)庫。兩種表達(dá)式列表見表1。
數(shù)據(jù)庫的設(shè)計人員對于數(shù)據(jù)庫的需求分析,必須準(zhǔn)確地反映用戶的實際要求,其結(jié)果將直接影響到數(shù)據(jù)庫后面各個階段的設(shè)計,及設(shè)計結(jié)果是否合理和實用。對于這兩種的數(shù)據(jù)表結(jié)構(gòu)各有利弊,數(shù)據(jù)庫設(shè)計人員應(yīng)根據(jù)現(xiàn)場的生產(chǎn)工藝及數(shù)據(jù)存儲,及其數(shù)據(jù)在應(yīng)用過程中的調(diào)用情況進(jìn)行取舍。
表1 兩種表達(dá)式列表
數(shù)據(jù)庫的設(shè)計人員在數(shù)據(jù)庫的設(shè)計過程中最經(jīng)常犯的錯誤是:表結(jié)構(gòu)和索引設(shè)計時,使表與索引共建在一個表空間中。在數(shù)據(jù)量不是很大,查詢不頻繁的時候,數(shù)據(jù)庫的設(shè)計缺點就不會暴露出來。但是在煉鋼廠二級系統(tǒng)中,轉(zhuǎn)爐區(qū)域的數(shù)據(jù)收集,尤其是轉(zhuǎn)爐傾角和氧槍高度的數(shù)據(jù)表,每5 s就有一條記錄入庫,生產(chǎn)一爐鋼水就會有千條左右記錄,每天生產(chǎn)按40爐計算就會有4萬的記錄,數(shù)據(jù)庫數(shù)據(jù)的歸檔保留時間是6個月,每個月按30天計算,數(shù)據(jù)庫中的數(shù)據(jù)量就達(dá)到了720萬條記錄,如果數(shù)據(jù)表僅僅是存放數(shù)據(jù),數(shù)據(jù)庫的設(shè)計缺陷不明顯,但是現(xiàn)場就有二級程序是槍位圖和轉(zhuǎn)爐傾角圖,根據(jù)時間進(jìn)行繪圖,這就需要頻繁地從數(shù)據(jù)庫中調(diào)用查詢數(shù)據(jù),就會發(fā)現(xiàn)數(shù)據(jù)的查詢速度很慢,而且會爆出“程序出錯,錯誤編號:-12535,錯誤描述ORA-12535:TNS:操作超時”的錯誤。產(chǎn)生問題的根本原因是數(shù)據(jù)查詢的時間超長,不能及返回查詢數(shù)據(jù)結(jié)果,使前臺的運行程序沒有響應(yīng)、掛掉。在ER關(guān)系上,這種表和索引共在一個表空間,設(shè)計并不存在缺陷,但是在應(yīng)用時,這成為了一大弊病,解決的方法就是將表數(shù)據(jù)和索引數(shù)據(jù)分開表空間存儲進(jìn)行優(yōu)化:
指定表數(shù)據(jù)及索引數(shù)據(jù)存儲表空間SQL語法語句最簡單的形式如下:
數(shù)據(jù)庫表名稱:BOF_TURNING_PROD
索引名稱:INDEX_BOF_TURNING_PROD
將表數(shù)據(jù)存儲在L2_BOF_DATA表空間里:
通常情況下,簡單的索引經(jīng)常用于掃描小表來提高數(shù)據(jù)查詢效率,但在聯(lián)結(jié)多個表時需要建立復(fù)合鍵索引來提高數(shù)據(jù)庫檢索效率。
在生產(chǎn)過程中,煉鋼區(qū)域的數(shù)據(jù)一般情況下都是以轉(zhuǎn)爐的熔煉號為主的相關(guān)數(shù)據(jù)存儲,對于每一爐的生產(chǎn)過程中添加的散裝料、合金數(shù)據(jù)、吹氧量、吹氬量等進(jìn)行統(tǒng)計。對于合金數(shù)據(jù)的查詢就需要建立復(fù)合索引。
轉(zhuǎn)爐合金投入實績表(BOF_Alloy_Prod)中包含字段:熔煉號HTNO;添加時間Time_Add;合金料倉號 Alloy_BUNKER_NO ;合金重量 Alloy_weight;
轉(zhuǎn)爐合金料倉對應(yīng)表(BOF_Alloy_list)中包含的字段:合金料倉號Alloy_BUNKER_NO;合金名稱Alloy_name;
實現(xiàn)功能:按爐次(熔煉號為9999999)對合金投料數(shù)據(jù)進(jìn)行搜索、顯示:熔煉號HTNO;合金料名稱 Alloy_name;合金重量 Alloy_weight;
執(zhí)行的SQL語句為:selectHTNO,Alloy_name,Alloy_weigh from BOF_Alloy_Prod,BOF_Alloy_listwhereHTNO=9999999 and BOF_Alloy_Prod.Alloy_BUNKER_NO=BOF_Alloy_list.Alloy_BUNKER_NO
雖然在數(shù)據(jù)庫中使用索引能提高查詢效率,但是數(shù)據(jù)庫的維護(hù)人員必須注意使用索引的利弊。索引不僅需要占用空間來存儲(建議存儲索引與表數(shù)據(jù)不在同一表空間),也需要定期維護(hù)。在數(shù)據(jù)庫的應(yīng)用過程中,表數(shù)據(jù)數(shù)據(jù)記錄經(jīng)常會根據(jù)系統(tǒng)應(yīng)用需要被增減修改或修改索引列,同時索引也會被修改可能產(chǎn)生碎片,影響數(shù)據(jù)庫性能。在許可的條件下,也可以階段性地執(zhí)行truncate命令刪除表中所有記錄,同時刪除索引碎片。對于數(shù)據(jù)表進(jìn)行刪除或truncate表后,要及時對索引重建,提高數(shù)據(jù)庫性能。
執(zhí)行語句:
TRUNCATE Table表名;
ALTER INDEX索引名REBUILD表空間名稱。
Oracle數(shù)據(jù)庫系統(tǒng)性能優(yōu)化與調(diào)整是一個復(fù)雜、繁瑣的系統(tǒng)工程,貫穿于數(shù)據(jù)庫系統(tǒng)開發(fā)的整個過程。當(dāng)然,對于數(shù)據(jù)應(yīng)用(數(shù)據(jù)查詢、修改、添加、刪除)時,細(xì)節(jié)處理(SQL語句的應(yīng)用)對數(shù)據(jù)庫性能也會有很大的影響。數(shù)據(jù)庫的性能優(yōu)化方法還有許多,需要在工作中不斷地實踐應(yīng)用。本文只是根據(jù)在現(xiàn)場的二級系統(tǒng)長時間運行維護(hù)的工作中,對于一些最常見的二級系統(tǒng)問題進(jìn)行歸納,總結(jié)出這幾種最直接有效的解決問題方法。
[1]騰永昌.Oracle9i數(shù)據(jù)庫管理員使用大全[M].北京:清華大學(xué)出版社,2005:766-778.
[2]Ault M.Oracle數(shù)據(jù)庫管理與維護(hù)技術(shù)手冊[M].北京:清華大學(xué)出版社,2003:595-663.
[3]Lawson C.Oracle性能優(yōu)化科學(xué)與藝術(shù)[M].北京:清華大學(xué)出版社,2006.
[4]蓋國強,馮春培.Oracle數(shù)據(jù)庫性能優(yōu)化[M].北京:人民郵電出版社,2006.
[5]柳丹.Oracle PL/SQL面向?qū)ο筇匦訵eb應(yīng)用研究[J].計算機技術(shù)與發(fā)展,2006,16(1):234-237.
[6]蘇淑文,翁敬農(nóng).Oracle系統(tǒng)異構(gòu)環(huán)境下的信息集成[J].計算機技術(shù)與發(fā)展,2007,17(3):128-131.
[7]杜志源,劉剛,王永智.高校教務(wù)管理系統(tǒng)數(shù)據(jù)庫性能優(yōu)化的研究[J].計算機工程與設(shè)計,2007(20):5066-5068.