云数据库 GAUSSDB-表设计规范:选择分布方案

时间:2025-03-14 09:57:12

选择分布方案

表的分布方式的选择如表1所示。
表1 表的分布方式及使用场景

分布方式

描述

适用场景

Hash

表数据通过Hash方式散列到集群中的所有DN上。

数据量较大的事实表。

Replication

集群中每一个DN都有一份全量表数据。

维度表、数据量较小的事实表。

Range

表数据对指定列按照范围进行映射,分布到对应DN。

用户需要自定义分布规则的场景。

List

表数据对指定列按照具体值进行映射,分布到对应DN。

用户需要自定义分布规则的场景。

  • 【说明】将表数据均匀分布在各个DN上。数据均匀分布,可以防止数据在部分DN上集中分布,从而导致因存储倾斜造成集群有效容量下降。通过选择合适的分布列,可以避免数据倾斜。
  • 【规则】必须指定表分布(DISTRIBUTE BY),且表分布策略选择应符合以下原则。

    GaussDB 目前提供REPLICATION、HASH、Range和List四种表分布策略。REPLICATION分布会在每个节点保留一份相同的完整的数据表。HASH分布会根据所提供的分布键值将表数据分布到多个节点中。范围(Range)和列表(List)根据分布列的取值落入满足一定范围或者具体值的对应目标节点。

    • 对于系统配置表、数据字典表等数据规模小于2000w且插入更新十分低频的表,要求采用REPLICATION分布。
      CREATE TABLE t1 (contentId INT) DISTRBUTE BY REPLICATION;

      慎用REPLICATION分布,该分布表会造成空间膨胀、DML性能下降等负面影响。

    • 对于不满足条件1的表,即数据量较大,更新频率较高的表,必须进行数据分片,要求采用HASH分布策略,分布键必须是主键中的一个或多个字段。
      CREATE TABLE t1 (contentId INT) DISTRBUTE BY HASH (contentId);
    • 用户需要自定义分布规则的场景,可以使用Range和List分布策略。
      CREATE TABLE t1 (contentId INT) DISTRBUTE BY Range (contentId)
      (
      SLICE s1 VALUES LESS THAN (10) DATANODE dn1,
      SLICE s2 VALUES LESS THAN (20) DATANODE dn2,
      SLICE s3 VALUES LESS THAN (30) DATANODE dn3,
      SLICE s4 VALUES LESS THAN (MAXVALUE) DATANODE dn4
      );
      CREATE TABLE t1 (contentId INT) DISTRBUTE BY List (contentId)
      (
      SLICE s1 VALUES (10) DATANODE dn1,
      SLICE s2 VALUES (20) DATANODE dn2,
      SLICE s3 VALUES (30) DATANODE dn3,
      SLICE s4 VALUES (DEFAULT) DATANODE dn4
      );
    • 对于小于2000w且多行插入更新、范围查询频率较高的表,建议不分片。由于目前暂不支持此类表(下个版本提供),需使用HASH分布表代替。

典型的分布表定义如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
--定义一个表,表中每行存在所有DN中。
CREATE TABLE warehouse_d1
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
)DISTRIBUTE BY REPLICATION;

--定义一个表,使用HASH分布。
CREATE TABLE warehouse_d2
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    CONSTRAINT W_CONSTR_KEY3 UNIQUE(W_WAREHOUSE_SK)
)DISTRIBUTE BY HASH(W_WAREHOUSE_SK);

--定义一个表,使用RANGE分布
CREATE TABLE warehouse_d3
(
W_WAREHOUSE_SK            INTEGER               NOT NULL,
W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
W_WAREHOUSE_NAME          VARCHAR(20)                   ,
W_WAREHOUSE_SQ_FT         INTEGER                       ,
W_STREET_NUMBER           CHAR(10)                      ,
W_STREET_NAME             VARCHAR(60)                   ,
W_STREET_TYPE             CHAR(15)                      ,
W_SUITE_NUMBER            CHAR(10)                      ,
W_CITY                    VARCHAR(60)                   ,
W_COUNTY                  VARCHAR(30)                   ,
W_STATE                   CHAR(2)                       ,
W_ZIP                     CHAR(10)                      ,
W_COUNTRY                 VARCHAR(20)                   ,
W_GMT_OFFSET              DECIMAL(5,2)
)DISTRIBUTE BY RANGE(W_WAREHOUSE_ID)
(
   SLICE s1 VALUES LESS THAN (10) DATANODE dn1,
   SLICE s2 VALUES LESS THAN (20) DATANODE dn2,
   SLICE s3 VALUES LESS THAN (30) DATANODE dn3,
   SLICE s4 VALUES LESS THAN (MAXVALUE) DATANODE dn4
);
 
--定义一个表,使用LIST分布
CREATE TABLE warehouse_d4
(
W_WAREHOUSE_SK            INTEGER               NOT NULL,
W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
W_WAREHOUSE_NAME          VARCHAR(20)                   ,
W_WAREHOUSE_SQ_FT         INTEGER                       ,
W_STREET_NUMBER           CHAR(10)                      ,
W_STREET_NAME             VARCHAR(60)                   ,
W_STREET_TYPE             CHAR(15)                      ,
W_SUITE_NUMBER            CHAR(10)                      ,
W_CITY                    VARCHAR(60)                   ,
W_COUNTY                  VARCHAR(30)                   ,
W_STATE                   CHAR(2)                       ,
W_ZIP                     CHAR(10)                      ,
W_COUNTRY                 VARCHAR(20)                   ,
W_GMT_OFFSET              DECIMAL(5,2)
)DISTRIBUTE BY LIST(W_COUNTRY)
(
    SLICE s1 VALUES ('USA') DATANODE dn1,
    SLICE s2 VALUES ('CANADA') DATANODE dn2,
    SLICE s3 VALUES ('UK') DATANODE dn3,
    SLICE s4 VALUES (DEFAULT) DATANODE dn4
);

更多的表分布语法信息请参见CREATE TABLE

support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-15-0033.html
提示

您即将访问非华为云网站,请注意账号财产安全