欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次 oracle 数据优化经历

程序员文章站 2022-07-13 08:00:02
...

1、问题起源

由于公司的业务需要,给某一保险客户使用oracle数据库订制报表。客户需要多张报表,并且每隔15分钟更新一次。

起初的思路是:使用oracle的DBMS任务调度,调用存储过程,通过元数据生成报表。
该客户的数据量大概一天十几万条。
公司之前一只使用的是postgres,对postgres比较熟悉,oracle的使用场景很少。

存在的问题:
  1. oracle存储过程执行中,没有commit,只在最后做了一次commit
  2. 报表的建表语句里竟然没有创建索引
  3. 前期做测试,数据量小,没有暴露出问题,顺利与客户对接。但是跑了3个多月后,客户才发现数据更新不及时,沟通排查后发现其中有两个存储过程竟然锁住了,并且其中一个session占用达到了3G多,执行完一次需要几个小时。这个问题出现的很恐怖。

2、优化

  1. 存储过程采用,先插入基本信息,后来隔段时间更新的方式,所以在每次更新完,直接commit
  2. 数据更新时,查询记录时按查询条件建立对应的索引

经过以上两条简单的优化,原本几个小时执行完的存储过程,1分钟内执行完毕!

3、总结

都是前期自己给现在的自己挖的坑,提醒自己时刻要注意sql的优化,要结合具体场景。

另外记一下优化过程中用到的一些sql:
查询是否锁表 :

select t2.username,
   t2.sid,
   t2.serial#,
   t3.object_name,
   t2.OSUSER,
   t2.MACHINE,
   t2.PROGRAM,
   t2.LOGON_TIME,
   t2.COMMAND,
   t2.LOCKWAIT,
   t2.SQL_ADDRESS,
   t1.LOCKED_MODE
   from v$locked_object t1, v$session t2, dba_objects t3
   where t1.session_id = t2.sid
   and t1.object_id = t3.object_id
   order by t2.logon_time;

kill session操作:
由于是aws托管的oracle,查阅aws_rds文档,得知,通过以下命令可以kill掉

begin
rdsadmin.rdsadmin_util.kill(
    sid    => sid, 
    serial => serial_number);
end;

而之前使用

alter system kill session 'sid, serial#';  

不能操作。