记一次 oracle 数据优化经历
程序员文章站
2022-07-13 08:00:02
...
1、问题起源
由于公司的业务需要,给某一保险客户使用oracle数据库订制报表。客户需要多张报表,并且每隔15分钟更新一次。
起初的思路是:使用oracle的DBMS任务调度,调用存储过程,通过元数据生成报表。
该客户的数据量大概一天十几万条。
公司之前一只使用的是postgres,对postgres比较熟悉,oracle的使用场景很少。
存在的问题:
- oracle存储过程执行中,没有
commit
,只在最后做了一次commit
。 - 报表的建表语句里竟然没有创建
索引
。 - 前期做测试,数据量小,没有暴露出问题,顺利与客户对接。但是跑了3个多月后,客户才发现数据更新不及时,沟通排查后发现其中有两个存储过程竟然锁住了,并且其中一个session占用达到了3G多,执行完一次需要几个小时。这个问题出现的很恐怖。
2、优化
- 存储过程采用,先插入基本信息,后来隔段时间更新的方式,所以在每次更新完,直接
commit
。 - 数据更新时,查询记录时按查询条件建立对应的
索引
。
经过以上两条简单的优化,原本几个小时执行完的存储过程,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#';
不能操作。
上一篇: 开始吧
下一篇: 记一次ORACLE分页优化