左 娜
(天津鋼鐵集團有限公司煉鋼廠,天津300301)
Oracle數據庫是當前應用最為廣泛的大型關系數據庫之一,其性能直接關系到整個應用系統的運行效率,在現代化的冶金企業得到了充分的應用,引起信息化數據維護人員對其性能優化的高度重視。天津鋼鐵集團有限公司煉鋼廠的二級系統,無論是轉爐區域還是連鑄區域應用的都是Oracle9i數據庫,所以本文以Oracle數據庫在轉爐區域的應用為例,進行分析研究。
在轉爐區域的二級系統中,現場數據采集采取直接與PLC通訊,讀取PLC原始數據,并根據采集到的數據進行邏輯判斷,對生產狀態進行判斷,根據不同的工藝過程進行生產信息整合存檔,將整合好的數據存儲到服務器的數據庫中。根據現場生產的需要,各個工位都有二級客戶端進行現場顯示生產狀態,分布圖見圖1。
當二級系統中頻繁調用生產數據,大量的數據交換使數據存儲出現響應速度慢或無反映,二級客戶端不能及時準確地顯示現場生產狀況,影響調度人員對現場的生產節奏的掌控,影響生產。所以,一個性能良好的數據庫后臺對于二級系統極其重要,同時,對于數據庫系統優化也是數據庫維護人員的重要職責,筆者結合工作中遇到的問題進行解決和歸納,提出幾種數據庫優化的簡單而有效的方法。

圖1 數據通訊分布圖
如轉爐二級系統的合金上料部分,一個生產爐次需要多次添加合金料,每次的加料數據(合金料名稱和添加重量及添加時間)都需要存儲在數據庫中,并以熔煉號為關鍵字進行查詢匯總,在二級客戶端對工藝人員進行顯示。對于該功能數據庫后臺數據結構設計部分,有兩種方法進行實現。
一種可以在建合金加料(BOF_ALLOY_PROD)表中,建立多個合金料名稱(MAT_name)及其對應重 量 的 字 段 (MAT_weight), 如 MAT_name_i、MAT_weight_i(i=1……n),即每一爐的投料只有一條加料數據;對于這種表結構就需要設計人員對于生產過程中添加合金料的次數有所了解和預估值,因為表結構固定后,對于添加合金料的次數就會由數據庫表結構的字段約束,對于少于表字段定義的次數的合金添加數據都會進行記錄,相反,超出數據結構定義部分會無法記錄,對于生產過程中,出現異常多次添加合金料的數據就會丟失。對于這種數據結構定義的優點,就是數據查詢響應速度快,數據庫負載小,對于現場越多處調用數據時優勢顯示的越明顯。
另一種可以在建合金加料(BOF_ALLOY_PROD)表中,建立一個合金料名稱(MAT_name)及其記錄重量的字段(MAT_weight),也就是每投一次料就生成條數據記錄,就是在冶煉一爐鋼水的過程中,會出現多條添加合金料的生產數據。對于這種數據結構,對于生產過程中的添加次數沒有定值約束,只要生產就會生成一條記錄存入數據庫。兩種表達式列表見表1。
數據庫的設計人員對于數據庫的需求分析,必須準確地反映用戶的實際要求,其結果將直接影響到數據庫后面各個階段的設計,及設計結果是否合理和實用。對于這兩種的數據表結構各有利弊,數據庫設計人員應根據現場的生產工藝及數據存儲,及其數據在應用過程中的調用情況進行取舍。

