Oracle删除数据非常慢的问题及解决(oracle删除大量数据哪种方法效率最高)学到了

随心笔谈2年前发布 admin
247 0 0

文章摘要

这篇文章讲述了在Oracle数据库中删除大量数据时遇到的性能问题,并分享了具体的处理方法。以下是总结: 1. **问题描述**: - 单表数据约3000条,删除操作需要超过500秒,导致系统卡顿。 2. **处理流程**: - **检查SQL执行计划**:确认使用了主键索引,但执行计划正常,没有异常。 - **等待事件分析**:显示事件为“db file sequential read”,无异常,排除磁盘或日志问题。 - **测试其他表和I/O**:未发现其他表或I/O问题,排除外部干扰。 - **分析日志**:通过`alter session`设置日志跟踪,发现外键查询耗时过长。 3. **核心问题**: - 表外键关联导致在删除时需要先查询相关记录,耗时过长。 4. **解决方法**: - **创建临时表**:将数据先导入到临时表,避免在删除时频繁查询原表,从而减少外键查询时间。 - **步骤**: 1. 从原表创建临时表。 2. 删除原表数据,将临时表重命名为原表名。 5. **总结**: - 外键查询导致删除缓慢,解决方案是通过临时表隔离外键查询,提升删除效率。 这篇文章提供了一种实用的解决方法,帮助用户在处理大量数据删除时避免系统卡顿。



目录Oracle删除数据非常慢问题描述处理流程Oracle删除表中大量数据卡顿的解决正确姿势总结

记一次数据库删除数据非常慢的处理流程

单表数据3000条左右,根据主键删除需要509秒

一. 首先查看SQL的执行计划:执行计划正常,cost只有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

select * from v$session_wait where sid=(上面sql查询的sid)

显示的event是db file sequential read,也没有异常。

三. 测试其他其他表和系统io是否有问题,没问题则进行下一步

四. 追踪sql日志:

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会返回路径

SELECT VALUE FROM V$PARAMETER WHERE NAME=’user_dump_dest’

找到最新的trace文件

执行—>tkprof orcl_ora_3708.trc myoutput.txt将trc文件转换为简单明了的txt文件

查看执行删除过程中有哪个操作时间过长

我发现的问题是在实行删除的过程中这个表有外键关联主表,会先查一遍这个表里有没有那个设备的记录,elapsed表示耗时

解决办法,外键加索引,或者取消外键代码里维护外键。

首先,不要被标题误导,分两种情况。

1. 删之前原表数据不要。2. 删之前保留原表数据。

oracle数据表有过万条数据后,删除数据就变的特别慢,有时甚至会卡死,所以在此分享一个小白操作,望对各位有帮助。

删除前: 从原表创建新表,即:先把需要的某些数据导入到新表里,或者不加条件即要删除原表的所有数据,从原表创建临时表(新表)。(相当于原模原样拷贝一份原表)

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 删除原表,把新表名称改为原表名称。到此结束,这样直接跳过删除原表因数据多造成卡死的现象节省时间。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:oracle中如何删除亿级数据Oracle怎么删除数据,Oracle数据删除的三种方式Oracle使用fy_recover_data恢复truncate删除的数据Oracle中实现删除重复数据只保留一条

© 版权声明

相关文章