介绍在Oracle中,undo是保存记录前的镜像。我明白如果从t中删除;那么生成的undo应该和t表的大小差不多,但是测试结果差了很多。undo产生的量基本上是t表大小的两倍。我不知道为什么。我弄错了吗?让我们来看看这个奇怪的现象。1.删??了8小时。2、可以发现原表的大小只有16.5G,要删除的数据有9G。3.检查撤销块。这里忘记截图了,但是有超过300万块。查看对应的undo空间占用了30多G,远远超过了原表的大小。为什么撤销会占用这么多空间?原则上,UNDO表空间有四个功能:回滚事务;一致的阅读;交易恢复;保存的是修改值的原像。注意不是修改后的数据块的映像,也不是整行记录。除了考虑表的大小外,还有表上索引的总大小,是否有触发器,物化尝试日志等等。另外看看数据库级别的补充日志是否开启。undo记录的是修改前的镜像,删除前的镜像就是表中存储的数据。当然还有一些东西可能会导致前面的图片比表中的原始数据大,比如压缩,11g之后存在的非空默认值。另外,undo记录必须有一些额外的开销,比如rowid,scn等信息。如果表中的行记录很少,这些成本就会非常突出。真的很难知道每一个额外的信息究竟是多少,但是通过这个实验,至少可以了解到一次delete操作删除的容量和UNDO为了保存之前的图像需要占用的容量都大于他多得多,这也是不建议一次删除操作删除太多数据的原因之一。总之,大量数据的删除必须分批进行。多花点时间就好了,风险也会小很多,避免意外回滚导致数据库卡死。
