系统工单运行了一年,系统主表:工单表tbl_wo与工单实例表tbl_task频繁读写,每个表的数据量都>2000W,成为系统的一个瓶颈,为此使用了oracle的大表分区,解决大量数据造成系统缓慢问题,中间遇到些坑,记录下来,下面是具体的操作步骤:
1.停止所有应用
涉及到频繁操作的表做大表分区,最理想的情况是停止所有应用,不停风险控不了
2.将tbl_wo与tbl_task改名为tbl_wo_back与tbl_task_back
需要备份的,可以使用第四点nologging append将数据考到临时表,2000W数据7分钟复制完,当然也可以不备份,改个名字几秒钟完事,节省上线时间。
3. 根据create_date日期型字段按天创建tbl_wo与tbl_task表
由于系统的tbl_wo与tbl_task表大部分查询按天操作,所以按天做表分区,大家具体情况具体分析,表怎么分区自行百度
create table TBL_TASK
(
task_id VARCHAR2(12) not null,
create_date DATE
)PARTITION BY RANGE (CREATE_DATE) INTERVAL (NUMTODSINTERVAL(1, 'day'))
(partition part_task01 values less than(to_date('2018-01-01', 'yyyy-mm-dd')));
;
6.将tbl_wo_back与tbl_task_back数据拷贝到tbl_wo与tbl_task
2000W以上的数据使用nologging append方式插入,我这边是开了两个sqlplus,分别插入tbl_wo与tbl_task,7分钟复制完成
alter table TBL_TASK_BACK nologging;
insert /*+ append */ into TBL_TASK_BACK select * from TBL_TASK;
commit;
alter table TBL_TASK_BACK logging;
5.删除tbl_wo_back与tbl_task_back的索引(一定要删除),重建tbl_wo与tbl_task索引
tbl_wo与tbl_task直接改名为tbl_wo_back与tbl_task_back,原来属于tbl_wo与tbl_task的索引名字没变,但是索引已经是tbl_wo_back与tbl_task_back的,所有必须删掉tbl_wo_back与tbl_task_back的索引,重建tbl_wo与tbl_task的索引
5.重启应用