用户告知数据库迁移后,在发送医嘱的时候,有锁表情况,导致全院业务受影响,希望分析并解决。
查看ASH报告,如下:
CPUs SGA Size Buffer Cache Shared Pool ASH Buffer Size ---- ------------------ ------------------------------------ ------------------ 120 101,943M (100%) 81,920M(80.4%) 9,216M (9.0%) 240.0M (0.2%) Analysis Begin Time: 07-4月 -1508:39:41 Analysis End Time: 07-4月 -1509:09:41 Elapsed Time: 30.0 (mins) Begin Data Source: V$ACTIVE_SESSION_HISTORY End Data Source: V$ACTIVE_SESSION_HISTORY Sample Count: 184,994 Average Active Sessions: 102.77 Avg. Active Session per CPU: 0.86 Report Target: None specified Top User Events DB/Inst: ZLHIS/zlhis3 (4月 07 08:39 to 09:09) Avg Active Event Event Class % Event Sessions -------------------------------------------------- ---------- ---------- enq: TM - contention Application 93.47 96.07 CPU + Wait for CPU CPU 3.18 3.27 enq: TX - row lock contention Application 2.81 2.88 -------------------------------------------------------------
可以看到,系统出现了严重的TM锁,TM锁是表级锁,如果出现,会引起严重的性能问题,接着需要分析下是什么对象导致,如下:
Top Event P1/P2/P3 Values DB/Inst: ZLHIS/zlhis3 (4月 07 08:39 to 09:09) Event % Event P1 Value, P2 Value, P3 Value % Activity ------------------------------ ------------------------------------ ---------- Parameter 1 Parameter 2 Parameter 3 ---------------------------------------------------- -------------------------- enq: TM - contention 93.47 "1414332419","91048","0" 38.44 name|mode object # table/partition "1414332419","90822","0" 34.22 "1414332419","128417","0" 13.86 enq: TX - row lock contention 2.81 "1415053318","11206682","20" 0.30 name|mode usn16 | slot sequence
这里我们可以获取很重要的信息,object_id,,如上,我们可以看到被锁的对象id分别是91048,90822,128417,我们通过dba_objects这张视图,去查找ID号分别位上面3个的对象,分别是3张表”病例XX明细”、”药品XX明细”、”检验XX记录”,这3张表都没有数据,但是有个共同的特别,对药品和医嘱2张表都有外键相连,但是该表外键上都没有单独索引。一般情况下如果主键列被更新,就会导致外键列被锁住,不加索引的外键列会造成严重的性能问题,所以除非你有十分的把握,否则还是在外键列上添加索引。
分别对以上3张表的外键添加单独的索引,注意,这里如果有包含外键列的复合索引,也要单独再建个索引。