时间:2023-10-31来源:系统城装机大师作者:佚名
记一次数据库删除数据非常慢的处理流程
单表数据3000条左右,根据主键删除需要509秒
一. 首先查看SQL的执行计划:执行计划正常,cost只有1,用到了主键索引。
二. 查看等待事件:
1 | SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid; |
先执行目标sql,在执行上面的sql获得sid
1 | select * from v$session_wait where sid = (上面sql查询的sid) |
显示的event是db file sequential read,也没有异常。
三. 测试其他其他表和系统io是否有问题,没问题则进行下一步
四. 追踪sql日志:
1 2 3 4 5 |
alter session set events= '10046 trace name context forever,level 12' ; delete from t_table1 where id = xxx(这里是目标sql) alter session set events= '10046 trace name context off' ; |
若不知道日志文件存放位置执行以下sql会返回路径
1 | SELECT VALUE FROM V$PARAMETER WHERE NAME = 'user_dump_dest' |
找到最新的trace文件
执行—>tkprof orcl_ora_3708.trc myoutput.txt将trc文件转换为简单明了的txt文件
查看执行删除过程中有哪个操作时间过长
我发现的问题是在实行删除的过程中这个表有外键关联主表,会先查一遍这个表里有没有那个设备的记录,elapsed表示耗时
解决办法,外键加索引,或者取消外键代码里维护外键。
首先,不要被标题误导,分两种情况。
oracle数据表有过万条数据后,删除数据就变的特别慢,有时甚至会卡死,所以在此分享一个小白操作,望对各位有帮助。
删除前: 从原表创建新表,即:先把需要的某些数据导入到新表里,或者不加条件即要删除原表的所有数据,从原表创建临时表(新表)。(相当于原模原样拷贝一份原表)
1 | create table tempTable as select id, name from table1 where sj>to_date( '2013-7-31 23:59:59' , 'yyyy-mm-dd hh24:mi:ss' ); |
接着直接 drop 删除原表,把新表名称改为原表名称。到此结束,这样直接跳过删除原表因数据多造成卡死的现象节省时间。
2023-10-31
Oracle如何编写一个sqlldr实例2023-10-31
Oracle的SQLLDR用法简介2023-10-31
Oracle中的高效SQL编写PARALLEL解析1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...
2023-10-31
windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...
2023-10-31