医院信息系统业务单据查询的性能优化与实现

2023-05-17 03:17唐山李娟
电子技术与软件工程 2023年5期
关键词:序列化字段单据

唐山 李娟

(四川省计算机研究院 四川省成都市 610041)

随着医院信息系统(Hospital Information System,以下简称HIS 系统)使用年份的增长,用户数据的不断积累,病人处方清单数据的不断增加,若不对HIS 系统中的业务单据查询采取进一步的优化措施,则在使用过程中,HIS 系统可能会出现业务单据数据查询时间等待过长、页面无反应、功能使用出现“卡死”等现象,严重影响医院用户在相关单据处理环节的使用体验。

本文主要根据医院业务单据数据存储和检索的实际情况,并结合业务单据相关特点(单据主要由单据整体信息和明细信息构成),设计出一种“业务单据包”的业务单据查询的优化方法,用于提升HIS 系统业务单据数据查询性能和页面加载效率。

本文中使用的名词定义:

退药单:门诊或住院患者,退药的单据,该单据包括单据整体信息(如:病人信息、药品信息、费用总额信息、制单信息、审核信息等)和明细信息(药品名称、规格、剂型、数量、单价、小计等),且具有审核流程。

退费单:门诊患者退费的业务单据,该单据包括单据整体信息(如:病人信息、药品信息、费用总额信息、制单信息、审核信息等)和明细信息(药品名称、规格、剂型、数量、单价、小计等),且具有审核流程。同时门诊退费单可由退药单直接生成(库房未发药时)。

住院冲销单:针对诊疗服务进行冲销的单据。该单据包括单据整体信息(如:病人信息、诊疗服务信息、费用总额信息、制单信息、审核信息等)和明细信息(诊疗服务名称、数量、单价、小计等),且具有审核流程。

统领单:护士每日一次性领取多位住院病人的药品的单据。该单据包括单据整体信息(如:病人信息、费用总额信息、制单信息等)和明细信息(药品名称、规格、剂型、数量等)。病人费用清单:病人本次住院或门诊就诊过程中产生的费用清单。

1 常规优化措施

1.1 业务单据查询语句的优化

在SQL 查询语句的规范、严谨撰写,能够有效提升数据查询速度,主要具有以下优化SQL 语句措施:

(1)避免在条件语句中对索引使用函数;

(2)适当减少子查询及其临时表的使用能够有效的提高查询语句的性能;

(3)尽量不要使用select *这种方式提取字段列,而要指定查询的列名;

(4)当模糊匹配以%开头时,该列索引将失效,若不以%开头,该列索引有效[1];

(5)优先使用union all,避免使用union。

1.2 索引优化

为了提升表数据的检索效率,减少磁盘I/O,有效避免全盘的表扫描,在创建表或表数据量过大时,一般会在合适的字段上建立索引。建立索引时需注意:

(1)条件语句中使用的字段应尽量是索引中的字段[1];

(2)很少在where 子句中出现的列,不宜建立索引[1];

(3)多表关联查询时,关联字段需建立索引;

(4)对经常需要更新、删除和插入的列(主键及外键除外)不宜建立索引[1];

(5)表中的索引不宜过多。索引固然可以提高相应查询的效率,但由于数据插入或更新时可能导致重建索引,导致表中数据插入及数据更新的执行效率。所以如何建索引需要视具体情况而定。

1.3 数据归档

对不活跃的数据并将其从生产系统迁移到长期存储系统中。针对医院业务情况,可以对2 年及其以上的医疗数据,如:费用清单、处方清单、病案首页等历史数据按年度、医疗机构(如:若一个区县具有多个相互独立的医疗机构,则可按县域进行部署,各机构使用同一套HIS 系统)进行数据归档,便于保障当前生产系统性能最优。

1.4 业务分区

针对医院的挂号、门诊、住院、体检等业务类型,进行数据库表分区创建,便于精准定位分区查询数据,而不需要全表的扫描查询,便能提高数据检索效率。特别是医院处方清单存在数据量较大的情况下,在查询某住院病人处方清单时,只需要传入住院分区对应的字段标识,即可从挂号、门诊、住院、体检等处方中快速检索出该病人的处方明细情况。

