昝汝濤,薛 兵,尹 強
?
“軍衛一號”門診醫師站重建數據庫索引的設計與探討
昝汝濤,薛兵,尹強
[關鍵詞]軍衛一號;門診醫師站;數據庫;索引
筆者所在醫院“軍字一號”門診醫師站子系統于2010年正式啟用,在日常醫療活動中占據舉足輕重的作用,有效地規范了門急診業務,縮短了患者的候診時間,提高了門急診工作效率。結合醫院門急診醫師反映門診醫師站系統在調取患者歷史處方、門診病歷及患者就診序列時反應較慢的問題,筆者從實踐出發通過大量測試認為,使用創建門診醫師站的數據庫索引可提升“軍衛一號”門診醫師站的速率。
1.1門診醫師站存在的主要問題通過門急診醫師的反映以及筆者實際的測試發現,困擾醫院門診醫師站速度慢的問題主要存在三個方面。第一,門急診醫師在調取患者歷史處方時效率較低,數據庫延遲較大。第二,調取患者門診病歷時數據庫延遲較大。第三,門急診醫師站在讀取門急診患者就診序列時延遲較大。
1.2創建索引的優勢通過多年對“軍衛一號”信息化了解及大量工作實踐,筆者發現創建索引可以大大提高系統的性能。優勢主要有以下方面:(1)通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性;(2)可以大大加快數據的檢索速度;(3)可以加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義;(4)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間;(5)通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。那么,通過創建數據庫索引能不能優化門診醫師站的性能呢?帶著這個問題筆者考慮在門診醫師(OutpDoct)用戶下面重建所有索引,看能否解決醫院門診醫師站所面臨的問題。
根據醫院的實際情況,在醫院備用HIS服務器上做測試,將在線數據庫的冷備份文件拷貝過來,作為備用數據庫。
2.1分析門診醫師站的表結構創建索引的第一步首先要將門診醫師站的表結構了解清楚。理清門診醫師站(OutpDoct)用戶下相關的表及各表之間的關聯。主要涉及原始表包括:
OutpDoct.outp_mr
OutpDoct.outp_orders
OutpDoct.outp_orders_costs
OutpDoct.outp_presc
OutpDoct.outp_treat_rec
OutpDoct.outp_orders_t
OutpDoct.outp_wait_queue
2.2導出門診歷史數據近年來,隨著醫院門診量的不斷增加,門診醫師站表空間也在不斷擴增,門診醫師站相關表中的記錄也在成倍增長,數據的增加也會影響到門診醫師站使用速度。筆者將門診醫師站(OutpDoct)用戶下所涉及的原始表中指定時間段的記錄導出到相應臨時表中,再將臨時表中數據做導出(Exp)操作,然后把指定時間段內的數據刪除。
2.3列出詳細的升級計劃和步驟在實驗服務器上進行模擬操作,同時要注意數據結構改變也是一項復雜的任務,一定要謹慎認真,通過實驗既能及時發現問題,也能熟悉轉換過程。
3.1斷開數據庫服務器與用戶之間連接斷開用戶的連接,在對數據庫操作的時候要避免用戶對數據的修改,最簡單的辦法就是斷開服務器的網線。
3.2冷備份在線數據庫冷備份數據庫無論在實驗服務器上升級是否順利,都需要在準備升級前對在線服務器做一次全庫冷備份,一旦出現什么異常情況,至少可以恢復到升級前的狀態,這一點切記。
3.3利用批處理命令文件完成升級工作為了保證升級步驟的連續性,筆者使用批處理命令的方式來完成此次操作,首先將歷史數據備份到臨時表,然后做Exp導出操作。
3.4導出相關表的列表文件導出相關表的列表文件,將導出的記錄數做相應的備份。
outdoct_bak_exp.lst命令如下:
userid=outpdoct/outpdoct
grants=n
indexes=n
rows=y
tables=(outp_mr_bak,
outp_orders_bak,
outp_orders_costs_bak,
outp_presc_bak,
outp_treat_rec_bak,
outp_orders_t_bak)
3.5保存創建的臨時表將保存的臨時表作為數據恢復原始表,以保證數據恢復完整性。
outpdoct_re.sql命令如下:
connectoutpdoct/outpdoct
insert into outpdoct.outp_mr
select*
fromoutp_mr_bak;
commit;
3.6重建用戶下所有索引在門診醫師(outpdoct)用戶下面重建所有索引,以消除索引碎片,提高門診醫師站系統的性能。
3.7查看生成的Log日志文件導出歷史數據及建立索引工作完成后,查看重建日志.Log文件,未發現錯誤,說明以上工作都是成功的。
上述工作完成后,立即測試門診醫師站速度,發現門診醫師站速率大幅提升,困擾工作的問題完全解決。索引重建過程中要與門診部做好溝通工作,及時反饋門診醫師站在索引重建后出現的問題,還要密切關注全院“軍衛一號”其他系統的運行情況,發現問題及時解決。
雖然索引有許多優點,但是為表中的每一個列都增加索引,是非常不明智的。因為:(1)創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加;(2)索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大;(3)當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
一般來說,下列情況不應該創建索引:(1)對于那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。(2)對于那些只有很少數據值的列也不應該增加索引。這是因為,由于這些列的取值很少增加索引,并不能明顯加快檢索速度。(3)對于那些定義為text,image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少。(4)當修改性能遠遠大于檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。所以,在創建數據庫索引時要充分考慮上述的問題,充分發揮數據庫索引在數據庫中的作用。
參考文獻
[1]孫永寧.提高查詢效率的oracle索引優化策略探析[J].電子技術與軟件工程,2013,18(2):229.
[2]馬斌,鐘方偉,余長江,等.數據庫索引對象優化方法分析與應用[J].電腦知識與技術,2014(31):7241-7243.
[3]劉超.探討索引技術在ORACLE數據庫中的運用問題[J].信息與電腦:理論版,2014,12(1):81-82.
[4]于彥國. Oracle數據庫應用系統的性能優化[J].電子技術與軟件工程,2015,21(2):214-215.
[2015-10-12收稿,2015-11-10修回]
[本文編輯:王軍紅]
[中圖分類號]R197.324
[文獻標志碼]B
DOI:10.14172/j.issn1671-4008.2016.05.035
[作者單位]261021山東濰坊,解放軍89醫院(昝汝濤,薛兵,尹強)