伍 峰
(中國鐵路總公司 信息技術中心,北京 100844)
鐵路貨運站生產管理信息系統(以下簡稱貨運站系統)在上海閔行車站試運行的一段時間內,隨著歷史數據的積累,各種業務的增多,系統運行速度逐漸減慢,響應時間逐漸增長,效率變低,穩定性變差。為有效地解決上述問題,本文詳細分析了常用的Oracle數據庫優化技術,結合貨運站系統的數據庫特點有針對性地研究了數據庫的升級、完善與優化策略,通過采取數據庫優化技術,貨運站系統的運行狀況得到了很大的改善,進一步驗證了數據庫優化方法的可行性,為貨運站系統的進一步推廣和實施奠定了基礎。
為高效率使用數據庫,在確保功能的同時,應用程序的設計應盡量把握如下原則:(1)盡量減少應用程序與數據庫的交互頻率;(2)注意應用程序中對數據庫操作的提交與回滾,避免數據表的鎖死;(3)減少與數據庫交互過程中網絡傳輸的數據量;(4)盡可能地多重復利用客戶端與數據庫的連接池,避免資源浪費;(5)設計時要考慮CPU及內存的開銷情況;(6)應用程序最好不使用數據庫游標。
數據庫表空間是一個邏輯結構,是Oracle數據庫信息物理存儲的一個邏輯視圖,它和操作系統一樣是不可見的。在數據庫設計階段,需要注意以下幾點:(1)SYSTEM表空間用于存放Oracle系統的有關信息,為提高數據庫效率,可適當增加SYSTEM表空間大小,并避免一般用戶將對象建立在SYSTEM表空間上;(2)對于Oracle數據庫的應用系統,都應該為其創建對應的數據庫用戶、數據表空間、索引表空間和臨時表空間;(3)隨著系統的運行,數據量增長,數據表空間會產生碎塊,影響Oracle數據庫性能,所以應定期檢查數據庫表空間的使用情況;(4)為提高數據庫數據的遷移速度,在遷移Oracle數據庫數據時,設置表空間為“快速更新,不生成重做日志且不可恢復”狀態,待數據遷移完成后,再將表空間設置成“生成重做日志且不可恢復”。
“中間表”指中間數據表,合理的設計中間數據表在優化數據庫的過程中非常必要。一方面,前臺應用程序操作與后臺數據庫處理之間的中間數據表,有利于提高數據庫效率。(1)當應用程序某個特定操作需要觸發數據庫多個表發生變化時,可設計中間數據表記錄前臺操作,利用數據庫存儲過程和觸發器等數據庫程序分析中間表中的記錄,從而觸發相關多個表的變化。(2)當多個客戶端的應用程序需要同時訪問數據庫同一張表并進行各種操作時,應用程序將每個客戶端的訪問記錄在中間表內,后臺數據庫程序通過分析中間表的內容,按順序逐個對目標表執行相應操作,在保證高效地同時,避免邏輯沖突。
另一方面,系統與系統之間的中間信息共享表,有利于提高系統安全和可靠性。當多個系統需要共享數據時,可使用中間表存儲接口信息,系統之間只需訪問中間表就可以實現信息的共享。
數據庫索引的原理非常簡單,但在復雜的數據表中正確使用索引卻不是易事,需要多方面全面考慮,并且具體問題具體分析。在創建數據庫索引時,需要考慮下列原則:(1)將索引和數據表建立在不同的表空間上,從而提高數據庫效率;(2)盡可能最大限度地發揮索引的作用,保證創建的索引經常應用于WHERE子句中;(3)對于數據查詢頻繁的大型分區表,根據分區創建的分區索引會影響查詢效率;(4)對于頻繁插入和更新的數據表,索引越多系統CPU和I/O的負擔就越重,所以每張表盡可能不要超過5個索引;(5)創建好索引后,盡量避免改變索引列的類型。
SQL語句的效率直接影響了數據庫的性能,可通過以下幾個方面對SQL語句進行優化:(1)減少對數據庫的查詢次數,可以減少對數據庫系統資源的請求。具體可通過快照和顯形圖等分布式數據庫對象實現;(2)從WHERE子句、SELECT子句和數據庫函數等方面入手,提升SQL語句處理速度;(3)盡量減少DISTINCT,U NION,MINUS,INTERSECT,ORDER BY等耗費數據庫資源的使用;(4)去除不必要的大型表的全表掃描,緩存小型表的全表保存。
2.1.1 表空間設計
創建Oracle數據庫后,適當擴充SYSTEM表空間的容量,根據業務數據量分析,為貨運站系統分別創建獨立的數據表空間、臨時表空間和索引表空間。
2.1.2 將多個數據庫服務器的用戶整合至1臺服
務器上
梳理貨運站系統涉及到的所有數據庫用戶,對用戶性質及作用進行分類,將功能相似的用戶進行合并,將分散在不同數據庫服務器上的用戶遷移至同一臺數據庫服務器,刪除大量不必要的數據鏈路,簡化相對應的視圖。
2.1.3 將多個用戶下的對象整合至一個用戶下
對于貨運站系統使用的其他數據庫用戶對象,通過賦權、創建同義詞、視圖等方式,整合至貨運站系統的數據庫用戶下。這樣,前臺應用程序對其它用戶對象的訪問只需訪問貨運站系統數據庫用戶即可實現。
2.1.4 合理創建索引
根據數據表中數據量大小,采取不同策略,為貨運資源動作表、系統參數表等數據量小的表創建主鍵;為運單表、裝載清單表、貨運裝卸七甲表等數據量非常大的表增加索引。根據字段使用頻率,將運單填報日期、裝卸車時間、車站電報碼等經常作為連接條件、篩選條件、聚合查詢、排序的字段建成索引。把運單號、發站、填報日期等經常一起出現的字段組合在一起,組成組合索引。
2.1.5 利用數據庫編程實現復雜業務邏輯
數據庫程序包括數據庫存儲過程、觸發器和函數。將復雜業務邏輯通過數據庫程序實現可以減少與數據庫交互過程中的網絡流量,并能更充分地利用數據庫的預編譯和緩存功能。貨運站系統中,通過編寫存儲過程程序實現貨報一、貨報二、貨報三的統計功能;通過編寫觸發器程序實現貨場資源數據同步功能;通過編寫函數程序和定時任務實現外部接口數據共享的功能。
2.1.6 合理利用視圖
貨運站系統中,存在大量復雜的查詢需求,諸如貨物、清單、車輛、貨區貨位等信息的關聯查詢。進行數據庫優化時,將客戶端程序中這些復雜的查詢語句前移至數據庫,通過視圖實現,這樣客戶端程序只需查詢相應視圖即可。
2.1.7 優化SQL語句
(1)根據Oracle采用自下而上順序解析WHERE子句的原理,優化SQL語句中的WHERE子句;(2)盡可能使用DECODE等高效數據庫函數,減少處理時間;(3)檢查所有的SQL語句,用TRUNCATE語句替代DELETE語句,減少數據庫資源的調用,縮短執行時間;(4)根據業務需要,修改了低效的全表掃描查詢語句;(5)查詢語句中最大限度地使用創建的索引。
創建中間表并編寫數據庫程序實現貨運站系統貨場資源管理的功能。具體過程,如圖1所示。

