先来看一个需求案例:
需求:在sales表中添加一个分区,最后这个分区信息为:
p1 less than(5000)
p2 less than(10000)
p3 less than(15000)
p4 less than(maxvalue)
要求以前的数据不能丢失。
create table sales(
pid number(10) primary key,
sale number(8,2)
)partition by range(sale)( --按销售额分区
partition p1 values less than(5000),
partition p2 values less than(10000),
partition p3 values less than(maxvalue)
);
分析:要更改后的分区信息不仅仅是多了p4分区,还要将原来的p3分区改成p4,所以这里要先备份原来 p3分区的信息,再添加。
- 先备份p3分区中的数据
create table temp as select *from sales partition(p3);
select *from temp;
- 删除最高的那个分区
alter table sales drop partition p3;
- 查看现有的分区
select *from user_tab_partitions where table_name='SALES';
- 创建新分区
alter table sales add partition p3 values less than(12000);
alter table sales add partition p4 values less than(maxvalue);
- 查看索引
select *from user_indexes;
- 重建索引
alter index SYS_C0011609 rebuild;
- 将原来的数据还原
insert into sales select *from temp;
- 删除备份表
drop table temp;
ok,到此已经完成了需求,现在可以查询一下是否已经更改了。
- 查看p3分区
select *from sales partition(p3);
另外还有几个分区操作:
- 截断分区 –删除指定分区中的数据
alter table sales truncate partition p4;
- 合并分区
alter table sales merge partition p2,p3 into partition p3;
- 拆分分区
alter table sales split partition p3 at(8000) into (partition p2,partition p3);
海量数据优化_分区索引与删除的关系
案例: 有一个项目团队发现他们的项目上线后会在上午的时候接到用户投诉查询缓慢但并不阻塞只不过时间比正常时慢很多
经过对数据库进行分析发现这个时间的数据库资源使用非常严重, CPU的使用率达到了80%,但此时数据库的压力并不大,通过进一步的分析发现数据库中运行了
大量的这样的语句: delete from t_name where j_time<to_date( '2015-04-04','yyyy-mm-dd');
通过与开发单位联系知道他们有一个定时任务在凌晨2点后开始执行,删除1个月前的数据以便释放空间.
此时一个月差不多有1000W条数据这样删除的开销非常的大。
解决方案 : 可以使用分区来解决这个问题. 设定保留历史数据的规则是: 删除最早一个月的数据。 按照这个需求,将需要删除的数据的表修改为分区表,
按照每个月一个分区的方式来创建分区 这样删除操作就变成了删除分区了