唐山 李娟
(四川省計(jì)算機(jī)研究院 四川省成都市 610041)
隨著醫(yī)院信息系統(tǒng)(Hospital Information System,以下簡(jiǎn)稱HIS 系統(tǒng))使用年份的增長(zhǎng),用戶數(shù)據(jù)的不斷積累,病人處方清單數(shù)據(jù)的不斷增加,若不對(duì)HIS 系統(tǒng)中的業(yè)務(wù)單據(jù)查詢采取進(jìn)一步的優(yōu)化措施,則在使用過(guò)程中,HIS 系統(tǒng)可能會(huì)出現(xiàn)業(yè)務(wù)單據(jù)數(shù)據(jù)查詢時(shí)間等待過(guò)長(zhǎng)、頁(yè)面無(wú)反應(yīng)、功能使用出現(xiàn)“卡死”等現(xiàn)象,嚴(yán)重影響醫(yī)院用戶在相關(guān)單據(jù)處理環(huán)節(jié)的使用體驗(yàn)。
本文主要根據(jù)醫(yī)院業(yè)務(wù)單據(jù)數(shù)據(jù)存儲(chǔ)和檢索的實(shí)際情況,并結(jié)合業(yè)務(wù)單據(jù)相關(guān)特點(diǎn)(單據(jù)主要由單據(jù)整體信息和明細(xì)信息構(gòu)成),設(shè)計(jì)出一種“業(yè)務(wù)單據(jù)包”的業(yè)務(wù)單據(jù)查詢的優(yōu)化方法,用于提升HIS 系統(tǒng)業(yè)務(wù)單據(jù)數(shù)據(jù)查詢性能和頁(yè)面加載效率。
本文中使用的名詞定義:
退藥單:門診或住院患者,退藥的單據(jù),該單據(jù)包括單據(jù)整體信息(如:病人信息、藥品信息、費(fèi)用總額信息、制單信息、審核信息等)和明細(xì)信息(藥品名稱、規(guī)格、劑型、數(shù)量、單價(jià)、小計(jì)等),且具有審核流程。
退費(fèi)單:門診患者退費(fèi)的業(yè)務(wù)單據(jù),該單據(jù)包括單據(jù)整體信息(如:病人信息、藥品信息、費(fèi)用總額信息、制單信息、審核信息等)和明細(xì)信息(藥品名稱、規(guī)格、劑型、數(shù)量、單價(jià)、小計(jì)等),且具有審核流程。同時(shí)門診退費(fèi)單可由退藥單直接生成(庫(kù)房未發(fā)藥時(shí))。
住院沖銷單:針對(duì)診療服務(wù)進(jìn)行沖銷的單據(jù)。該單據(jù)包括單據(jù)整體信息(如:病人信息、診療服務(wù)信息、費(fèi)用總額信息、制單信息、審核信息等)和明細(xì)信息(診療服務(wù)名稱、數(shù)量、單價(jià)、小計(jì)等),且具有審核流程。
統(tǒng)領(lǐng)單:護(hù)士每日一次性領(lǐng)取多位住院病人的藥品的單據(jù)。該單據(jù)包括單據(jù)整體信息(如:病人信息、費(fèi)用總額信息、制單信息等)和明細(xì)信息(藥品名稱、規(guī)格、劑型、數(shù)量等)。病人費(fèi)用清單:病人本次住院或門診就診過(guò)程中產(chǎn)生的費(fèi)用清單。
在SQL 查詢語(yǔ)句的規(guī)范、嚴(yán)謹(jǐn)撰寫,能夠有效提升數(shù)據(jù)查詢速度,主要具有以下優(yōu)化SQL 語(yǔ)句措施:
(1)避免在條件語(yǔ)句中對(duì)索引使用函數(shù);
(2)適當(dāng)減少子查詢及其臨時(shí)表的使用能夠有效的提高查詢語(yǔ)句的性能;
(3)盡量不要使用select *這種方式提取字段列,而要指定查詢的列名;
(4)當(dāng)模糊匹配以%開頭時(shí),該列索引將失效,若不以%開頭,該列索引有效[1];
(5)優(yōu)先使用union all,避免使用union。
為了提升表數(shù)據(jù)的檢索效率,減少磁盤I/O,有效避免全盤的表掃描,在創(chuàng)建表或表數(shù)據(jù)量過(guò)大時(shí),一般會(huì)在合適的字段上建立索引。建立索引時(shí)需注意:
(1)條件語(yǔ)句中使用的字段應(yīng)盡量是索引中的字段[1];
(2)很少在where 子句中出現(xiàn)的列,不宜建立索引[1];
(3)多表關(guān)聯(lián)查詢時(shí),關(guān)聯(lián)字段需建立索引;
(4)對(duì)經(jīng)常需要更新、刪除和插入的列(主鍵及外鍵除外)不宜建立索引[1];
(5)表中的索引不宜過(guò)多。索引固然可以提高相應(yīng)查詢的效率,但由于數(shù)據(jù)插入或更新時(shí)可能導(dǎo)致重建索引,導(dǎo)致表中數(shù)據(jù)插入及數(shù)據(jù)更新的執(zhí)行效率。所以如何建索引需要視具體情況而定。
對(duì)不活躍的數(shù)據(jù)并將其從生產(chǎn)系統(tǒng)遷移到長(zhǎng)期存儲(chǔ)系統(tǒng)中。針對(duì)醫(yī)院業(yè)務(wù)情況,可以對(duì)2 年及其以上的醫(yī)療數(shù)據(jù),如:費(fèi)用清單、處方清單、病案首頁(yè)等歷史數(shù)據(jù)按年度、醫(yī)療機(jī)構(gòu)(如:若一個(gè)區(qū)縣具有多個(gè)相互獨(dú)立的醫(yī)療機(jī)構(gòu),則可按縣域進(jìn)行部署,各機(jī)構(gòu)使用同一套HIS 系統(tǒng))進(jìn)行數(shù)據(jù)歸檔,便于保障當(dāng)前生產(chǎn)系統(tǒng)性能最優(yōu)。
針對(duì)醫(yī)院的掛號(hào)、門診、住院、體檢等業(yè)務(wù)類型,進(jìn)行數(shù)據(jù)庫(kù)表分區(qū)創(chuàng)建,便于精準(zhǔn)定位分區(qū)查詢數(shù)據(jù),而不需要全表的掃描查詢,便能提高數(shù)據(jù)檢索效率。特別是醫(yī)院處方清單存在數(shù)據(jù)量較大的情況下,在查詢某住院病人處方清單時(shí),只需要傳入住院分區(qū)對(duì)應(yīng)的字段標(biāo)識(shí),即可從掛號(hào)、門診、住院、體檢等處方中快速檢索出該病人的處方明細(xì)情況。
通過(guò)服務(wù)器端緩存技術(shù),將HIS 系統(tǒng)的熱點(diǎn)數(shù)據(jù)、常用數(shù)據(jù)進(jìn)行緩存,讓用戶請(qǐng)求通過(guò)緩存服務(wù)器進(jìn)行處理(緩存中有此請(qǐng)求數(shù)據(jù),則無(wú)需從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)),能夠有效降低數(shù)據(jù)庫(kù)訪問(wèn)壓力,提高整個(gè)系統(tǒng)的訪問(wèn)性能。
針對(duì)HIS 系統(tǒng)中的常用單據(jù),如:退藥單、退費(fèi)單、住院沖銷單、統(tǒng)領(lǐng)單、病人費(fèi)用清單等單據(jù),此類單據(jù)在數(shù)據(jù)量過(guò)大(如:加載退藥單時(shí),從上億條處方清單檢索出該單據(jù)的處方)且關(guān)聯(lián)多張業(yè)務(wù)表(如關(guān)聯(lián)醫(yī)生表、病人信息表、庫(kù)存表、費(fèi)用表等)后,可能會(huì)出現(xiàn)數(shù)據(jù)項(xiàng)加載過(guò)于緩慢、功能頁(yè)面“卡死”等情況,且此類單據(jù)的內(nèi)容項(xiàng)在后期變化較小,則可進(jìn)行“業(yè)務(wù)單據(jù)包”的方式實(shí)現(xiàn),便于業(yè)務(wù)單據(jù)數(shù)據(jù)的加載和查詢效率。
“業(yè)務(wù)單據(jù)包”是指將特定的、不經(jīng)常修改的業(yè)務(wù)個(gè)體實(shí)例數(shù)據(jù),以json、xml 等方式進(jìn)行序列化,序列化后的數(shù)據(jù)視為一個(gè)整體的業(yè)務(wù)單據(jù)包,并存儲(chǔ)于“業(yè)務(wù)單據(jù)包”表中,表中的主鍵與業(yè)務(wù)單據(jù)表中的主鍵進(jìn)行關(guān)聯(lián)(如:退藥單中主鍵ID 與“業(yè)務(wù)單據(jù)包”表中主鍵ID 一致)。查詢對(duì)應(yīng)的某個(gè)業(yè)務(wù)單據(jù)時(shí),先從“業(yè)務(wù)單據(jù)包”表以唯一索引的方式來(lái)對(duì)該整體對(duì)象(單據(jù))進(jìn)行檢索并反序列化,最終完成單據(jù)加載。
2.3.1 處方清單表(T_HIS_PRESCRIPTION_LIST)
處方清單表主要用于存儲(chǔ)病人處方信息,如醫(yī)生信息、處方信息、藥品庫(kù)存信息、費(fèi)用信息等,為了考慮到在統(tǒng)計(jì)退藥、退費(fèi)、費(fèi)用結(jié)算等信息的便利,故此表的外鍵關(guān)聯(lián)字段較多,詳見表1。
表1: 處方清單表
2.3.2 業(yè)務(wù)單據(jù)表(T_HIS_BILL)
業(yè)務(wù)單據(jù)表主要用于存儲(chǔ)單據(jù)信息,其具體設(shè)計(jì),詳見表2。
表2: 業(yè)務(wù)單據(jù)表
2.3.3“業(yè)務(wù)單據(jù)包”表(T_HIS_BILL_BAG)
“業(yè)務(wù)單據(jù)包”表用于存儲(chǔ)業(yè)務(wù)單據(jù)的整體和明細(xì)數(shù)據(jù),詳見表3。
2.3.4 處方清單表、業(yè)務(wù)單據(jù)表與“業(yè)務(wù)單據(jù)包”表之前的關(guān)系
如圖1 所示。
圖1: “業(yè)務(wù)單據(jù)包”表與單據(jù)表之間的關(guān)系圖
在實(shí)現(xiàn)“業(yè)務(wù)單據(jù)包”存儲(chǔ)及查詢過(guò)程中,主要包括生成單據(jù)結(jié)果集、存儲(chǔ)單據(jù)結(jié)果集、查詢單據(jù)結(jié)果集、單據(jù)結(jié)果集反序列化等環(huán)節(jié),如圖2 所示。
圖2: “業(yè)務(wù)單據(jù)包”實(shí)現(xiàn)流程圖
2.5.1 生成單據(jù)結(jié)果集
當(dāng)業(yè)務(wù)單據(jù)處于待審核狀態(tài)時(shí)(此時(shí)已不能修改單據(jù)明細(xì)數(shù)據(jù)),則將業(yè)務(wù)單據(jù)進(jìn)行json 或xml 格式處理。
以退藥單為示例:
2.5.2 存儲(chǔ)單據(jù)結(jié)果集
將格式化的業(yè)務(wù)單據(jù)數(shù)據(jù)存儲(chǔ)于“業(yè)務(wù)單據(jù)包”表中,并將該條數(shù)據(jù)與業(yè)務(wù)單據(jù)表進(jìn)行關(guān)聯(lián)。關(guān)鍵代碼如下:
2.5.3 單據(jù)查詢結(jié)果集
查詢某單據(jù)時(shí),根據(jù)關(guān)聯(lián)的業(yè)務(wù)單據(jù)ID 進(jìn)行“業(yè)務(wù)單據(jù)包”表的數(shù)據(jù)查詢,判斷“業(yè)務(wù)單據(jù)包”表中是否已存儲(chǔ)業(yè)務(wù)單據(jù)(兼容歷史數(shù)據(jù)沒有存儲(chǔ)單據(jù)結(jié)果集的情況),關(guān)鍵代碼如下:
2.5.4 單據(jù)結(jié)果集反序列化
將查詢到的結(jié)果集進(jìn)行反序列化,生成單據(jù)對(duì)象,為數(shù)據(jù)應(yīng)用提供支持。
綜上所述,本文主要分析了當(dāng)前醫(yī)療信息系統(tǒng)中關(guān)于業(yè)務(wù)單據(jù)查詢存在的問(wèn)題,并較為詳細(xì)的敘述了當(dāng)前常規(guī)使用的優(yōu)化方法,同時(shí)提出了一種“業(yè)務(wù)單據(jù)包”的優(yōu)化方案,并給出了優(yōu)化方案從定義到設(shè)計(jì)實(shí)現(xiàn)的全過(guò)程,此優(yōu)化方案能夠減少業(yè)務(wù)表之間的關(guān)聯(lián),有效提高業(yè)務(wù)單據(jù)數(shù)據(jù)查詢和加載效率。