圖1 中間表處理流程
根據業務需求,分析貨運站系統與其它系統的關系,設計共享用戶,創建中間數據表,實現貨運站系統、計劃系統和現車系統的信息共享。各個系統不是直接訪問其它系統的數據庫,而是通過同義詞和視圖等方式只對數據庫共享用戶下的中間表進行操作。這樣,大大提升了貨運站系統數據庫的穩定性和安全性。
針對減少數據量,提高數據庫訪問效率的優化,區別于貨運站系統運行時連接的生產用戶,創建對應的歷史用戶,利用存儲過程和定時任務,將一段時期內重要的歷史數據定時備份至歷史用戶下,并根據自身需求,定時刪除歷史用戶下不需要的垃圾數據,如圖2所示。
在優化貨運站系統數據庫,提高數據庫效率的過程中,采用了許多存儲過程、觸發器、函數等數據庫程序,這些程序在后臺運行,不易觀測運行狀態,不能及時發現運行時出現的問題。通過編寫程序并優化已有的存儲過程對數據流轉關鍵環節的數據庫程序進行監控,將出現問題的SQL代碼,SQL錯誤信息等內容保存至監控表,并由客戶端程序展示在前臺頁面上,便于維護。
通過以上幾方面對貨運站系統Oracle數據庫的優化工作,解決了不斷增大的數據量對系統造成的影響,提升了貨運站系統的運行速度,使后臺數據庫的結構更加清晰,系統運行更加高效,維護更加便利。貨運站系統數據庫的優化充分發揮Oracle數據庫的高效性,不僅提升了單個車站數據庫的使用效率,而且為今后多個車站快速而又互不干擾地共享同一數據庫打下了堅實的基礎。
[1] 王 珊,陳 紅.數據庫系統原理教程[M].北京:清華大學出版社,2002,6.
[2] 文 平. Oracle數據庫性能優化的藝術[M]. 北京:機械工業出版社,2012,7.
[3] Craig S.Mullins.數據庫管理一實踐與過程[M].李天柱,任建利,肖艷芹,譯.北京:電子工業出版社,2003,5.
[4] Ryan K.Stephens,Ronald R.Plew.SQL自學通[M].北京:機械工業出版社,1998,10.