删除一张大表时为什么undo占用空间接近原表两倍?

数据库 其他数据库
Oracle中,undo是保存记录的前镜像的,我理解如果delete from t;那产生的undo应该和t表的大小差不多,但测试结果却差的很远,undo产生的量基本上是t表大小的两倍,不知道为什么,难道我理解错了?

概述

Oracle中,undo是保存记录的前镜像的,我理解如果delete from t;那产生的undo应该和t表的大小差不多,但测试结果却差的很远,undo产生的量基本上是t表大小的两倍,不知道为什么,难道我理解错了?下面看下这个奇怪的现象。

删除一张大表时为什么undo占用空间接近原表两倍?

1. delete了8个小时

删除一张大表时为什么undo占用空间接近原表两倍?

2. 原表大小

可以发现原表也就16.5G,需要删的数据是9G。

删除一张大表时为什么undo占用空间接近原表两倍?

3. 查看undo块

这里忘记截图了,但是是有300多万个块,查看对应占用的undo空间是占了30多G,远远超过原表的大小。

为什么undo会占用这么多空间?

从原理上讲,UNDO表空间,有四个作用:

  • 回滚事务;
  • 一致性读;
  • 事务恢复;
  • 闪回查询

请教杨长老得到的一些信息:

对于回滚事务,他保存的是修改值的前镜像,注意,不是修改的数据块,或者整行记录的镜像。

除了考虑表大小之外,还有表上索引的总大小,是否存在触发器,物化试图日志等等。另外,看看数据库级的supplemental log是否打开。

undo是记录事物修改前镜像的,而delete的前镜像就是表中存储的数据。当然有一些可能会导致前镜像比表中的原始数据大,比如压缩,11g后存在的非空默认值。

另外,undo的记录一定有一些额外的成本,比如rowid,scn等信息,如果表中行记录本身很小,那么这些成本就会显得非常突出。

如果要非常精确地知道,多出来的每一个信息是多少,确实有些困难,但通过这个实验,至少能了解到,一次delete操作删除的容量,UNDO为了保存前镜像,需要占据的容量,要比他多得多,这就是为什么不推荐一次delete操作删除过多数据的原因之一。

总之,对于delete大量数据的情况一定要分批进行,宁愿时间花多点,风险也会少很多,避免意外导致回滚而造成的数据库卡顿。

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2022-01-04 08:21:53

操作系统内存

2009-10-26 16:13:29

Oracle使用UND

2021-03-05 08:29:20

DeleteMysql数据结构

2009-10-22 16:25:53

Oracle UNDO

2009-10-26 17:07:17

VB.NET UNDO

2021-01-08 08:10:34

MySQL表空间回收

2022-11-17 12:09:51

2022-12-26 08:07:03

MySQL批量数据

2010-04-08 15:59:50

Oracle undo

2021-02-09 17:21:55

SQL数据库存储

2021-02-02 21:50:31

MySQL 8.0ExcelMySQL 5.7

2011-04-13 09:31:50

Oracle

2022-01-18 08:29:58

Oracle数据库后端开发

2010-05-10 18:05:15

Oracle释放und

2023-10-09 13:17:28

2012-11-14 11:18:29

Mysql

2012-07-12 10:46:39

微软

2015-05-08 11:23:41

谷歌IO大会

2011-08-24 14:42:14

Oracle 10gUNDO数据的作用UNDO表空间

2020-08-06 08:00:51

数据分页优化
点赞
收藏

51CTO技术栈公众号