基于索引技术提升大型HIS系统查询效率(2)
第1页 |
参见附件(2110KB,2页)。
4.2取消应用在索引列上的函数
表1第二条SQL是在门诊处方发药时,读门诊病人的诊断信息。outp_mr表上只有一个主键索引pk_outp_mr (visit_date, visit_no, ordinal),目前该表数据量已经达到百万,并且表现出明显的增长趋势,数据增长量与日门诊量相当。
SQL的查询条件对索引列visit_date和visit_no进行了函数计算,导致优化器不能有效的使用索引而选择全表扫描,如表3,全表扫描操作的I/O代价远高于索引扫描,执行效率低,平均耗时3.114秒。对这条SQL语句进行查询重写,将Where子句的查询条件进行语义等价变换,取消应用在索引列上的函数visit_date=to_date(substr(:serial_no,1,8),'yyyymmdd') and visit_no = substr(:serial_no,9,5) and ordinal=1。
表3取消索引列上的函数前的执行计划
4.3 性能评价
在对dispensing_date_time列建立索引之后,查询计划发生改变,如表4所示,索引跳跃式扫描被基于新建索引的索引域扫描代替,扫描代价明显减少,由原来的46453降低到1,扫描时间仅为0.16秒,性能提升明显,如图1。
在对第二条SQL语句进行查询重写之后,SQL语句执行计划也发生改变,如表5:
表5 取消索引列上的函数后的执行计划
对于outp_mr的访问由全表扫描改为索引唯一扫描,执行效率明显提高,平均耗时仅为0.02秒,调整前后执行效率对比如图2。
图1建立索引前后执行时间比较图2取消索引列上的函数前后执行时间比较
5 结论
索引的合理有效使用在应用系统开发实施过程中是至关重要的。合理的索引大幅提升系统性能,不合理的索引不仅会导致系统性能下降,甚至可能导致数据库系统的崩溃。数据库管理员需要认真分析系统应用,定位影响系统性能的关键点,有的放矢加以解决。“优化”并不是“一劳永逸”的,随着数据的增长、应用的调整,需要对索引进行再次优化,以满足当时效率上的要求。
参考文献
[1] 朱君. 基于索引的SQL语句查询优化方法[J].东莞理工学院学报,2003,10(2):18-20.
[2] 郭珉. ORACLE数据库SQL优化原则[J].计算机系统应用,2010,19(4):170-173.
[3] 宋彩霞,路新春. Oracle数据库基于索引SQL优化方法的研究与实现[J].计算机工程与设计,2004,25(12):2327-2330.
[4] Oracle9i Database Performance Tuning Guide and Reference,Release 2(9.2),2002:73-75.
您现在查看是摘要介绍页,详见PDF附件(2110KB,2页)。