分区表及分区索引(14)--截断、移动和重命名

来源:互联网 发布:简单的数据分析软件 编辑:程序博客网 时间:2024/05/17 05:57
全面学习分区表及分区索引(14)--截断、移动和重命名
1、截断表分区(Truncate Partition)


Truncate partition就像truncate table一样,直接从头部截断数据,用来删除数据那是效率超高无比。但是如果该表有外键引用的话,ddl的truncate就不好使了,这时候你只能要么使用delete,要么先disable掉外键关联再truncate了。同样,在不指定update indexes子句的情况下,truncate partition也会造成分区所在表的global索引失效。


语法非常简单:alter table tbname truncate partition/subpartition ptname;


例如:


SQL> insert into t_part_range values (1,'32432');
 
1 row inserted
 
SQL> insert into t_part_range values (2,'32432');
 
1 row inserted
 
SQL> commit;
 
Commit complete


 
SQL> select * from t_part_range partition(t_range_p1);
 
        ID NAME
---------- ----------
         1 32432
         2 32432
 
SQL> select * from t_part_range;
 
        ID NAME
---------- ----------
         1 32432
         2 32432
         8 no vaild..
 
SQL> alter table t_part_range truncate partition t_range_p1;
 
Table truncated
 
SQL> rollback; //rollback是不起作用的。你懂的。
 
Rollback complete
 
SQL> select * from t_part_range partition(t_range_p1);
 
        ID NAME
---------- ----------
 


 
 
 
 
 
 
 
2、移动表分区(Move Partition)
Move partition与modify partition的功能相似,但又比之更加强劲,比如可以修改分区所在表空间等等,与move table的操作很类似,某些时间也非常有用,比如降低行迁移。语法很简单:


Alter table tbname move partition/subpartition ptname .....;


SQL> select partition_name ,tablespace_name from user_tab_partitions
  2  where table_name = 'T_PART_RANGE';
 
PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
T_RANGE_MAX                    PART03
T_RANGE_P1                     PART01   //注意!!!!!!!!!!!!!!!!!!!!!!
T_RANGE_P2                     PART02
 
SQL> alter table t_part_range move partition t_range_p1 tablespace part02;
 
Table altered
 
SQL> select partition_name ,tablespace_name from user_tab_partitions
  2  where table_name = 'T_PART_RANGE';
 
PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
T_RANGE_MAX                    PART03
T_RANGE_P1                     PART02 //注意!!!!!!!!!!!!!!!!!!!!!!
T_RANGE_P2                     PART02
 
SQL> alter table t_part_range move partition t_range_p1 tablespace part01;
 
Table altered
 
SQL> select partition_name ,tablespace_name from user_tab_partitions
  2  where table_name = 'T_PART_RANGE';
 
PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
T_RANGE_MAX                    PART03
T_RANGE_P1                     PART01 //注意!!!!!!!!!!!!!!!!!!!!!!
T_RANGE_P2                     PART02






提示:move partition/subpartiton时会锁表,并且move partition/subpartiton视被移动分区中数据量的多少,会带来相应的IO操作。同时还需要注意,如果在move partition/subpartiton时没有指定update indexes子句,则被移动分区所在的local索引(注意哦!连LOCAL INDEX 也会失效!!!!)以及全局索引都会失效,需要手工rebuilding。
 
 
 
 3、重命名表分区(Rename Partition)
 就是改名,跟改表名、改列名的操作目的是类似的,语法也很简单:
 Alter table tbname rename partition ptname to newptname;




举个例子:
SQL> alter table t_part_range rename partition t_range_p1 to t_range_p11;
 
Table altered
 
SQL> select partition_name ,tablespace_name from user_tab_partitions
  2  where table_name = 'T_PART_RANGE';
 
PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
T_RANGE_MAX                    PART03
T_RANGE_P11                    PART01
T_RANGE_P2                     PART02


 
SQL> alter table t_part_range rename partition t_range_p11 to t_range_p1;
 
Table altered


SQL> select partition_name ,tablespace_name from user_tab_partitions
  2  where table_name = 'T_PART_RANGE';
 
PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
T_RANGE_MAX                    PART03
T_RANGE_P1                     PART01
T_RANGE_P2                     PART02


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原创粉丝点击