您的位置:首页 > 其它

分区表及分区索引(5)--创建range-hash组合分区

2011-11-02 10:45 429 查看
组合分区相对于普通分区,语法上稍稍复杂了一些,但也正因如此,其子分区的创建可以非常灵活,下面分别举几个例子(注:仅示例,并非穷举所有形式)

① 为所有分区各创建3个hash子分区

SQL> create table t_part_rh (id number ,name varchar2(10))

2 partition by range(id) subpartition by hash(name)

3 subpartitions 3 store in (part01,part02,part03)(

4 partition t_r_p1 values less than (10) tablespace part01,

5 partition t_r_p2 values less than (20) tablespace part02,

6 partition t_r_p3 values less than (maxvalue) tablespace part03);

Table created

//查看

SQL> select partitioning_type ,subpartitioning_type,partition_count,def_subpartition_count

2 from user_part_tables

3 where table_name = 'T_PART_RH';

PARTITIONING_TYPE SUBPARTITIONING_TYPE PARTITION_COUNT DEF_SUBPARTITION_COUNT

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

RANGE HASH 3 3

SQL> select partition_name ,subpartition_count,high_value

2 from user_tab_partitions

3 where table_name = 'T_PART_RH';

PARTITION_NAME SUBPARTITION_COUNT HIGH_VALUE

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

T_R_P1 3 10

T_R_P2 3 20

T_R_P3 3 MAXVALUE

SQL> select partition_name,subpartition_name ,tablespace_name

2 from user_tab_subpartitions

3 where table_name = 'T_PART_RH';

PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME

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

T_R_P1 SYS_SUBP53 PART01

T_R_P1 SYS_SUBP54 PART01

T_R_P1 SYS_SUBP55 PART01

T_R_P2 SYS_SUBP56 PART02

T_R_P2 SYS_SUBP57 PART02

T_R_P2 SYS_SUBP58 PART02

T_R_P3 SYS_SUBP59 PART03

T_R_P3 SYS_SUBP60 PART03

T_R_P3 SYS_SUBP61 PART03

//测试数据

SQL> begin

2 for x in 1..31 loop

3 insert into t_part_rh values ( x,'tiger'||x);

4 end loop;

5 end;

6 /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> select * from t_part_rh partition(t_r_p1) order by id desc;

ID NAME

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

9 tiger9

8 tiger8

7 tiger7

6 tiger6

5 tiger5

4 tiger4

3 tiger3

2 tiger2

1 tiger1

9 rows selected

② 只对某个分区创建hash子分区

SQL> drop table t_part_rh purge;

Table dropped

SQL> create table t_part_rh (id number,name varchar2(10))

2 partition by range(id) subpartition by hash (name)(

3 partition t_r_p1 values less than (10) tablespace part01,

4 partition t_r_p2 values less than (20) tablespace part02,

5 partition t_r_p3 values less than (maxvalue) tablespace part03

6 (subpartition t_r_p3_h1 tablespace part01,
//注意这个地方

7 subpartition t_r_p3_h2 tablespace part02,

8 subpartition t_r_p3_h3 tablespace part03));

Table created

SQL> select partitioning_type ,subpartitioning_type ,partition_count,def_subpartition_count

2 from user_part_tables

3 where table_name = 'T_PART_RH';

PARTITIONING_TYPE SUBPARTITIONING_TYPE PARTITION_COUNT DEF_SUBPARTITION_COUNT

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

RANGE HASH 3 1 //这个地方为什么是1?是表示只有1个分区是含有子分区吗?

SQL> select partition_name,subpartition_count,high_value

2 from user_tab_partitions where table_name = 'T_PART_RH';

PARTITION_NAME SUBPARTITION_COUNT HIGH_VALUE

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

T_R_P1 1 10

T_R_P2 1 20

T_R_P3 3 MAXVALUE

SQL> select partition_name ,subpartition_name ,tablespace_name

2 from user_tab_subpartitions

3 where table_name = 'T_PART_RH';

PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME

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

T_R_P1 SYS_SUBP68 PART01

T_R_P2 SYS_SUBP69 PART02

T_R_P3 T_R_P3_H1 PART01 //果然这里并不是Partition 3 所在的TABLESPACE就只存在于PART03中。

T_R_P3 T_R_P3_H2 PART02 //而是存在于PART01~03 全部中。

T_R_P3 T_R_P3_H3 PART03

/////////////////////////////////////////为了证明T_R_P3可能会有数据在PART01,PART02/////////////////////////////////////////

SQL> select * from t_part_rh partition(t_r_p3);

ID NAME

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

SQL> begin

2 for x in 21..100 loop

3 insert into t_part_rh values (x,'tiger'||x);

4 end loop;

5 end;

6 /

PL/SQL procedure successfully completed

SQL> commit;

Commit complete

SQL> select distinct dbms_rowid.rowid_relative_fno(rh.rowid) data_file#

2 from t_part_rh partition(t_r_p3) rh

3 order by data_file# asc;

DATA_FILE#

----------

7 //果然在不同的DATAFILE中

8 //果然在不同的DATAFILE中

9 //果然在不同的DATAFILE中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: