数据表day_energy当前为月分区表,分区信息如下:DE_200912,DE_201001,DE_201002.....,月分区表出现速度查询慢,因此通过建立日分区表进行改善。
拆分月分区表的语句为:
alter table day_energy split partition de_201001 at('20100102') into (partition de_20100101,partition de_20100102)
分析:
alter table 表名 split partition 分区名 at (分割日期) into (新分区1,新分区2);
如果简单的分区1个月的表,比较简单,但是如果要拆分一年的表,那就太复杂了。为了简单实现所以就通过以下这个过程进行批量拆分:
-- czc 拆分分区表
--将月分区表拆分成日分区表
declare
v_tbl varchar2(56);
v_partion varchar2(56);
datetime date;
v_sql varchar2(1024);
v_dt0 varchar2(8);
v_dt1 varchar2(8);
begin
datetime:=to_date('2010-11-1','yyyy-MM-dd');
v_tbl:='day_energy';
while to_char(datetime,'yyyyMMdd')!='20110101' loop
if to_char(datetime,'MM')=to_char(datetime+1,'MM') then
v_dt0:=to_char(datetime,'yyyyMMdd');
v_dt1:=to_char(datetime+1,'yyyyMMdd');
if to_number(to_char(datetime,'dd'))=1 then
v_partion:='DE_'||to_char(datetime,'yyyyMM');
else
v_partion:='DE_'||to_char(datetime,'yyyyMMdd');
end if;
v_sql:='alter table '||v_tbl||' split partition '||v_partion||' at ('''||v_dt1||''') into (partition DE_'||v_dt0||', partition DE_'||v_dt1||');';
dbms_output.put_line(v_sql);
--execute immediate v_sql;
end if;
datetime:=datetime+1;
end loop;
end;
但是出问题了,发现day_energy表进行插入或者更新时,提示索引异常 错误码01502。凡是批量拆分的表,均有如此问题。
解决方法:
删除主键后重新建立:
alter table 表名 drop constraint 主键名;
为了防止以后再出类型问题,只需要手动执行alter语句即可。通过存储过程批量执行导致索引失效,直接执行语句便不会出问题。