专业咨询
致力推进中国医疗卫生信息化

《浙江省医疗卫生信息安全管理案例集》选登(9):合理运用Oracle分区表优化电子病历系统

来源:HIT专家网        案例提供:温州医科大学附属第一医院

【编者按】

由浙江省卫生信息中心主任、浙江省卫生信息学会秘书长倪荣同志主编的《浙江省医疗卫生信息安全管理案例集》,汇集了来自全省医疗卫生信息化工作者们的实战心得,内容紧贴医疗卫生信息安全、系统运行维护的常见问题,具有很高的实用价值。相信对于医疗卫生信息化工作者、IT企业工程实施和运维服务人员而言,都是一本极其解渴的实用好书。

正是意识到这本书的巨大价值,HIT专家网作为行业信息服务平台,十分热切地期望向同行及时推荐分享这本书。经过与浙江省卫生信息学会接洽,HIT专家网受权开辟专栏以连载形式转载该书收纳的163个案例当中的10余个供读者品尝,同时欢迎有兴趣的读者踊跃订购,也可直接通过微店购书(http://weidian.com/i/1667178330?wfr=c)。

【案例描述】

某院的电子病历系统采用自行研发的基于动态智能解析数据结构,解决了非结构化和传统结构化数据存储方式存在的缺陷,方便了系统的实现、维护和扩展,同时也解决了医疗机构间电子病历数据共享的技术问题。然而,结构化电子病历因数据元多、结构复杂且数据量大,最终导致程序在性能上、可用性与安全性上出现问题,其中,以性能问题尤为突出。随着结构化电子病历的深入使用,数据量急剧增长,数据查询与更新操作性能较差,不时出现超长时长的等待以及程序未响应的情况。这种情况严重影响医生的正常使用,降低工作效率。

【解决方案】

为解决性能上的问题,采用Oracle分区表存储数据,尤其是数据量巨大的病历内容数据表和病历内容修改痕迹表。首先,建数个表空间,如ts_emr1、ts_emr2、ts_emr3、ts_emr4等,将相应数据文件存储于不同的物理磁盘(当然如果不考虑I/O性能,也可存储于相同的物理磁盘),建表空间语句如下:

create tablespace ts_emr1 datafile ‘D:\oradata\ts_emr1\data01.dbf’ size 100M autoextend on next 100M maxsize 30000M;

注:

表空间名:ts_emr1,数据文件:D:\oradata\ts_emr1\data01.dbf,初始大小:100M,自动扩展:允许,每次扩展大小:100M,文件最大存储空间:30000M。

再建一个索引表空间,用于存放索引数据。

create tablespace ts_index datafile ‘D:\oradata\ts_index\data01.dbf’ size 100M autoextend on next 100M maxsize 30000M;

以下是病历内容数据表按medical_record_id范围分区建表语句。

create table medical_record_data (

medical_record_id number(10) not null,

element_definition_id number(8) not null,

serial_number number(8) not null,

e_result VARCHAR2(200),

e_modifier VARCHAR2(20),

modify_date DATE,

primary key(medical_record_id)

using index tablespace TS_INDEX )

pctfree 10 pctused 90

partition by range(medical_record_id)

(partition medical_record_data_p1 values less than(50000) tablespace ts_emr1,

partition medical_record_data_p2 values less than(100000) tablespace ts_emr2,

partition medical_record_data_p3 values less than(150000) tablespace ts_emr3,

partition medical_record_data_p4 values less than(200000) tablespace ts_emr4

);

选择合适的PCTFREE和PCTUSED值至关重要,但同时PCTFREE与PCTUSED之和不得大于100。这里选择pctfree为10,pctused为90。

medical_record_data_p1存放medical_record_id小于50000的数据,这部分数据存储于ts_emr1表空间中,medical_record_data_p2存放medical_record_id大于等于50000且小于100000的数据,这部分数据存储于ts_emr2表空间中,以此类推。

可以通过向表空间ts_emr1、ts_emr2、ts_emr3、ts_emr4等中增加数据文件的方式扩容,也可实现表空间跨磁盘存储,如:

alter tablespace ts_emr1 add datafile ‘E:\oradata\ts_emr1\data02.dbf’ size 100M autoextend on next 100M maxsize 20000M;

可以向分区表中增加分区,当然必须先建好新分区所在的表空间,如在病历内容表中增加一个分区medical_record_data_p5,存放medical_record_id大于等于200000且小于250000的数据,这部分数据存储于ts_emr5表空间中,语法如下:

alter table medical_record_data add partition medical_record_data_p5 values less than(250000) tablespace ts_emr5;

以下是病历内容修改痕迹表按archive_date范围分区建表语句:

create table modify_trace (

medical_record_id number(10) not null,

element_definition_id number(8) not null,

e_result VARCHAR2(200),

modifier VARCHAR2(10),

modify_date DATE,

archive_date DATE not null,

primary key(medical_record_id, element_definition_id, modify_date)

using index tablespace TS_INDEX )

pctfree 0 pctused 99

partition by range(archive_date)

(partition modify_trace_p1 values less than(to_date(‘2009-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr101,

partition modify_trace_p2 values less than(to_date(‘2010-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr102,

partition modify_trace_p3 values less than(to_date(‘2011-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr103,

partition modify_trace_p4 values less than(to_date(‘2012-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr104,

partition modify_trace_p5 values less than(to_date(‘2013-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr105,

partition modify_trace_p6 values less than(to_date(‘2014-01-01’, ‘yyyy-mm-dd’)) tablespace ts_emr106,

partition modify_trace_p7 values less than (maxvalue) tablespace ts_emr107);

此外,为了验证分区表技术对性能的提高,我们还继续做了如下试验。我们将原来的痕迹表复制了一份,命名为modify_trace_non。对于表modify_trace_non与modify_trace,分别执行以下语句:

select * from modify_trace_non where archive_date between to_date(‘20100716′,’yyyymmdd’) and to_date(‘20100717′,’yyyymmdd’) order by archive_date;

select * from modify_trace where archive_date between to_date(‘20100716′,’yyyymmdd’)and to_date(‘20100717′,’yyyymmdd’) order by archive_date;

(1)表modify_trace_non的执行是“TABLE ACCESS FULL”, cost值是17833 并且Bytes值是190K,如表1所示.更直观的数据是检索出5539行数据,共花费了3.813秒。

表1 execution plan of table modify_trace_non

ID Operation name Rows Bytes Cost(%CPU)
0 SELECT STATEMENT 4641 190K 17833(2)
1 SORT ORBER BY 4641 190K 17833(2)
2 TABLE ACCESS FULL MODIFY_TRACE_NON 4641 190K 17832(1)

(2)如表2所示,表modify_trace的查询是先“PARTITION RANGE SINGLE”,然后再“TABLE ACCESS FULL”。因为开始分区和结束分区都是3,所以只用查询第三个分区,即ts_emr103。语句执行一共花费了2.985秒,检索出同样的5539行数据。并且,cost值只有2492,bytes值则只有157K,比未分区的表要快很多,也节省很多。由此可知,每个分区都是全表的一小部分,在分区内查询必然会提高性能。

表2  execution plan of table modify_trace

ID Operation name Rows Bytes Cost(%CPU) Pstart Pstop
0 SELECT STATEMENT 3935 157K 2492(2)
1 PARTITON RANGE SINGLE 3935 157K 2492(2) 3 3
2 SORT ORBER BY 3935 157K 2492(2)
3 TABLE ACCESS FULL MODIFY_TRACE 3935 157K 2491(2) 3 3

用Oracle分区表对结构化电子病历系统数据进行分类存储,具有诸多优点:1、改善性能:对大表的增、删、改和查询操作分解到目标分区,提高操作速度;2、方便维护:可对表的某个分区进行数据维护(如数据修复);3、均衡I/O:可以把不同分区的数据存储在不同的磁盘中,以平衡I/O;4、提高可用性:如果表的某个分区出现故障,表的其余非故障分区仍然可用;5、方便数据备份和恢复:可以对单独的分区进行备份和恢复;6、分区对用户透明。Oracle分区表对基于SaaS的结构化电子病历系统数据存储具有更明显优势。

【案例提供人】

温州医科大学附属第一医院:胡建东、周新朝、高志宏、潘传迪

 

zhengdingfengmian20151204医院信息部门一线人员必读书籍。如果您感兴趣更多类似案例的实操解决之道,欢迎订阅!详情请点击:实战力作 欢迎订阅《浙江省医疗卫生信息安全管理案例集》或者通过微店购书(http://weidian.com/i/1667178330?wfr=c)。

 

赞(0)

评论 抢沙发

评论前必须登录!

 


未经允许不得转载:HIT专家网 » 《浙江省医疗卫生信息安全管理案例集》选登(9):合理运用Oracle分区表优化电子病历系统
分享到: 更多 (0)