新闻动态

中国南方电网双RAC+DG数据容灾高可用项目实施

2021-03-30
广州天凯信息科技有限公司与中国南方电网集团合作于2020年10月,客户单位是南方电网集团的广东电科院,其数据库规模庞大,达到50T+,采用Oracle12C RAC架构,为了保障数据安全,我方为其设计并实施RAC to RA...

深圳路驰电子-数据库运维项目

2020-02-29
我方与深圳市路驰电子科技有限公司最初合作于2016年,合作项目是数据库开发定制,后续陆续为该公司客户处理过多次数据库故障排查的项目,随着客户的业务发展需求,今年2020年双方签约数据库维护项目,主要提供SQL SERVER数据库维护与优化工作。

Oracle数据库优化报告(内蒙古汇能集团数据库性能优化项目)

2020-01-13
数据库性能问题很大程度上是由于应用引起的,而应用反映在数据库层面就是SQL代码,所以一个数据库的性能90%以上是由于SQL代码的设计和访问路径不当引起的性能问题,下面是对数据库TOP SQL语句的优化记录,目前已对大部分消耗较高的SQL进行了调整,从后续的优化报告来看,已极大减少了IO的消耗,从而提高数据库的性能效率。

与广东德粘堡实业合作MSSQL数据库优化项目

2020-01-07
本次优化,针对SQL优化部分,经过多次的数据库profile跟踪与服务器的各项性能指标收集,结合优化管理器的各项建议,评估对陈旧统计信息的收集和缺失索引的创建对象,最终确定了实施方案,优化效果较明显,服务器的各项性能指标有明显改善效果;

广州奥鑫SQL Server优化项目

2020-01-04
广州天凯科技与广州奥鑫合作于2019年2月,主要提供数据库架构建设与规划,数据库运维与优化服务;合作期间,为甲方客户设计了数据库备份恢复策略,历史数据分离方案,索引碎片重整等重要方案,目前还保持合作关系,计划为客户做进一步的数据库优化方案。

与北京OFO续签数据库运维服务合同

2019-12-27
广州天凯科技与东峡大通(北京)管理咨询有限公司从2018年初首都合作,主要提供数据库备份,数据库巡检,数据库服务器扩容,DBA应急救援响应等服务,得到客户的充分信任肯定,于今年2019年12月份,双方续签了运维合同。

Oracle dataguard双机热备容灾方案实施【为广州知而言教育机构设计数据库高可用方案】

2019-12-26
广州知而言教育机构,其数据库运行在单实例环境,为了保障数据的安全以及服务器的高可用稳定特性,我方为其设计了Dataguard双机热备方案,下面是方案的具体实施内容!

与武汉网易通达签约数据库维护服务

2019-12-21
我方与武汉网易通达自2017年合作以来,一直保持长期合作,合作期间,为客户部署了Oracle dataguard,goldengate等高可用热备方案,并处理了多次数据库应急故障与性能优化处理,并在今年11月签约了年度数据库运维服务,主要提供数据库故障处理,运维规划,性能优化等数据库技术服务。

北京新网医讯-2016年7月数据库优化项目

2019-12-10 14:56冯工
 
二维码
75

数据库优化报告

序号

版本号

编制/修改日期

修改内容

修改人

1

1.0

2016-07-27

数据库优化报告v1

广州天凯信息科技有限公司(冯工)

2





3











一、    性能现状

经客户反映,某医疗系统查询响应较慢,经过一段时间对数据库的性能监控,发现数据库整体负载不高,数据库各性能相关参数也配置合理,CPU,内存,IO等资源也没有存在使用不足的状况,整体性能还是处于一个比较良好的状态。后来经与开发人员沟通,发现目前这个业务系统,并发性不高,数据量也不大,而且目前这个系统响应慢,主要是集中在一些并发不高的查询模块上,后来经数据库的底层跟踪,发现这些查询模块是通过前端筛选条件,后台查询数据库视图的方式进行读取数据的,下面是针对这些查询模块的数据结构,SQL代码等方面进行优化分析。



二、   优化方案

通过数据库的底层跟踪分析,发现这类响应缓慢的查询模块有共同点,以下是这类查询SQL语句的基本结构与代码示例:

