医院数据库系统SQL语句优化
扫描二维码
随时随地手机看文章
select top 1CFSB from MS_CF01 where FYRQ>=”2004.3.1 00:00:00”?
//得到该时间段内最小的CFSB,例如3198724
select top 1CFSB from MS_CF01 where FYRQ<=”2004.3.30 00:00:00”?
order by CFSB desc //得到该时间段内最大的CFSB,例为4178763
select sum(MS_CF02.YPSL*MS_CF02.YPDJ*MS_CF02.CFTS) as total
from MS_CF01,MS_CF02
where MS_CF01.CFSB=MS_CF02.CFSB and MS_CF01.CFLX=1
and MS_CF02.CFSB>=3198724 and MS_CF02.CFSB<=4178763
and (MS_CF01.FYBZ=1 or MS_CF01.FYBZ=3)
and MS_CF01.ZFPB=0
所有语句执行完毕后,结果不超过18秒。
3.2案例分析二
医院工作人员反映在药库系统自动计划模块执行速度很慢,有时大约需要半个小时才能跳出窗口。
经过分析发现,在w_yk_plan.cb_auto.clicked() 18行开始的代码如下:
ls_select+=" select YK_TYPK.YPXH,YPMC,YPGG,YPDW,GCSL,DCSL,0 "
ls_select+=" from YK_TYPK,YK_KCMX "
ls_select+=" where XTSB="+string(base_info.syscode)+" and DCSL>0 and GCSL>DCSL and YKZF=0 "
ls_select+=" and YK_TYPK.YPXH not in (select YPXH from YK_KCMX) "
ls_select+=" group by YK_TYPK.YPXH,YPMC,YPGG,YPDW,GCSL,DCSL "
显然是NOT IN语句导致速度很慢,然后把该语句改成:
ls_select+=" select YK_TYPK.YPXH,YPMC,YPGG,YPDW,GCSL,DCSL,0 "
ls_select+=" from YK_TYPK "
ls_select+=" where XTSB="+string(base_info.syscode)+" and DCSL>0 and GCSL>DCSL and YKZF=0 "
ls_select+=" and? not exists ( select YPXH FROM YK_KCMX WHERE? YK_TYPK.YPXH = YK_KCMX.YPXH ) "
ls_select+=" group by YK_TYPK.YPXH,YPMC,YPGG,YPDW,GCSL,DCSL “
结果5秒内执行完成。
3.3案例分析三
以下SQL的功能是医院用于作日报时显示哪些收费员还没有做过当天的个人日报,速度非常慢,每次都需要好几分钟才能出来数据。
显然这个问题是由于不合理的子查询造成的,经分析后我们把子查询从where子句中去除,语句改成如下后,2秒内数据库出来了。
某些HIS系统中病区系统中医嘱提交、医嘱执行、医技提交速度慢问题原因分析ZY_BQYZ 这个表中出院数据没有转出到ZY_BQYZ_CY 表中。
没有建立正确的索引,SQL 语句本身存在的问题,在医嘱提交中的WHERE子句:
WHERE ( ZY_BQYZ.ZYH = ZY_BRRY.ZYH AND ZY_BRRY.CYPB = 0 )
AND ( ZY_BQYZ.SRKS = :al_hsql)
AND ( ZY_BQYZ.LSBZ=0 OR ZY_BQYZ.LSBZ=2)
AND ( ZY_BQYZ.SYBZ = 0)
AND ( ZY_BQYZ.XMLX<4 )
AND ( ZY_BQYZ.YZPB=0 )
AND ( ZY_BQYZ.FYSX<2)?
AND ( ZY_BQYZ.JFBZ<2)
AND ( ZY_BQYZ.YSBZ = 0 OR (ZY_BQYZ.YSBZ = 1 AND ZY_BQYZ.YSTJ = 1))
在医院执行模块的数据窗口SQL:
SELECT DISTINCT ZY_BQYZ.ZYH,ZY_BRRY.BRCH,ZY_BRRY.ZYHM,ZY_BRRY.BRXM,ZY_BRRY.BRXZ
FROM ZY_BQYZ, ZY_BRRY?
WHERE ( ZY_BQYZ.ZYH = ZY_BRRY.ZYH )
AND ( ZY_BRRY.CYPB = 0 )
AND ( ZY_BQYZ.SRKS = :al_hsql )
AND ( ZY_BQYZ.SYBZ = 0 )
AND ( ZY_BQYZ.LSBZ = 0 OR ZY_BQYZ.LSBZ = 2 )
AND ( ZY_BQYZ.QRSJ < :ad_today OR ( ZY_BQYZ.QRSJ IS NULL ) )
AND ( ZY_BQYZ.JFBZ = 2 OR ZY_BQYZ.JFBZ = 9 )
AND ( ZY_BQYZ.XMLX > 3 )
AND ( ZY_BQYZ.YZPB = 0 )
ORDER BY ZY_BRRY.BRCH
4小结
从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的1/O 次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在SQL语句应用时的一种具体实例和平时应用中的总结。总之,数据库的性能优化是一个系统工程,涉及的方面很多。数据库管理员需要综合运用多种方法,认真分析数据库运行过程中出现的各种问题,才能保证数据库高效地运行。
参考文献:
[1] ?陈倩文.医院数据库系统的性能分析及优化经验[J].中国数字医学,2009.4(8):66-68
[2] ?马辰.医院信息系统数据库的性能优化和故障维修[J].医疗装备,2009.6:69-70
[3] ?王勇.基于SQL 数据库的性能优化问题分析[J]. 电脑知识与技术,2009.15:1004-1007
[4] ?殷美桂.谈关系数据库查询优化方法[J].电脑知识与技术,2008.16:1188-1189
[5] ?骆正云,宋念东,俞国霖.医院HIS系统SQL SERVER数据库性能优化[J].医疗卫生装备,2005.26(2):32-33
[6] ?刘兆良,陈中举,刘方.SQL SERVER数据库查询优化技术[J].科技信息,2007.24:377-378
作者:上海长海医院 刘于惠;上海市浦东医院 夏新
?