注册
DMDPC常见建表方式(1)
技术分享/ 文章详情 /

DMDPC常见建表方式(1)

年少无为 2023/06/12 2019 1 0

DPC 集群常见建表方式

下文所涉及的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

1 表的存储

根据表空间组的规划章节,可想到表的存储单位只有表空间表空间组,如

--建表可指定表空间/表空间组方式 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 不指定存储位置就表示数据库随机给你选择了一个表空间来存储。

  • 如用的用户 USER_A 来执行的,则在TSG_A 这个表空间组内随机选择一个表空间来存储。
  • 如用的用户 SYSDBA 来执行的,则在DPC集群中所有的24个表空间中随机选择一个表空间来存储。

2 表的分区

DPC上的表,如果不是分区表,则表示这张表只存储在1个BP的某一个表空间上,等同于单机的普通表。如果想要表存储在6个BP的表空间上,则必须用分区表,指定不同的分区存储在不同的BP的表空间上。

2.1 分区类型

目前支持的分区类型有:

  • HASH分区
  • LIST分区
  • RANGE分区
  • 二级分区如:
    • LIST + HASH
    • RANGE + HASH
    • LIST + RANGE
    • RANGE + LIST
LIST+HASH、RANGE+HASH是最常用的。这种组合指一级分区是LIST/RANGE,二级分区是HASH,可通过增加删除一级分区,来实现数据按天或按月存储

2.1.1 HASH分区

2.1.1.1指定具体的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);
2.1.1.2默认的HASH子表数量
--因为默认下分区数与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的乘积

2.1.2 RANGE分区

2.1.2.1不指定存储位置

情况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));
2.1.2.2指定存储位置

情况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));

2.1.3 LIST分区

不指定存储位置
--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);

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服