SELECT/*+ FIRST_ROWS */*

   FROM(SELECT a.*,ROWNUM rn

          FROM(SELECT*

                  FROM V_R_REG_PATIENT_INFO

                 WHERE1=1

                   AND(1=1AND

                       ('A区CT,A区MR,A区DR'LIKE'%'|| F_MACHINE_NAME ||'%')AND

                       ('登记'LIKE'%'|| F_STATUS_NAME ||'%')AND

                       (F_STU_DATE >='2016.06.27'AND

                       F_STU_DATE <='2016.06.28')AND F_STU_ID >0)

                 ORDERBY F_STU_ID DESC) a

         WHEREROWNUM<=20)

WHERE rn >0

ORDERBY F_STU_ID DESC

2.1   现状分析

从以上这类SQL语句的代码来看,过滤条件主要带有日期范围查询,字符like等模糊判断条件,而且做了分页。经开发人员的反映来看,如果要查1-2天的数据该SQL语句在前端的查询速度是2-3秒之间,这个效率比较慢,难以接受。接下来我们再来看这个V_R_REG_PATIENT_INFO视图(VIEW)的底层结构:

Select……. T_R_STUDY8.F_STU_CHAR810, T_R_STUDY8.F_STU_CHAR811

   FROM T_R_STUDY6,

       T_R_STUDY1,

       T_CM_DICT_STATUS,

       T_R_STUDY4,

       T_R_STUDY10,

       T_R_STUDY,

       T_R_STUDY8,

       V_R_STU_OTHER_STATUS,

       T_R_DICT_CLASS,

       T_R_VISIT,

       T_R_DICT_PATSOURCE,

       T_R_DICT_SEX,

       T_R_PATIENT,

       T_R_DICT_STUDY_TYPE,

       T_R_MODALITY_TYPE,

       T_R_EXAM_MACHINE,

       T_R_DICT_ROOM,

       T_R_DICT_OT_STATUS,

       T_R_DICT_STATUS,

       T_R_DICT_AGE

WHERE T_R_STUDY.F_STU_ID = T_R_STUDY8.F_STU_ID(+)

   and T_R_STUDY.F_STU_ID = V_R_STU_OTHER_STATUS.F_STU_ID(+)

   and T_R_STUDY10.F_STU_ID(+)= T_R_STUDY.F_STU_ID

   and T_R_STUDY4.F_STU_ID(+)= T_R_STUDY.F_STU_ID

   and T_CM_DICT_STATUS.F_CM_STATUS_ID(+)= T_R_STUDY.F_CM_STATUS_ID

   and T_R_STUDY1.F_STU_ID(+)= T_R_STUDY.F_STU_ID

   and T_R_STUDY.F_CLASS_ID = T_R_DICT_CLASS.F_CLASS_ID(+)

   and T_R_STUDY.F_VST_ID = T_R_VISIT.F_VST_ID(+)

   and T_R_VISIT.F_PSOURCE_ID = T_R_DICT_PATSOURCE.F_PSOURCE_ID(+)

   and T_R_DICT_SEX.F_SEX_ID(+)= T_R_PATIENT.F_SEX_ID

   and T_R_VISIT.F_PAT_ID = T_R_PATIENT.F_PAT_ID(+)

   and T_R_STUDY.F_STU_TYPE_ID = T_R_DICT_STUDY_TYPE.F_STU_TYPE_ID(+)

   and T_R_STUDY6.F_STU_ID(+)= T_R_STUDY.F_STU_ID

   and T_R_EXAM_MACHINE.F_ROOM_ID = T_R_DICT_ROOM.F_ROOM_ID(+)

   and T_R_MODALITY_TYPE.F_MODALITY_ID(+)= T_R_EXAM_MACHINE.F_MODALITY_ID

   and T_R_STUDY.F_MACHINE_ID = T_R_EXAM_MACHINE.F_MACHINE_ID(+)

   and T_R_STUDY.F_OT_STATUS_ID = T_R_DICT_OT_STATUS.F_OT_STATUS_ID(+)

   and T_R_STUDY.F_STATUS_ID = T_R_DICT_STATUS.F_STATUS_ID(+)

   and T_R_STUDY.F_AGE_ID = T_R_DICT_AGE.F_AGE_ID(+)

   and(T_R_STUDY.F_STU_DEL_FLAG =0);

2.2   优化分析

1)       优化措施一:去除HINT

