加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2019-09-23 00:16:34 所属栏目:MySql教程 来源:波波说运维
导读:概述 Oracle中,undo是保存记录的前镜像的,我理解如果delete from t;那产生的undo应该和t表的大小差不多,但测试结果却差的很远,undo产生的量基本上是t表大小的两倍,不知道为什么,难道我理解错了?下面看下这个奇怪的现象。 1. delete了8个小时 2. 原

概述

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大量数据的情况一定要分批进行,宁愿时间花多点,风险也会少很多,避免意外导致回滚而造成的数据库卡顿。

【编辑推荐】

  1. 详解Oracle数据库主键SYS_GUID()
  2. 关于Oracle数据库Kfk: Async Disk IO等待事件深度解析
  3. Oracle 推出了完全自治的操作系统
  4. Oracle发布全球最快的数据库机器Exadata X8M
  5. Oracle和MySQL的JDBC到底有多慢?
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读