创建range-list组合分区
Range-list组合分区的创建与range-hash极为相似,只是子分区为list分区,当然同样也可以应用分区模板,下面也举一个示例:
JSSWEB> create table t_partition_rl (id number,name varchar2(50))
2 partition by range(id) subpartition by list(name)
3 subpartition template (
4 subpartition l1 values ('aa') tablespace tbspart01,
5 subpartition l2 values ('bb') tablespace tbspart02,
6 subpartition l3 values ('cc') tablespace tbspart03,
7 subpartition l4 values ('dd') tablespace tbspart04)(
8 partition t_r_p1 values less than (10) tablespace tbspart01,
9 partition t_r_p2 values less than (20) tablespace tbspart02,
10 partition t_r_p3 values less than (30) tablespace tbspart03,
11 partition t_r_pd values less than (maxvalue) tablespace tbspart04);
表已创建。
JSSWEB> select partition_name,subpartition_name,tablespace_name
2 from user_tab_subpartitions where table_name='T_PARTITION_RL';
PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME
--------------- ------------------------------ --------------------
T_R_P1 T_R_P1_L4 TBSPART01
T_R_P1 T_R_P1_L3 TBSPART01
T_R_P1 T_R_P1_L2 TBSPART01
T_R_P1 T_R_P1_L1 TBSPART01
T_R_P2 T_R_P2_L4 TBSPART02
T_R_P2 T_R_P2_L3 TBSPART02
T_R_P2 T_R_P2_L2 TBSPART02
T_R_P2 T_R_P2_L1 TBSPART02
T_R_P3 T_R_P3_L4 TBSPART03
T_R_P3 T_R_P3_L3 TBSPART03
T_R_P3 T_R_P3_L2 TBSPART03
T_R_P3 T_R_P3_L1 TBSPART03
T_R_PD T_R_PD_L4 TBSPART04
T_R_PD T_R_PD_L3 TBSPART04
T_R_PD T_R_PD_L2 TBSPART04
T_R_PD T_R_PD_L1 TBSPART04
已选择16行。
其它方式的创建对于range-list同样好使,这里不再举例,如有不明,请自学复习前章range_hash组合分区。
对于复合分区的local索引,我们也举一个示例,查看其分区情况:
SQL> create index idx_part_rl_id on t_partition_rl(id) local;
索引已创建。
又可以学几个数据字典:user_part_indexes、user_ind_partitions前面已经认识了,user_ind_subpartitions用来查询索引的子分区信息。
SQL> select table_name,partitioning_type,
2 partition_count,def_subpartition_count
3 from user_part_indexes
4 where index_name = 'IDX_PART_RL_ID';
TABLE_NAME PARTITI PARTITION_COUNT DEF_SUBPARTITION_COUNT
------------------------------ ------- --------------- ----------------------
T_PARTITION_RL RANGE 4 4
SQL> select partition_name, subpartition_count, high_value
2 from user_ind_partitions
3 where index_name = 'IDX_PART_RL_ID';
PARTITION_NAME SUBPARTITION_COUNT HIGH_VALUE
--------------- ------------------ ---------------
T_R_P1 4 10
T_R_P2 4 20
T_R_P3 4 30
T_R_PD 4 MAXVALUE
SQL> select partition_name, subpartition_name, high_value, tablespace_name
2 from user_ind_subpartitions
3 where index_name = 'IDX_PART_RL_ID';
PARTITION_NAME SUBPARTITION_NAME HIGH_VALUE TABLESPACE_NAME
--------------- ------------------------------ --------------- --------------------
T_R_P1 T_R_P1_L1 'aa' TBSPART01
T_R_P1 T_R_P1_L2 'bb' TBSPART01
T_R_P1 T_R_P1_L3 'cc' TBSPART01
T_R_P1 T_R_P1_L4 'dd' TBSPART01
T_R_P2 T_R_P2_L1 'aa' TBSPART02
T_R_P2 T_R_P2_L2 'bb' TBSPART02
T_R_P2 T_R_P2_L3 'cc' TBSPART02
T_R_P2 T_R_P2_L4 'dd' TBSPART02
T_R_P3 T_R_P3_L1 'aa' TBSPART03
T_R_P3 T_R_P3_L2 'bb' TBSPART03
T_R_P3 T_R_P3_L3 'cc' TBSPART03
T_R_P3 T_R_P3_L4 'dd' TBSPART03
T_R_PD T_R_PD_L1 'aa' TBSPART04
T_R_PD T_R_PD_L2 'bb' TBSPART04
T_R_PD T_R_PD_L3 'cc' TBSPART04
T_R_PD T_R_PD_L4 'dd' TBSPART04
已选择16行。
还是与表的分区格式一样,不管是普通分区还是复合分区,local索引都没啥自主权啊。
公共准则
1、如果选择的分区不能确保各分区内记录量的基本平均,则这种分区方式有可能是不恰当的。
比如对于range分区,假设分了10个分区,而其中一个分区中的记录数占总记录数的90%,其它9个分区只占总记录数的10%,则这个分区方式就起不到数据平衡的作用。当然,如果你的目的并不是为了平衡,只是为了区分数据,ok,对于这种情况,我想说的是,你务必要意识到存在这个问题。
2、对于分区的表或索引,其所涉及的所有分区,其块大小必须一致。
最后,建议对于上面创建的表或建表脚本妥善保存并记忆,后面我们需要频繁用到,后续示例将均主要依赖前文中创建的表进行:)
=======================================