从这个视图来看,有大量的表关联连接,经开发人员反映,大表主要是集中在T_R_STUDY1-N这类表,而外层的日期范围筛选,是基于这些大表的日期字段的。从该SQL语句的代码与执行计划来看,COST消耗也不算高,仔细观察这个前端查询SQL语句,用了HINT,后来经过手工执行SQL TUNNING ADVISOR优化包,发现有更好的SQL概要文件,接受后,发现这个SQL的执行计划产生了变化,于是重新运行该SQL语句,除了第一次执行较慢外(该原因下面会介绍到),后续的查询效率都有明显的提高,以查1天的数据为例,查询效率从原来的2S下降到0.5S内,从这里得到第一个优化点:去除SQL语句的HINT,让该部分SQL语句重新产生了正确的执行计划。

2)       优化措施二:完善绑定变量

虽然去掉HINT后,该类SQL语句的执行效率有了较大的提高,但变换查询条件后,第一次执行效率还是在1.5S左右,根据这个现象,我们分析了该类SQL语句的游标与执行计划,发现每次变化条件后,这些SQL传入游标后都是带有一个常量,也就是说每次都要进行硬解析,这就比较好理解了,由于硬解析是要消耗CPU和内存的,需要经过该SQL的语法分析,权限判断,分配内存,并经过优化器产生最优执行计划等阶段,所以消耗的时间较长。经与开发人员确认,前端代码的确是没采用绑定变量的技术。后来经调整测试,采用绑定变量后,该类SQL的执行效率正常了,无论是第一次还是后续执行,都是在0.5S左右。以下是调整后的SQL代码:

SELECT*

   FROM(SELECT a.*,ROWNUM rn

          FROM(SELECT*

                  FROM V_R_REG_PATIENT_INFO

                 WHERE1=1

                   AND(F_PAT_NAME LIKE:p1 AND F_MODALITY_NAME in(:p2,:p3)AND

                       F_STU_DATE >=:p4 AND F_STU_DATE <=:p5 AND555=555)

                 ORDERBY F_STU_ID DESC) a

         WHEREROWNUM<=500)

WHERE rn >0

ORDERBY F_STU_ID DESC

3)       优化措施三:优化表结构设计

经上述两点调整后,该类SQL语句的执行效率虽然有了比较大的改善效果,但从该视图的结构定义来分析,发现存在大量的表关联,后来经与开发人员的深入沟通,发现视图里的T_R_STUDY1-N的这些表都属于大表,而且表记录是一致的。经确定,这是把表拆分列,达到分表的效果,这些表关联的意义是:从这些不同的分表中取出不同的列进行汇总读取并过滤。从这里就可以定位到问题:该类SQL还有一个比较严重的性能问题就是,存在太多的分表关联,特别对于这种数据量增长较多的表,需要进行HASH,循环嵌套等查询,需要消耗较多的时间。如果把这类分表合并,相信这个消耗时间会减少50%以上,也就是这个SQL的执行效率会提高2-3倍。目前由于数据量还不大,所以查询速度还是可观的,但将来数据量增大后,这种合并后的优化效果会更明显。但合并的前提是遵守数据库的设计范式进行,可按照第三范式的要求,合并不存在冗余映射关系的列,从而减少表连接,提高数据库的查询速度。

4)       优化措施四:更高数据类型并分区

另外,从这些大表的表结构设计上,我们还发现一个问题,这类大表的日期字段采用了字符型varchar2的数据类型,这从开发的角度来看,是很不规范的,采用字符类型做日期字段的弊端有很多,例如不能利用各种日期函数来做运算,不能进行日期分区等。从数据扩展的角度来考虑,建议将该日期字段改成DATE类型,并且可考虑利用这个日期字段进行按月分区,这样有利于以后的数据扩展需求,提供大数据的查询效率。

三、   数据库优化总结

根据以上的优化分析,总结优化建议有:

一、从数据库整体层面出发,检查程序代码带有HINTSQL语句,并去除这些HINT

二、从数据库整体层面出发,检查程序代码没采用绑定变量的SQL语句,完善它;

三、优化一些大表的表结构设计,合并列,减少数据表的关联查询,提高SQL执行效率;

四、从数据库整体层面出发,检查用字符类型做时间字段的情况并调整过来,并且一些大表,可考虑用这个时间字段进行分区。


公司地址:广州市南沙区丰泽东路106号

公司官网:www.dbs-service.com

电话/微信:13926108245

QQ客服:282321952


昵称:
内容:
验证码:
提交评论