将按月分区的表改为按天分区

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:370

[p=25, null, left][color=rgb(62, 62, 62)]随着业务的快速发展,数据库中表的数据增量也会明显上升,之前一个月只有10w数据的,现在可能一天就有10w,这个时候如果还是按照以前按月分区的策略进行访问,那么sql扫描单个分区要访问300w的数据,为了保证效率,可以将表改为按天分区,并对sql谓词条件进行调整使得只访问单天的一个分区,这样性能就得到了保证。
[p=25, null, left][color=rgb(62, 62, 62)]一般来说,按月分区的表都是range分区,下面来介绍将按月分区改为按天分区的方法:
[p=25, null, left][color=rgb(62, 62, 62)]1.range间隔分区的情况[p=25, null, left][color=rgb(62, 62, 62)]
间隔分区无法手工add partition ,会出现如下报错:[p=25, null, left][color=rgb(62, 62, 62)]ORA-14760 ADD PARTITION is not permitted on Interval partitioned objects
思路是先改为非间隔分区 ,然后手工按天add partition ,并建议再改成按天间隔,详见如下案列:
create table tmp_test_range
(
id number,
name varchar2(30),
int_date date
)
PARTITION BY RANGE(int_date)
interval(NUMTOYMINTERVAL (1,'MONTH'))
(
partition P201511 values less than(to_date('20151201','yyyymmdd')),
partition P201512 values less than(to_date('20160101','yyyymmdd')));
[p=25, null, left][color=rgb(62, 62, 62)]
ALTER TABLE tmp_test_range SET INTERVAL ();
[p=25, null, left][color=rgb(62, 62, 62)]alter table tmp_test_range add partition P20160101 values less than(to_date('20160102','yyyymmdd'));[p=25, null, left][color=rgb(62, 62, 62)]ALTER TABLE tmp_test_range SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));[p=25, null, left][color=rgb(62, 62, 62)]
2.range非间隔分区的情况[p=25, null, left][color=rgb(62, 62, 62)]思路是删除一些还没有使用的月分区,然后手工按天add partition ,并建议再改成按天间隔[p=25, null, left][color=rgb(62, 62, 62)]
create table tmp_test_range
(
id number,
name varchar2(30),
int_date date
)
PARTITION BY RANGE(int_date)
(
partition P201511 values less than(to_date('20151201','yyyymmdd')),
partition P201512 values less than(to_date('20160101','yyyymmdd')),[p=25, null, left][color=rgb(62, 62, 62)]partition P201601 values less than(to_date('20160201','yyyymmdd')));[p=25, null, left][color=rgb(62, 62, 62)]alter table tmp_test_range drop partition P201601;[p=25, null, left][color=rgb(62, 62, 62)]alter table tmp_test_range add partition P20160101 values less than(to_date('20160102','yyyymmdd'));
[p=25, null, left][color=rgb(62, 62, 62)]ALTER TABLE tmp_test_range SET INTERVAL (NUMTODSINTERVAL(1,'DAY'));

[p=25, null, left][color=rgb(62, 62, 62)]注意range分区表添加分区并不影响全局索引和本地分区索引,也不影响当前分区表的任何操作[p=25, null, left][color=rgb(62, 62, 62)]但修改interval的属性会造成短暂的锁并引起相关sql游标失效

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】