文档首页/ 数据仓库服务 GaussDB(DWS)/ 更多文档/ 用户指南(巴黎区域)/ 常见问题/ 数据库使用/ 如果建表时没有指定分布列,数据会怎么存储?
更新时间:2024-06-11 GMT+08:00

如果建表时没有指定分布列,数据会怎么存储?

8.1.2及以上集群版本,可通过GUC参数default_distribution_mode来查询和设置表的默认分布方式。

如果建表时没有指定分布列,数据会以下几种场景来存储:

  • 场景一

    若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    CREATE TABLE warehouse1
    (
        W_WAREHOUSE_SK            INTEGER            PRIMARY KEY,
        W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
        W_WAREHOUSE_NAME          VARCHAR(20)                   
    );
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "warehouse1_pkey" for table "warehouse1"
    CREATE TABLE
    
    SELECT getdistributekey('warehouse1');
     getdistributekey
    ------------------
     w_warehouse_sk
    (1 row)
    
  • 场景二

    若建表时不包含主键/唯一约束,但存在数据类型支持作分布列的列,则选取HASH分布,分布列为第一个数据类型支持作分布列的列。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    CREATE TABLE warehouse2
    (
        W_WAREHOUSE_SK            INTEGER                       ,
        W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
        W_WAREHOUSE_NAME          VARCHAR(20)                   
    );
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'w_warehouse_sk' as the distribution column by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    CREATE TABLE
    
    SELECT getdistributekey('warehouse2');
     getdistributekey
    ------------------
     w_warehouse_sk
    (1 row)
    
  • 场景三

    若建表时不包含主键/唯一约束,也不存在数据类型支持作分布列的列,选取ROUNDROBIN分布。

    CREATE TABLE warehouse3
    (
        W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
        W_WAREHOUSE_NAME          VARCHAR(20)                   
    );
    NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'w_warehouse_id' as the distribution column by default.
    HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    CREATE TABLE
    
    SELECT getdistributekey('warehouse3');
     getdistributekey
    ------------------
     w_warehouse_id
    (1 row)