opli 发表于 2014-6-26 08:50:02

用exchange partition和split partition将表分区。



本文是以下面文章为基础做练习测试:

http://www.oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition.php

这个方法更适合在生产环境中将普通表变为分区表。

主要方法有分区转换与分区分裂。
一.创建一个模拟环境

1. 创建一个小表

SQL> create table lookup(

id number(10),

description varchar2(50)

);

加主键

SQL> alter table lookup add ( constraint lookup_pk primary key(id));

插入数据

SQL> INSERT INTO lookup (id, description) VALUES (1, 'ONE');

INSERT INTO lookup (id, description) VALUES (2, 'TWO');

INSERT INTO lookup (id, description) VALUES (3, 'THREE');



2.创建一个大表

SQL> CREATE TABLE big_table (

idNUMBER(10),

created_dateDATE,

lookup_idNUMBER(10),

dataVARCHAR2(50)

);

增加数据:



SQL> declare

t_lookup_id lookup.id%TYPE;

t_create_date date;

begin

for i in 1 .. 1000000 loop

if mod(i,3)=0 then

t_create_date:=add_months(sysdate,-24);

t_lookup_id :=2;

elsif mod(i,2)=0 then

t_create_date:=add_months(sysdate,-12);

t_lookup_id :=1;

else

t_create_date:=sysdate;

t_lookup_id:=3;

end if;

INSERT INTO big_table(id, created_date, lookup_id, data) VALUES (i, t_create_date, t_lookup_id, 'This is some data for ' || i);

end loop;

commit;

end;

/

加主键

ALTER TABLE big_table ADD (

CONSTRAINT big_table_pk PRIMARY KEY (id)

);

加外键

ALTER TABLE big_table ADD (

CONSTRAINT bita_look_fk

FOREIGN KEY (lookup_id)

REFERENCES lookup(id)

);

加索引

CREATE INDEX bita_created_date_i ON big_table(created_date);

CREATE INDEX bita_look_fk_i ON big_table(lookup_id);



收集表信息

EXEC DBMS_STATS.gather_table_stats(USER, 'LOOKUP', cascade => TRUE);

EXEC DBMS_STATS.gather_table_stats(USER, 'BIG_TABLE', cascade => TRUE);
二.创建一个分区的目标表。

SQL> create table big_table2 (

2id number(10),

3created_date date,

4lookup_id number(10),

5data varchar2(50)

6)

7partition by range (created_date)

8(partition big_table_2013 values less than (maxvalue));

增加主键:

SQL> alter table big_table2 add (

2constraint big_table_pk2 primary key(id)

3);

增加相应的索引

SQL> create index bita_created_date_i2 on big_table2(created_date) local;

SQL> create index bita_look_fk_i2 on big_table2(lookup_id) local;



增加外键

SQL>

1alter table big_table2 add(

2constraint bita_look_fk2

3foreign key(lookup_id)

4* references lookup(id))

SQL> /
三.分区交换(EXCHANGE PARTITION)

SQL> alter table big_table2

2exchange partition big_table_2013

3with table big_table

4without validation

5update global indexes;

SQL> drop table big_table;

SQL> rename big_table2 to big_table;

SQL> alter table big_table rename constraint big_table_pk2 to big_table_pk;

SQL> alter table big_table rename constraint bita_look_fk2 to bita_look_fk;

SQL> alter index big_table_pk2 rename to big_table_pk;

SQL> alter index bita_look_fk_i2 rename to bita_look_fk_i;

SQL> alter index bita_created_date_i2 rename to bita_created_date_i;
四.分区分裂(SPLIT PARTITION)

SQL> alter table big_table

2split partition big_table_2013 at(to_date('31-dec-2010 23:59:59','DD-MON-YYYY HH24:MI:SS'))

3into (partition big_table_2010,

4partition big_table_2013)

5update global indexes;



SQL> alter table big_table

2split partition big_table_2010 at(to_date('31-dec-2008 23:59:59','DD-MON-YYYY HH24:MI:SS'))

3into (partition big_table_2008,

4partition big_table_2010)

5update global indexes;

SQL> alter table big_table

2split partition big_table_2013 at(to_date('31-dec-2012 23:59:59','DD-MON-YYYY HH24:MI:SS'))

into (partition big_table_2012,

partition big_table_2013)

update global indexes;



SQL> exec dbms_stats.gather_table_stats(user,'big_table',cascade=>true);
五.进行检查:

SQL> select partitioned from user_tables

2where table_name='BIG_TABLE';



PAR

---

YES

SQL> select partition_name,num_rows from user_tab_partitions

where table_name='BIG_TABLE';2



PARTITION_NAME                   NUM_ROWS

------------------------------ ----------

BIG_TABLE_2008                        0

BIG_TABLE_2010                        0

BIG_TABLE_2012                     666667

BIG_TABLE_2013                     333333




页: [1]
查看完整版本: 用exchange partition和split partition将表分区。