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

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

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

问题分析

步骤一:故障重现

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

数据删除执行慢的性能处理_第1张图片

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


步骤二:问题分析

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

数据删除执行慢的性能处理_第2张图片

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

数据删除执行慢的性能处理_第3张图片

解决过程

步骤一:核实数据结构

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

步骤二:删除外键

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

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

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

关键知识点

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

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

你可能感兴趣的:(ORACLE-整体优化)