下文所涉及的SQL例子皆以6BP,每个BP节点4个表空间,共24个表空间为背景。
该环境的表空间分布如下表所示
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001 | TS_002 | TS_003 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008 | TS_009 | TS_010 | TS_011 | TS_012 |
TS_013 | TS_014 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
根据表空间组的规划章节,可想到表的存储单位只有表空间或表空间组,如
--建表可指定表空间/表空间组方式
Create table t_2(c1 int) storage (on TS_001); --指定表空间
Create table t_3(c1 int) storage (on TSG_A); --指定表空间组
当然,也可以不指定,如
Create table t_3(c1 int);
表 T_3 不指定存储位置就表示数据库随机给你选择了一个表空间来存储。
DPC上的表,如果不是分区表,则表示这张表只存储在1个BP的某一个表空间上,等同于单机的普通表。如果想要表存储在6个BP的表空间上,则必须用分区表,指定不同的分区存储在不同的BP的表空间上。
目前支持的分区类型有:
LIST+HASH、RANGE+HASH是最常用的。这种组合指一级分区是LIST/RANGE,二级分区是HASH,可通过增加删除一级分区,来实现数据按天或按月存储
情况1 表空间分布示意图(假设初始分区在TS_005上)
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001 | TS_002 | TS_003 | TS_004<br />TEST_FQ1 | TS_005<br />TEST_FQ1_DMHASHPART0 | TS_006<br />TEST_FQ1_DMHASHPART1 |
TS_007<br />TEST_FQ1_DMHASHPART2 | TS_008<br />TEST_FQ1_DMHASHPART3 | TS_009<br />TEST_FQ1_DMHASHPART4 | TS_010<br />TEST_FQ1_DMHASHPART5 | TS_011<br />TEST_FQ1_DMHASHPART6 | TS_012<br />TEST_FQ1_DMHASHPART7 |
TS_013<br />TEST_FQ1_DMHASHPART8 | TS_014<br />TEST_FQ1_DMHASHPART9 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--情况1,分区数小于表空间数时,表的起始分区将会随机存储在一个表空间上,然后连续的分布在不同节点的表空间上
create table test_fq1(c1 int,c2 varchar) partition by hash(c1) partitions 10;
情况2 表空间分布示意图
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001<br />TEST_FQ2<br />TEST_FQ2_DMHASHPART23 | TS_002<br />TEST_FQ2_DMHASHPART0<br />TEST_FQ2_DMHASHPART24 | TS_003<br />TEST_FQ2_DMHASHPART1<br />TEST_FQ2_DMHASHPART25 | TS_004<br />TEST_FQ2_DMHASHPART2<br />TEST_FQ2_DMHASHPART26 | TS_005<br />TEST_FQ2_DMHASHPART3<br />TEST_FQ2_DMHASHPART27 | <br />TEST_FQ2_DMHASHPART0<br />TEST_FQ2_DMHASHPART28 |
TS_007<br />TEST_FQ2_DMHASHPART5<br />TEST_FQ2_DMHASHPART29 | TS_008<br />TEST_FQ2_DMHASHPART6 | TS_009<br />TEST_FQ2_DMHASHPART7 | TS_010<br />TEST_FQ2_DMHASHPART8 | TS_011<br />TEST_FQ2_DMHASHPART9 | TS_012<br />TEST_FQ2_DMHASHPART10 |
<br />TEST_FQ2_DMHASHPART11 | TS_014<br />TEST_FQ2_DMHASHPART12 | TS_015<br />TEST_FQ2_DMHASHPART13 | TS_016<br />TEST_FQ2_DMHASHPART14 | TS_017<br />TEST_FQ2_DMHASHPART15 | TS_018<br />TEST_FQ2_DMHASHPART16 |
TS_019<br />TEST_FQ2_DMHASHPART17 | TS_020<br />TEST_FQ2_DMHASHPART18 | TS_021<br />TEST_FQ2_DMHASHPART19 | TS_022<br />TEST_FQ2_DMHASHPART20 | TS_023<br />TEST_FQ2_DMHASHPART21 | TS_024<br />TEST_FQ2_DMHASHPART22 |
--情况2,分区数大于表空间数时,表的起始分区将会固定在TS_002下,然后连续的分布在不同节点的表空间上
create table test_fq2(c1 int,c2 varchar) partition by hash(c1) partitions 30;
情况3 表空间分布示意图
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001<br />TEST_FQ4<br />TEST_FQ4_DMHASHPART2 | TS_002<br />TEST_FQ4_DMHASHPART0 | TS_003<br />TEST_FQ4_DMHASHPART1 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008 | TS_009 | TS_010 | TS_011 | TS_012 |
TS_013 | TS_014 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--情况3,规定在某个表空间组中分区时,如果表空间组中的表空间都是1个节点的,则分区全在该节点的表空间上;如果表空间组中有多个不同的节点的表空间,则分区将优先分布到不同节点的表空间上
SP_TS_GROUP_CREATE('TSG_A', 'tablespace group FOR SYSDBA');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_001');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_007');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_013');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_002');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_008');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_014');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_003');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_009');
SP_TS_GROUP_ADD_TS('TSG_A', 'TS_015');
SP_TS_GROUP_CREATE('TSG_B', 'tablespace group FOR SYSDBA');
SP_TS_GROUP_ADD_TS('TSG_B', 'TS_001');
SP_TS_GROUP_ADD_TS('TSG_B', 'TS_007');
SP_TS_GROUP_ADD_TS('TSG_B', 'TS_013');
create table test_fq3(c1 int,c2 varchar) partition by hash(c1) partitions 3 storage(on TSG_A);
create table test_fq4(c1 int,c2 varchar) partition by hash(c2) partitions 3 storage(on TSG_B);
--因为默认下分区数与BP的整数倍一致,因此分区的初始位置也固定在TS_002
create table test_fq5(c1 int,c2 varchar) partition by hash(c1) partitions default;
不指定HASH子表的数量时,分区数为dm.ini参数中HP_TAB_COUNT_PER_BP的值与BP数的乘积,如果使用表空间组的话,则分区数为表空间组中表空间占用的BP数量与HP_TAB_COUNT_PER_BP的乘积
情况1 表空间分布示意图(假设初始分区在TS_008上)
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001 | TS_002 | TS_003 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008<br />TEST_RANGE1 | TS_009<br />TEST_RANGE1_P1 | TS_010<br />TEST_RANGE_P2 | TS_011<br />TEST_RANGE_P3 | TS_012 |
TS_013 | TS_014 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--range分区表的分区方式与hash表的分区方式如出一辙,当分区数少于表空间时,起始分区的位置随机;而当分区数多于表空间数时将固定从TS_002开始
create table test_range1(c1 int,c2 varchar) partition by range(c1)(
partition p1 values less than(10),
partition p2 values less than(20),
partition p3 values equ or less than(maxvalue));
情况2 表空间分布示意图
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001<br />TEST_RANGE2<br />TEST_RANGE2_P24 | TS_002<br />TEST_RANGE2_P1<br />TEST_RANGE2_P25 | TS_003<br />TEST_RANGE2_P2<br />TEST_RANGE2_P26 | TS_004<br />TEST_RANGE2_P3<br />TEST_RANGE2_P27 | TS_005<br />TEST_RANGE2_P4<br />TEST_RANGE2_P28 | TS_006<br />TEST_RANGE2_P5<br />TEST_RANGE2_P29 |
TS_007<br />TEST_RANGE2_P6<br />TEST_RANGE2_P30 | TS_008<br />TEST_RANGE2_P7 | TS_009<br />TEST_RANGE2_P8 | TS_010<br />TEST_RANGE2_P9 | TS_011<br />TEST_RANGE2_P10 | TS_012<br />TEST_RANGE2_P11 |
TS_013<br />TEST_RANGE2_P12 | TS_014<br />TEST_RANGE2_P13 | TS_015<br />TEST_RANGE2_P14 | TS_016<br />TEST_RANGE2_P15 | TS_017<br />TEST_RANGE2_P16 | TS_018<br />TEST_RANGE2_P17 |
TS_019<br />TEST_RANGE2_P18 | TS_020<br />TEST_RANGE2_P19 | TS_021<br />TEST_RANGE2_P20 | TS_022<br />TEST_RANGE2_P21 | TS_023<br />TEST_RANGE2_P22 | TS_024<br />TEST_RANGE2_P23 |
--情况2
create table test_range2(c1 int,c2 varchar) partition by range(c1)(
partition p1 values less than(10),
partition p2 values less than(20),
partition p3 values less than(30),
partition p4 values less than(40),
partition p5 values less than(50),
partition p6 values less than(60),
partition p7 values less than(70),
partition p8 values less than(80),
partition p9 values less than(90),
partition p10 values less than(100),
partition p11 values less than(110),
partition p12 values less than(120),
partition p13 values less than(130),
partition p14 values less than(140),
partition p15 values less than(150),
partition p16 values less than(160),
partition p17 values less than(170),
partition p18 values less than(180),
partition p19 values less than(190),
partition p20 values less than(200),
partition p21 values less than(210),
partition p22 values less than(220),
partition p23 values less than(230),
partition p24 values less than(240),
partition p25 values less than(250),
partition p26 values less than(260),
partition p27 values less than(270),
partition p28 values less than(280),
partition p29 values less than(290),
partition p30 values equ or less than(maxvalue));
情况1 表空间分布示意图
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001<br />TEST_RANGE3<br />TEST_RANGE3_P1<br />TEST_RANGE3_P3 | TS_002<br />TEST_RANGE3_P2 | TS_003 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008 | TS_009 | TS_010 | TS_011 | TS_012 |
TS_013 | TS_014 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--情况1 当分区指定存储位置时,分区存储在指定的表空间,如果有分区不指定位置,比如p3,则该分区存储在p1的存储的位置中;表结构同样存储在p1存储的位置中
create table test_range3(c1 int,c2 varchar) partition by range(c1)
(
partition p1 values less than(10) storage (on TS_001),
partition p2 values less than(20) storage (on TS_002),
partition p3 values equ or less than(maxvalue));
情况2 表空间分布示意图(假设起始分区p1存放在TS_013上)
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001 | TS_002<br />TEST_RANGE4_P2 | TS_003 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008 | TS_009 | TS_010 | TS_011 | TS_012<br />TEST_RANGE4 |
TS_013<br />TEST_RANGE4_P1 | TS_014<br />TEST_RANGE4_P3 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--情况2 当p1分区(第一个分区,起始分区)不指定存储位置时,除指定存储位置的分区以外则随机存储,p1的位置随机,此后其他未指定存储位置的分区以p1的表空间为起始位置连续存放
create table test_range4(c1 int,c2 varchar) partition by range(c1)
(
partition p1 values less than(10) ,
partition p2 values less than(20) storage (on TS_002),
partition p3 values equ or less than(maxvalue));
--list的分区方式同上,分区数少于表空间数时,起始分区位置随机;若分区数多余表空间数则起始位置固定为TS_002
create table test_list1(c1 int,c2 varchar) partition by list(c1)
(
partition p1 values(1),
partition p2 values(2),
partition p3 values(default));
--情况1,每个分区都指定存储位置,则每个分区都存储在相应的位置处
create table test_list2(c1 int,c2 varchar) partition by list(c1)
(
partition p1 values(1) storage (on TS_001),
partition p2 values(2) storage (on TS_002),
partition p3 values(default) storage (on TS_003)) storage (on TS_001);
情况2 分区分布示意图
BP1 | BP2 | BP3 | BP4 | BP5 | BP6 |
---|---|---|---|---|---|
TS_001<br />TEST_LIST3<br />TEST_LIST3_P1<br />TEST_LIST3_P2<br />TEST_LIST3_P3 | TS_002 | TS_003 | TS_004 | TS_005 | TS_006 |
TS_007 | TS_008 | TS_009 | TS_010 | TS_011 | TS_012 |
TS_013 | TS_014 | TS_015 | TS_016 | TS_017 | TS_018 |
TS_019 | TS_020 | TS_021 | TS_022 | TS_023 | TS_024 |
--情况2,仅在语句最后处加指定存储位置语句,则所有分区都存储在这个表空间上
create table test_list3(c1 int,c2 varchar) partition by list(c1)
(
partition p1 values(1),
partition p2 values(2),
partition p3 values(default)) storage (on TS_001);
文章
阅读量
获赞