先说结论:truncate比delete删除数据快的多!
最近因为性能和一些业务问题,在数据库造了大量的数据,但是需要去验证问题的时候,数据库的数据太多,通过SQL语句查询也比较麻烦,就想偷个懒全删数据,重新来,但是手动删除的效率是真的慢,尝试了delete也不快,想到之前看到的一个truncate。果然删除速度是真的快。【当然,删除表再建表最快】
目录
一、删除语句
1、Delete删除
delete from table_name
eg:delete from material_set
2、Truncate 删除
truncate table table_name
eg:truncate table material_set
二、Delete和Truncate区别
1. 条件删除、2. 事务回滚、3. 清理速度、4. 高水位重置。
1. 条件删除
delete是可以带WHERE的,所以支持条件删除;而truncate只能删除整个表,不支持条件删除。
eg:delete from material_set where material_set_no = '1'
2、事务回滚
delete是数据操作语言(DML - Data Manipulation Language),操作时原数据会被放到 rollback segment中,可以被回滚。
truncate是数据定义语言(DDL - Data Definition Language),操作时不会进行存储,不能进行回滚。
3、清理速度
在数据不多的情况下,delete和truncate删除的速度差别不会很大,但是当数据比较多的时候,truncate明细比delete快的多。
delete删除不影响表所占用的extent,每次都是删除一行,可以在不删除表的情况下删除所有行,表结构,表属性,表索引都是完整的,而且会在事务日志中记录删除的每项记录,所有会较慢,但是比较安全。
truncate不需要回滚,所以用到的系统和事务日志资源比较少,所以删除数据比较快。
4. 高水位重置
随着不断地进行表记录的DML操作,会不断提高表的高水位线(HWM),delete操作之后虽然表的数据删除了,但是并没有降低表的高水位,随着DML操作数据库容量也只会上升,不会下降。所以如果使用delete,就算将表中的数据减少了很多,在查询时还是很和delete操作前速度一样。