表1 兩種表達式列表
數據庫的設計人員在數據庫的設計過程中最經常犯的錯誤是:表結構和索引設計時,使表與索引共建在一個表空間中。在數據量不是很大,查詢不頻繁的時候,數據庫的設計缺點就不會暴露出來。但是在煉鋼廠二級系統中,轉爐區域的數據收集,尤其是轉爐傾角和氧槍高度的數據表,每5 s就有一條記錄入庫,生產一爐鋼水就會有千條左右記錄,每天生產按40爐計算就會有4萬的記錄,數據庫數據的歸檔保留時間是6個月,每個月按30天計算,數據庫中的數據量就達到了720萬條記錄,如果數據表僅僅是存放數據,數據庫的設計缺陷不明顯,但是現場就有二級程序是槍位圖和轉爐傾角圖,根據時間進行繪圖,這就需要頻繁地從數據庫中調用查詢數據,就會發現數據的查詢速度很慢,而且會爆出“程序出錯,錯誤編號:-12535,錯誤描述ORA-12535:TNS:操作超時”的錯誤。產生問題的根本原因是數據查詢的時間超長,不能及返回查詢數據結果,使前臺的運行程序沒有響應、掛掉。在ER關系上,這種表和索引共在一個表空間,設計并不存在缺陷,但是在應用時,這成為了一大弊病,解決的方法就是將表數據和索引數據分開表空間存儲進行優化:
指定表數據及索引數據存儲表空間SQL語法語句最簡單的形式如下:
數據庫表名稱:BOF_TURNING_PROD
索引名稱:INDEX_BOF_TURNING_PROD
將表數據存儲在L2_BOF_DATA表空間里:


通常情況下,簡單的索引經常用于掃描小表來提高數據查詢效率,但在聯結多個表時需要建立復合鍵索引來提高數據庫檢索效率。
在生產過程中,煉鋼區域的數據一般情況下都是以轉爐的熔煉號為主的相關數據存儲,對于每一爐的生產過程中添加的散裝料、合金數據、吹氧量、吹氬量等進行統計。對于合金數據的查詢就需要建立復合索引。
轉爐合金投入實績表(BOF_Alloy_Prod)中包含字段:熔煉號HTNO;添加時間Time_Add;合金料倉號 Alloy_BUNKER_NO ;合金重量 Alloy_weight;
轉爐合金料倉對應表(BOF_Alloy_list)中包含的字段:合金料倉號Alloy_BUNKER_NO;合金名稱Alloy_name;
實現功能:按爐次(熔煉號為9999999)對合金投料數據進行搜索、顯示:熔煉號HTNO;合金料名稱 Alloy_name;合金重量 Alloy_weight;
執行的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
雖然在數據庫中使用索引能提高查詢效率,但是數據庫的維護人員必須注意使用索引的利弊。索引不僅需要占用空間來存儲(建議存儲索引與表數據不在同一表空間),也需要定期維護。在數據庫的應用過程中,表數據數據記錄經常會根據系統應用需要被增減修改或修改索引列,同時索引也會被修改可能產生碎片,影響數據庫性能。在許可的條件下,也可以階段性地執行truncate命令刪除表中所有記錄,同時刪除索引碎片。對于數據表進行刪除或truncate表后,要及時對索引重建,提高數據庫性能。
執行語句:
TRUNCATE Table表名;
ALTER INDEX索引名REBUILD表空間名稱。
Oracle數據庫系統性能優化與調整是一個復雜、繁瑣的系統工程,貫穿于數據庫系統開發的整個過程。當然,對于數據應用(數據查詢、修改、添加、刪除)時,細節處理(SQL語句的應用)對數據庫性能也會有很大的影響。數據庫的性能優化方法還有許多,需要在工作中不斷地實踐應用。本文只是根據在現場的二級系統長時間運行維護的工作中,對于一些最常見的二級系統問題進行歸納,總結出這幾種最直接有效的解決問題方法。
[1]騰永昌.Oracle9i數據庫管理員使用大全[M].北京:清華大學出版社,2005:766-778.
[2]Ault M.Oracle數據庫管理與維護技術手冊[M].北京:清華大學出版社,2003:595-663.
[3]Lawson C.Oracle性能優化科學與藝術[M].北京:清華大學出版社,2006.
[4]蓋國強,馮春培.Oracle數據庫性能優化[M].北京:人民郵電出版社,2006.
[5]柳丹.Oracle PL/SQL面向對象特性Web應用研究[J].計算機技術與發展,2006,16(1):234-237.
[6]蘇淑文,翁敬農.Oracle系統異構環境下的信息集成[J].計算機技術與發展,2007,17(3):128-131.
[7]杜志源,劉剛,王永智.高校教務管理系統數據庫性能優化的研究[J].計算機工程與設計,2007(20):5066-5068.