将非分区表转换为分区表方法有好多种,以其中一种举例:
.交换分区:
1. 创建分区表,假设有 2 个分区,P1,P2.
2. 创建表 A 存放 P1 规则的数据。
3. 创建表 B 存放 P2 规则的数据。
4. 用表 A 和 P1 分区交换。 把表 A 的数据放到到 P1 分区
5. 用表 B 和 p2 分区交换。 把表 B 的数据存放到 P2 分区。
步骤:
1)创建分区表
SQL> create table p_dba
2 (id number(6),salary number(8,2))
3 partition by range(salary)
4 (
5 partition p1 values less than(8000),
6 partition p2 values less than(30000)
7 );
分区中列的数据格式必须要与及表中列的格式保持一致,不然在基表与分区进行交换时会出现以下错误:
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION
创建两个分别对应分区的基表:
SQL> create table dba_p1 as select employee_id,salary from hr.employees
2 where salary < 8000;
SQL> create table dba_p2 as select employee_id,salary from hr.employees
2 where salary > 8000 and salary < 30000;
将两个基表与两个分区进行交换:
SQL> alter table p_dba exchange partition p1 with table dba_p1;
SQL> alter table p_dba exchange partition p2 with table dba_p2;
SQL> select count(*) from p_dba partition(p1);
COUNT(*)
----------
71
SQL> select count(*) from dba_p2;
COUNT(*)
----------
0
可以看到数据从基表交换到了分区中
1.3.3 分区表的其他操作
1.增加新的分区
分两种情况:第一种是原分区的边界是maxvalue或者default。这种情况我们需要把边界分区drop掉,在添加新的分区。第二种是没有边界分区的,直接添加就行了。
对于局部的索引,oracle会自动增加一个局部分区索引。
SQL> select table_name,partition_name from user_tab_partitions
2 WHERE table_name='P_DBA';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
P_DBA P1
P_DBA P2
SQL> alter table p_dba add partition p3 values less than (34000);
SQL> select table_name,partition_name from user_tab_partitions
2 WHERE table_name='P_DBA';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
P_DBA P1
P_DBA P2
P_DBA P3
2.split 分区拆分
分区表会自动维护局部分区索引。全局索引会失效,需要进行 rebuild。
3.合并分区 merge
相邻的分区可以 merge 为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区, 原先的局部索引相应也会合并,全局索引
会失效,需要 rebuild。
4.移动分区
SQL> alter table p_dba move partition p2 tablespace users;
分区移动会自动维护局部分区索引,oracle 不会自动维护全局索引,所
以需要我们重新 rebuild 分区索引,具体需要 rebuild 哪些索引,可以通过
dba_part_indexes,dba_ind_partitions 去判断
5.TRUNCATE 分区
6.drop分区