为什么删除大表时undo会占用原表近两倍的空间?

分类:编程技术 时间:2024-02-20 16:10 浏览:0 评论:0
0
本文将详细解释为什么删除大表时undo会占用原表近两倍的空间。文章内容质量较高,小编分享给大家,作为参考。希望您看完本文后对相关问题有一些想法。知识有一定的了解。

概述

在Oracle中,undo是所保存记录的原像。我明白如果从 t 中删除;生成的撤消应该与 t 表的撤消相同。尺寸几乎一样,但测试结果却相差甚远。生成的undo量基本上是t表大小的两倍。我不知道为什么。难道是我理解错了?我们来看看这个奇怪的现象。

1.删除8小时

2.原表大小

可以发现原表只有16.5G,需要删除的数据有9G。

>

3.查看undo块

这里忘记截图了,不过块数超过300万,查看对应的占用情况undo空间占用超过30G,远超原始表的大小。

为什么undo占用这么大的空间?

原则上,UNDO表空间有四个功能:

回滚事务;

一致性读;

事务恢复;

闪回查询

请向杨老询问一些信息:

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

除了考虑表的大小外,还有表上索引的总大小、是否有触发器、物化尝试日志等。另外,检查数据库级别是否补充日志已打开。

撤消之前记录的图像一个东西被修改了,删除前的镜像就是表中存储的数据。当然,前面的图片比表中原始数据大的原因也有一些可能,比如压缩以及11g之后存在的非空默认值。

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

确实很难很准确地知道每个附加信息有多少,但通过这个实验,你至少可以了解一次删除操作删除的容量。为了保存之前的图像,UNDO 需要占用的容量远不止于此。这也是不建议在一次删除操作中删除太多数据的原因之一。

总之,删除大量数据时,必须分批进行。如果您愿意花更多时间,则风险w会少很多,并且避免意外回滚造成的数据库滞后。

我在这里分享一下为什么删除大表时undo会占用原表近两倍的空间。希望以上内容能够对大家有所帮助,能够学到更多的知识。 。如果您觉得文章不错,可以分享出去,让更多的人看到。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 为什么删除大表时undo会占用原表近两倍的空间?

用户评论