数据删除执行慢的性能处理

基本要素(时间、用户、问题)

XXX医院使用了XX的lis软件,与我们his进行了接口,最近半年发现取消标本核收时,速度非常慢.基本在10-20秒之间才能完成取消核收,医院意见很大,严重影响工作效率, 跟踪后,发现是调用Zl_检验标本记录_审核取消时,执行到Delete 电子病历记录 Where ID = v_Fileid时速度很慢.

问题分析

步骤一:故障重现

在plsql中执行delete删除语句,发现执行效率确实非常低,通过查询会话等待事件,看到存在TM锁,如下:


查询dba_object视图中object_id为237069的对象,确定该对象是病人医嘱记录表,如下:


步骤二:问题分析

         TM锁我们知道是一种表级锁,这种锁一般跟DML有关系,如果出现锁的表并为进行DML操作,那么就可能常出现的情况就是外键字段未建索引,我们首先来看下病人医嘱记录是否同电子病历记录有外键连接,如下


可以看到,确实存在一个病人医嘱记录_FK_病历ID的外键连接,我们看这个外键连接的没有级联操作,但是即便没有级联操作,在进行电子病历记录操作的时候,同样会对病人医嘱记录表进行TM锁,因为在病人医嘱记录这个表上,确实在病历ID上,没有索引,如下:


解决过程

步骤一:核实数据结构

根据公司研发的规范要求,我们产品中的如果表上有外键原则上该外键字段是必须建索引的,因此我们首先应该核对下数据结构,看是否因人为原因导致索引被删除,通过查询脚本,我们发现最新的数据结构中病人医嘱记录表上并没有病人医嘱记录_FK_病历ID这个外键,该外键应该是废弃的,可能因为用户升级中未对该外键进行清理,导致该外键在用户表中依然存在。

步骤二:删除外键

通过命令删除病人医嘱记录表上的病人医嘱记录_FK_病历ID外键,如下:

SQL>ALTER TABLE 病人医嘱记录 DROPCONSTRAINT 病人医嘱记录_FK_病历ID;

删除后再次执行Delete 电子病历记录 Where ID = v_Fileid语句,该语句执行效率明显提升,问题解决。

关键知识点

enq: TM - contention:TM 等待事件,表示数据库在进行DML操作的时候,对表进行的一种表级锁,这种锁对性能影响非常大,如果长时间出现,一般同外键有关系。

外键字段索引:外键字段如果没有索引,在对外键表进行DML操作的时候,会对本表进行TM锁,无论该外键是否有级联操作,因此一般要求有外键的情况下,必须在该字典建单独的索引。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值