zi663227 发表于 2018-10-19 13:53:02

ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063

  今天,一实施同事反应,他执行一存储过程,执行到一条含有dblink的insert into select语句时报错:ORA-03150 ORA-02055 ORA-02063,具体报错如图所示:
http://img.blog.csdn.net/20170823155405405?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3d3X3h1ZV94aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
  该报错涉及的SQL语句是:
  insert into yhjkb@dblink_jkb
  select oae001,
  akb020,
  akc190,
  akc220,
  aae072,
  akc515,
  aka135,
  aae100,
  akc301,
  b.reject_money,
  b.reject_reson,
  b.oper_user_id,
  b.oper_user_name,
  b.oper_date,
  '0',
  'EH',
  'EH',
  sysdate,
  null,
  null
  from KC22 a
  inner join dr_audit b
  on a.oae001 = b.prescription_no
  and b.load_date > (select syncdate from dr_syncdate)
  and a.aae100 = '1';
  以下是优化的处理过程:
  1、首先,让其统计了insert into select的select的数据量有3394条,不是太多,但是在执行insert into子查询select的时候过程很长,有10多分钟;
  2、查看insert into子查询的sql执行计划,如下:
http://img.blog.csdn.net/20170823155814711?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3d3X3h1ZV94aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
  3、让实施同事控制子查询的数据量为1条时,虽然执行时间比较长,但是能够执行成功
  4、建议实施同事,根据select子句的where条件对表kc22的字段AAE100创建了索引,索引创建后,子查询语句执行速度明显提升,执行计划如下:
http://img.blog.csdn.net/20170823160100256?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3d3X3h1ZV94aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
  5、然后,实施同事再次执行insert into select,2分钟左右成功执行。
  问题解决!

页: [1]
查看完整版本: ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063