数据库删除数据为什么占用空间接近原表两倍?

    作者:课课家教育更新于: 2019-09-23 10:51:55

    删除一张大表时为什么undo占用空间接近原表两倍?大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。换而言之,如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对数据的“加工能力”,通过“加工”实现数据的“增值”。

    概述

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

    数据库删除数据为什么占用空间接近原表两倍_数据库_数据分析_数据管理_课课家

    1. delete了8个小时

    2. 原表大小

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

    3. 查看undo块

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

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

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

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

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

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

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

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

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

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

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

    大数据(big data)是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点,即大量(Volume)、高速(Velocity)、多样(Variety)、低价值密度(Value)、真实性(Veracity)。它并没有统计学的抽样方法,只是观察和追踪发生的事情。 大数据的用法倾向于预测分析、用户行为分析或某些其他高级数据分析方法的使用。

课课家教育

未登录