云数据库 GAUSSDB-CREATE TABLE:表数据分布示例

时间:2025-01-10 10:13:09

表数据分布示例

  • REPLICATION
    gaussdb=# CREATE TABLE test_replication(
        id       CHAR(7),
        name     VARCHAR(20),
        province VARCHAR(60),                       --省
        country   VARCHAR(30) DEFAULT 'China'        --国籍
    )DISTRIBUTE BY REPLICATION;
    
    --查询表信息。
    gaussdb=# \d+ test_replication
                                            Table "public.test_replication"
      Column  |         Type          |             Modifiers              | Storage  | Stats target | Description 
    ----------+-----------------------+------------------------------------+----------+--------------+-------------
     id       | character(7)          |                                    | extended |              | 
     name     | character varying(20) |                                    | extended |              | 
     province | character varying(60) |                                    | extended |              | 
     country  | character varying(30) | default 'China'::character varying | extended |              | 
    Has OIDs: no
    Distribute By: REPLICATION
    Location Nodes: ALL DATANODES
    Options: orientation=row, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off
    
    --删除。
    gaussdb=# DROP TABLE test_replication;
  • HASH
    --定义一个表,使用HASH分布。
    gaussdb=# CREATE TABLE test_hash(
        id       CHAR(7),
        name     VARCHAR(20),
        province VARCHAR(60),                       --省
        country   VARCHAR(30) DEFAULT 'China'        --国籍
    )DISTRIBUTE BY HASH(id);
    
    --插入数据。
    gaussdb=# INSERT INTO test_hash VALUES ('0000001', 'Bob',   'Shanghai', 'China'),
                                ('0000002', 'Jack',  'Beijing',  'China'), 
                                ('0000003', 'Scott', 'Beijing',  'China');
    --查看数据分布情况。
    gaussdb=# SELECT a.count,b.node_name 
    FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_hash GROUP BY xc_node_id) a, 
         pgxc_node b 
    WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC;
     
    count |     node_name     
    -------+-------------------
         2 | dn_6001_6002_6003
         1 | dn_6004_6005_6006
    
    --删除表。
    gaussdb=# DROP TABLE test_hash;
  • MURMURHASH
    --测试环境包含1个CN和6个DN。
    --创建NODEGROUP,NODEGROUP中的DN名字可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询,查询的结果按需替换CREATE NODE GROUP语句中WITH后的DN名。
    gaussdb=# CREATE NODE GROUP NG1 WITH(datanode1, datanode2, datanode3, datanode4, datanode5, datanode6);
    --定义一个表,使用MURMURHASH分布。
    gaussdb=# CREATE TABLE test_murmurhash1 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(a) TO GROUP NG1;
    gaussdb=# CREATE TABLE test_murmurhash2 (a int NOT NULL, b int) DISTRIBUTE BY MURMURHASH(lpad_s(a,10,'0')) TO GROUP NG1;
    --插入数据。
    gaussdb=# INSERT INTO test_murmurhash1 VALUES(0,1);
    gaussdb=# INSERT INTO test_murmurhash2 VALUES(1,2);
    --查询数据。
    gaussdb=# SELECT * FROM test_murmurhash1;
     a | b 
    ---+---
     0 | 1
    (1 row)
    gaussdb=# SELECT * FROM test_murmurhash2;
     a | b 
    ---+---
     1 | 2
    (1 row)
    --删除表。
    gaussdb=# DROP TABLE test_murmurhash1;
    gaussdb=# DROP TABLE test_murmurhash2;
    
    --删除NODE GROUP。
    gaussdb=# DROP NODE GROUP NG1;
  • RANGE
    --定义一个表,使用RANGE分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。
    gaussdb=# CREATE TABLE test_range(
        id       INT,
        name     VARCHAR(20),
        province VARCHAR(60),                       --省
        country   VARCHAR(30) DEFAULT 'China'        --国籍
    )DISTRIBUTE BY RANGE(id)(
        SLICE s1 VALUES LESS THAN (100) DATANODE dn_6001_6002_6003,
        SLICE s2 VALUES LESS THAN (200) DATANODE dn_6004_6005_6006,
        SLICE s3 VALUES LESS THAN (MAXVALUE) DATANODE dn_6007_6008_6009
    );
    
    --插入数据。
    gaussdb=# INSERT INTO test_range VALUES (52,  'Bob',    'Beijing',   'China');
    gaussdb=# INSERT INTO test_range VALUES (100, 'Ben',    'Shanghai',  'China');
    gaussdb=# INSERT INTO test_range VALUES (150, 'Scott',  'Guangzhou', 'China');
    gaussdb=# INSERT INTO test_range VALUES (300, 'Jordan', 'Beijing',   'China');
    --查看数据分布情况。
    gaussdb=# SELECT a.count,b.node_name 
    FROM (SELECT COUNT(*) AS count, xc_node_id FROM test_range GROUP BY xc_node_id) a, 
         pgxc_node b 
    WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC;
     count |     node_name     
    -------+-------------------
         2 | dn_6004_6005_6006
         1 | dn_6001_6002_6003
         1 | dn_6007_6008_6009
    (3 rows)
    --查询各dn上存储的数据。
    gaussdb=# SELECT b.node_name, a.* 
    FROM (SELECT *, xc_node_id FROM test_range) a, 
         pgxc_node b 
    WHERE a.xc_node_id=b.node_id order by node_name;
         node_name     | id  |  name  | province  | country | xc_node_id  
    -------------------+-----+--------+-----------+---------+-------------
     dn_6001_6002_6003 |  52 | Bob    | Beijing   | China   | -1072999043
     dn_6004_6005_6006 | 100 | Ben    | Shanghai  | China   |  -564789568
     dn_6004_6005_6006 | 150 | Scott  | Guangzhou | China   |  -564789568
     dn_6007_6008_6009 | 300 | Jordan | Beijing   | China   |  1532339558
    (4 rows)
    --删除表。
    gaussdb=# DROP TABLE test_range;
  • LIST
    --定义一个表,使用LIST分布(需要根据实际情况修改dn名字,查询dn节点名可以通过语句SELECT node_name FROM PGXC_NODE WHERE node_type = 'D';查询)。
    gaussdb=# CREATE TABLE test_list(
        id       INT,
        name     VARCHAR(20),
        country   VARCHAR(30) DEFAULT 'China'        --国籍
    )DISTRIBUTE BY LIST(country)(
        SLICE s1 VALUES ('China') DATANODE dn_6001_6002_6003,
        SLICE s2 VALUES ('USA')   DATANODE dn_6004_6005_6006,
        SLICE s3 VALUES (DEFAULT) DATANODE dn_6007_6008_6009
    );
    
    --插入数据。
    gaussdb=# INSERT INTO test_list VALUES (1,'Scott','China');
    gaussdb=# INSERT INTO test_list VALUES (2,'Henry','USA');
    gaussdb=# INSERT INTO test_list VALUES (3,'Michael','France');
    gaussdb=# INSERT INTO test_list VALUES (4,'Jack','UK');
    --查询各dn上存储的数据。
    gaussdb=# SELECT b.node_name, a.* 
    FROM (SELECT *, xc_node_id FROM test_list) a, 
         pgxc_node b 
    WHERE a.xc_node_id=b.node_id order by node_name;
         node_name     | id |  name   | country | xc_node_id  
    -------------------+----+---------+--------+-------------
     dn_6001_6002_6003 |  1 | Scott   | China  | -1072999043
     dn_6004_6005_6006 |  2 | Henry   | USA    |  -564789568
     dn_6007_6008_6009 |  3 | Michael | France |  1532339558
     dn_6007_6008_6009 |  4 | Jack    | UK     |  1532339558
    (4 rows)
    --删除表。
    gaussdb=# DROP TABLE test_list;
support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0567.html