分区表及分区索引(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中
① 为所有分区各创建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中
相关文章推荐
- 深入学习分区表及分区索引(5)--创建range-hash组合分区
- 深入学习分区表及分区索引(5)--创建range-hash组合分区(续)
- 深入学习分区表及分区索引(6)--创建range-list组合分区
- 分区表及分区索引(6)--创建range-list组合分区
- 深入学习Oracle分区表及分区索引(4) --创建list分区
- oracle10G分区的创建与维护Oracle分区表和本地索引
- 分区表和分区索引的创建案例
- 创建空间数据分区表及分区索引步骤(oracle 10g 且关键字非字符型)
- SQL Server ->> 分区表上创建唯一分区索引
- oracle10G分区的创建与维护Oracle分区表和本地索引
- Oracle将已有数据的表改为分区表【创建表分区、索引分区】
- 创建分区表part_emp,再创建分区索引
- 分区表及分区索引(2)--创建range分区
- 分区表及分区索引(3)--创建hash分区
- 分区表及分区索引(4)--创建list分区
- PLSQL_Oracle分区表和相应的分区索引管理和使用(案例)(创建交易表等大表时进行分区提高效率)
- oracle12c 针对分区表的部分分区创建索引
- 分区表及分区索引创建示例
- Oracle的分区表和Local索引创建与维护