前言
最近因业务需要,重构业务核心,对老业务表进行拆表跑数据。在testapi环境经历过一波试跑后信心满满准备正式生产环境开跑。
1:为什么
试跑数据产生了近100万条,需要清空表后重新跑。考虑选一个清空库表的最优方案。
2:是什么
目前方案有两种:
- 方法一:使用 delete from [表名] 生成日志
- 方法二:使用 truncate table [表名] 无日志生成
- 方法三:使用 drop table [表名] 无日志生成
两种方式,前者更慢一点,真的是删除数据,好处就是可筛选删除。后者直接
3:原理剖析
-
delete
DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 - truncate
一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。 truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage,。
不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。
- drop
将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
方案 | 速度 | 删除内容 | 事务 | 是否可恢复 |
---|---|---|---|---|
delete | 最慢 | 表中数据(可筛选) | 事务可回滚 | 可恢复 |
truncate | 次快 | 表中所有数据 | 不可回滚 | 不可恢复(直接恢复不行的,不过有办法通过执行前的日志来恢复,下面有个例子) |
drop | 最快 | 连表一起删除 | 不可回滚 | 不可恢复 |
4:科普数据库语言
- DDL (Data Definition Language 数据定义语言)
数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言。
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop index 删除索引
当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。
如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create table),此时来自insert命令的数据将被提交到数据库。
当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。 - DML (Data Manipulation Language 数据操作语言)
DML是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。insert 将记录插入到数据库 update 修改数据库的记录 delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。
除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动发出commit命令,使未提交的DML命令提交。 - DCL(Data Control Language)——数据控制语言。
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
数据库控制功能,用来设置或更改数据库用户或角色权限的语句,包括grant,deny,revoke等语句。
在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL 详细解释。
(1)COMMIT - save work done 提交
(2)SAVEPOINT - identify a point in a transaction to which you can later roll back 保存点
(3)ROLLBACK - restore database to original since the last COMMIT 回滚
(4)SET TRANSACTION - Change transaction options like what rollback segment to use 设置当前事务的特性,它对后面的事务没有影响
引用: