思路:
1、在一个事务中插入大量数据,观察磁盘空间的变化;然后回滚事务,再次观察磁盘空间的变化,以此分析事务提交与回滚对磁盘空间占用的影响。
2、分别使用delete、truncate和drop来删除三张内容一致的表,观察表空间释放的规律。
1、记录未建表空间、表之前的磁盘使用情况、目录文件大小
2、新建三个表空间TEST01、TEST02、TEST03:
create tablespace “TEST01” datafile ‘/dm8/data/DAMENG/TEST01.DBF’ size 288 autoextend on maxsize 16777215 CACHE = NORMAL;
create tablespace “TEST02” datafile ‘/dm8/data/DAMENG/TEST02.DBF’ size 224 autoextend on maxsize 16777215 CACHE = NORMAL;
create tablespace “TEST03” datafile ‘/dm8/data/DAMENG/TEST03.DBF’ size 224 autoextend on maxsize 16777215 CACHE = NORMAL;
最初的表空间使用情况
3、在表空间TEST01中创建表T_TEST1:
create table "SYSDBA"."T_TEST1"
(
"T_ID" INT,
"T_NAME" VARCHAR(20),
"T_SEX" VARCHAR(6)) storage(on "TEST01",clusterbtr);
创建T_TEST1表后的TEST01表空间属性
新建3个表空间、1个表T_TEST1后的磁盘情况、目录文件大小
4、往T_TEST1表中插入5000000条数据
BEGIN
FOR i IN 1..5000000 LOOP
INSERT INTO T_TEST1(T_ID,T_NAME,T_SEX)
VALUES(i,'NAME_','M');
END LOOP;
END;
插入语句顺利执行完后,TEST01表空间使用率情况
插入语句顺利执行完后,发现磁盘部分使用率增大、目录文件变大
5、对T_TEST1表刚刚的插入操作进行回滚,回滚后表空间使用率降低至0.69%
但插入操作回滚后的磁盘占用情况跟目录文件的大小没有发生变化:
6、将表T_TEST1的内容复制生成表T_TEST2、T_TEST3:
create table if not exists T_TEST2 tablespace TEST02 as select*from T_TEST1;
create table if not exists T_TEST3 tablespace TEST03 as select*from T_TEST1;
查看表T_TEST2、T_TEST3的表空间占用情况
7、统一查看三张表的表空间占用情况(初始化时,表空间TEST01设置的较大)
8、分别使用delete、truncate和drop来删除表T_TEST1、T_TEST2、T_TEST3:
delete from T_TEST1;
truncate table T_TEST2;
drop table T_TEST3;
9、执行完三条语句,即刻查看表空间占用情况,发现T_TEST2的表空间立即释放,其他两个表并没有立即释放
三个表删除后的即刻表空间占用情况
10、查询UNDO_RETENTION回滚段保留时长,发现为默认90s
UNDO_RETENTION回滚段保留时长
11、过段时间后(90s过后),再查看表空间占用情况,发现T_TEST1、T_TEST3的表空间也被释放
三张表都进行了删除操作后,发现磁盘占用率与目录文件的大小不会随表的删除而降低。
1、在DM数据库中,未提交事务的数据通常首先被存储在内存中。当事务开始时,数据库会在内存中分配一个事务缓冲区来存储该事务的所有操作。这些操作在提交之前不会被写入磁盘。
当事务回滚时,事务中对数据库的所有更新操作都会被撤销,数据库将回滚到事务开始时的状态。回滚事务通常不会直接增加磁盘空间的占用,它只是撤销了之前已经占用的磁盘空间上的更新操作。回滚操作导致了数据的删除或重新组织,会间接地影响磁盘空间的占用情况,ROLL表空间会增大。回滚语句或者删除表会释放表空间,但磁盘大小不会因此自动减小。
当事务提交时,事务中对数据库的所有更新操作都会被永久地写入磁盘上的物理数据库中。这意味着,这些更新操作所占用的磁盘空间将成为数据库持久化存储的一部分。
DM数据库通过内存管理、回滚段管理和磁盘存储等方式来管理未提交事务的数据存储,并确保在事务提交或回滚时能够正确地处理磁盘空间的占用情况。
2、用truncate来处理表,表空间会立即释放,而delete表和drop表后,表空间会在UNDO_RETENTION回滚段保留时长过后释放。
补充:在实践过程中有遇到磁盘空间被占满的情况
发现可以修改ROLL.DBF文件的大小来释放部分磁盘空间:
文章
阅读量
获赞