思维导图
概述
delete from t where create_time < to_date('2017-01-01','yyyy-mm-dd');
当我们看到这条语句时,会想到什么呢? 一条再简单不过的按照条件删除数据库的操作。 如果大量存在,会不会引起系统性能问题呢?
当这个表的数据足够大时,按照这样的方式来清除数据,代价无疑是非常高昂的。
我们提出使用分区的方式来解决这个问题。比如 保留历史数据的骨折是,删除最早一个月的数据,按照这个需求,将需要删除数据的表,改为分区表。 按照每个月一个分区的方式创建分区表。
这样做的结果是,以前的delete操作就变成了下面的操作:
alter table t drop partition p_name 或者 alter table t truncate partiton p_name ;
这个操作对已一个几GB数据的分区表来讲,执行时间不超过10S。
比起使用分区来操作数据,DELETE方式操作数据的问题是显而易见的,至少存在如下两点:
- 消耗大量的系统资源
- 无法释放空间
DELETE与系统资源
在DELETE操作中,sql语句首先要扫描表或者索引找到符合条件的记录,然后把他们删除,这个过程中将消耗大量的cpu资源和产生大量的I/O,同时还会产生大量的undo数据。
下面是一个简单的栗子,我们可以看出delete相对于drop或者truncate对资源的消耗情况:
这里写代码片