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

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




① 为所有分区各创建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中
 
 
 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值