在oracle生产环境经常会碰到delete大表很慢,job一直没有结束,不清楚当前进度怎么样了。
又或者说后悔了不想delete了,想直接truncate又苦恼回滚的话应用undo块进度要怎么查询,这篇文章以及下篇文章将一一回答你的疑问?不用谢,直接拿去用!

注意本篇文章重点是delete跟踪,想知道怎么优化delete以及回滚相关知识的记得关注博主,博主将在近期更新delete优化和回滚的相关查询知识。

首先,先告诉你delete进度有哪些手段可以查询:

1. v$SESSION,v$SESSION_LONGOPS,V$SQL的三表关联
2.v$transaction--事务跟踪视图,视图很好用,告诉你几个关键字段

一.先创建测试环境
1.创建测试表

create table DBA_OBJECTS_BAK as select * from DBA_OBJECTS

2.插入数据,要创建出一个至少一千万+的大表以模拟真实环境数据量
连续多次插入,之后提交数据

insert into dba_objects_bak select * from dba_objects_bak;
commit;

3.查询表记录是否达到千万级

select count(*) from DBA_OBJECTS_BAK

我这里是达到了2200w条记录
在这里插入图片描述
二.开始delete,在delete过程中查看视图,观察进度

delete from dba_objects_bak
SELECT SS.USERNAME,
SS.SID,
SS.SERIAL#,
SS.MACHINE,
SS.PROGRAM,
SL.OPNAME,
SL.TARGET,
SL.START_TIME,
ROUND(SL.SOFAR * 100 / SL.TOTALWORK, 2) || '%' AS PROGRESS,
SL.TIME_REMAINING,
SL.ELAPSED_SECONDS,
S.SQL_ID,
S.SQL_TEXT
FROM V$SESSION SS, V$SESSION_LONGOPS SL, V$SQL S
WHERE SL.SID = SS.SID
AND SS.SQL_ADDRESS = S.ADDRESS
AND SS.SQL_HASH_VALUE = S.HASH_VALUE
AND SL.TIME_REMAINING <> 0;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里有你想知道的一切关于这条delete的信息,几个关键字段:

1.username–执行delete语句的用户

2.start_time–sql开始执行的时间点

3.progress --sql进度的百分比,这里可以调整小数点,如果sql很慢的话建议多调几位小数,以观察

4.time_remaining–系统估计的剩余时间

5.elapesd_seconds --已经进行的时间

6.sql_id,sql_text --关于这条sql的id和具体文本

7.target --具体的执行对象

再看看另一张视图 有哪些内容呢?也一样好用,已知我们需要删除的行数record为:22108928条

在这里插入图片描述
这里的几个关键字段:

1.used_urec --18474364 此字段为undo记录的条数,因为delete过程中是需要将已删除的记录写回到undo中,所以此字段可以知道你当前已经删除了多少条记录了,此纪录有时候可能有一些偏差但基本是正确的,会稍微多一些记录,原因未知,也许是算法不一样?有知道的朋友可以告诉下博主。

2.xid --事务id号 可以关联其他视图查看相关会话信息

3.start_date --开始时间

4.log_id,phy_io,cr_get 逻辑io,物理io,一致读

如果delete未完成就truncate表,此时truncate表会发生资源占用。

在这里插入图片描述

下篇文章将引导大家了解一下回滚进度查询以及回滚可能造成的影响以及如何优化delete加快delete删除,减少delete表对数据库以及业务的影响~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