目录
Rollback Segment
Rollback Segments是在你数据库中的一些存储空间,它用来临时的保存当数据库数据发生改变时的先前值。
Rollback Segment主要有两个目的:
1. 如果因为某种原因或者其他用用户想要通过ROLLBACK声明来取消一个人的数据操作,数据就会复原到之前为改变时的值。这种情况只在transaction的过程中有效。
如果用户执行了COMMIT命令,那么ROLLBACK SEGMENT里面的值就会标识为失效的,数据改变就将永久化。
2. 另一个目的是当有并发的session访问了一个数据值改变但事务还没有提交的表。
如果一个SELECT语句开始读取一个表同时一个事务也在修改这个表的值,那么修改前的值就会保存到rollback segment里面,SELECT语句也是从ROLLBACK SEGMENT里面读取表的值。
truncate与delete的区别
truncate table命令将快速删除数据表中的所有记录(保留数据表结构)。这种快速删除与delete from 数据表的删除全部数据表记录不一样。
delete命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而truncate命令删除的数据是不可以恢复的。咱们做一个测试:
1、建一个带有自增字段的表,加入100万数据
2、分别用TRUNCATE和DELETE删除全部数据(分别执行DELETE FROM `TABLENAME`; TRUNCATE FROM `TABLENAME`;DROP FROM `TABLENAME`;)
3、然后再向表里插入一条数据
最直观是:
1、TRUNCATE TABLE是非常快的
2、TRUNCATE之后的自增字段从头开始计数了,而DELETE的仍保留原来的最大数值
相同点:
truncate和不带where子句的delete, 以及drop都会删除表内的数据。
不同点:
1、truncate和delete只删除数据不删除表的结构,而drop语句不仅删除全部数据还删除了表的结构;
2、delete操作会放到rollback segement中,事务提交之后才生效也就是可以回滚。而truncate,drop操作之后原数据不放到rollback segment中,不能回滚
3、delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动,也就是自增ID不变化
4、速度,一般来说: drop>truncate >delete