1.5 服务器端缓存技术

通过服务器端缓存技术,将HIS 系统的热点数据、常用数据进行缓存,让用户请求通过缓存服务器进行处理(缓存中有此请求数据,则无需从数据库中提取数据),能够有效降低数据库访问压力,提高整个系统的访问性能。

2“业务单据包”的设计与实现

2.1 应用场景

针对HIS 系统中的常用单据,如:退药单、退费单、住院冲销单、统领单、病人费用清单等单据,此类单据在数据量过大(如:加载退药单时,从上亿条处方清单检索出该单据的处方)且关联多张业务表(如关联医生表、病人信息表、库存表、费用表等)后,可能会出现数据项加载过于缓慢、功能页面“卡死”等情况,且此类单据的内容项在后期变化较小,则可进行“业务单据包”的方式实现,便于业务单据数据的加载和查询效率。

2.2 定义

“业务单据包”是指将特定的、不经常修改的业务个体实例数据,以json、xml 等方式进行序列化,序列化后的数据视为一个整体的业务单据包,并存储于“业务单据包”表中,表中的主键与业务单据表中的主键进行关联(如:退药单中主键ID 与“业务单据包”表中主键ID 一致)。查询对应的某个业务单据时,先从“业务单据包”表以唯一索引的方式来对该整体对象(单据)进行检索并反序列化,最终完成单据加载。

2.3 表结构设计

2.3.1 处方清单表(T_HIS_PRESCRIPTION_LIST)

处方清单表主要用于存储病人处方信息,如医生信息、处方信息、药品库存信息、费用信息等,为了考虑到在统计退药、退费、费用结算等信息的便利,故此表的外键关联字段较多,详见表1。

表1: 处方清单表

2.3.2 业务单据表(T_HIS_BILL)

业务单据表主要用于存储单据信息,其具体设计,详见表2。

表2: 业务单据表

2.3.3“业务单据包”表(T_HIS_BILL_BAG)

“业务单据包”表用于存储业务单据的整体和明细数据,详见表3。

2.3.4 处方清单表、业务单据表与“业务单据包”表之前的关系

如图1 所示。

图1: “业务单据包”表与单据表之间的关系图

2.4 实现流程设计

在实现“业务单据包”存储及查询过程中,主要包括生成单据结果集、存储单据结果集、查询单据结果集、单据结果集反序列化等环节,如图2 所示。

图2: “业务单据包”实现流程图

2.5 实现过程

2.5.1 生成单据结果集

当业务单据处于待审核状态时(此时已不能修改单据明细数据),则将业务单据进行json 或xml 格式处理。

以退药单为示例:

2.5.2 存储单据结果集

将格式化的业务单据数据存储于“业务单据包”表中,并将该条数据与业务单据表进行关联。关键代码如下:

2.5.3 单据查询结果集

查询某单据时,根据关联的业务单据ID 进行“业务单据包”表的数据查询,判断“业务单据包”表中是否已存储业务单据(兼容历史数据没有存储单据结果集的情况),关键代码如下:

2.5.4 单据结果集反序列化

将查询到的结果集进行反序列化,生成单据对象,为数据应用提供支持。

3 结束语

综上所述,本文主要分析了当前医疗信息系统中关于业务单据查询存在的问题,并较为详细的叙述了当前常规使用的优化方法,同时提出了一种“业务单据包”的优化方案,并给出了优化方案从定义到设计实现的全过程,此优化方案能够减少业务表之间的关联,有效提高业务单据数据查询和加载效率。

猜你喜欢
序列化字段单据
图书馆中文图书编目外包数据质量控制分析
第三方单据辨析
汇票在信用证项下单据融资中的作用
重视单据的寄送
Java 反序列化漏洞研究
作文训练微格化、序列化初探
CNMARC304字段和314字段责任附注方式解析
唛头导致单据“不清洁”?
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究