解决方案 »

  1.   

    合并两个分区成一个,适用于除hash之外的其它所有分区形式。
    语法很简单:alter table tbname merge partitions/subpartitions pt1,pt2 into partition/subpartition pt3;
    同样也支持update indexes子句以避免单独执行造成索引失效的问题。
    需要注意一点,要合并的两个分区必须是连续的,这点是由分区本身的特性所决定的
    分区表及分区索引(11)--合并表分区
      

  2.   

    我不是想合并分区,是想增加一条子分区的规则。因为现在没有子分区的规则,导致我无法添加list子分区。
      

  3.   

    刚百度了下,参考
    最近需要把一个大的分区表的分区重新进行安排。看了网上的资料,发觉有3种方法。
    1、alter table table_name split partition
    alter table table_name split partition在我的10.2.0.1好像有bug,有时候不能操作,而且速度很慢
    2、Oracle的在线重定义表功能
    尝试使用大表好像也不成功
    3、exp/imp
    最后我是使用这个方式,因为数据库是个历史库。
    1)exp使用tables方式就行了
    exp userid=host/report tables=(table_name) grants=n indexes=n constraints=n file=table_name.dmp log=table_name_exp.log
    2)重新建表,先不建索引和主键
    3)imp导入,几个参数需要注意。1、ignore=y因为表已经建了,有这个参数可以让表导入继续下去2、buffer要增加,否则会出错,我加到1000000。3、commit=y默认是表加载完才提交,表的数据太多了,会挤暴undo表分区,增加这个参数后buffer满了就提交。索引和主键我是导入数据后再建
    imp userid=host/report buffer=1000000 ignore=y commit=y tables=(table_name) grants=n indexes=n constraints=n file=table_name.dmp log=table_name_imp.log
    4)删除旧表后重建索引和主键
    create unique index pk_table_name on table_name (col1, col2) local tablespace tablespace_name;
    alter table table_name add constraint pk_table_name primary key(col1, col2);