
# 创建hashbucket表
在一个数据库中创建第一张hashbucket表前，需要先将当前database绑定到集群默认的node group上。
1. （可选）通过给DATABASE绑定node group生成CN上hash分布和DN上bucket的映射关系，语法如下： 
   ```
   ALTER DATABASE databasename TO GROUP groupname；
   ```
   语法详情请参见《参考》中"SQL参考 \> SQL语法 \> A \> ALTER DATABASE"章节中相关描述。
   - 查询NODE GROUP。
     ```
     gaussdb=# select group_name from pgxc_group where is_installation = true;
       group_name
     -------------------------
      group_version1
     (1 row)
     ```
     
   
   - 绑定到集群默认的NODE GROUP。具体语法请参见《参考》中"SQL参考 \> SQL语法 \> A \> ALTER DATABASE"章节和"SQL参考 \> SQL语法 \> C \> CREATE NODE GROUP"章节。
     ```
     gaussdb=# ALTER DATABASE postgres TO GROUP group_version1;
     ALTER DATABASE
     ```
     ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
     如果数据库第一次创建hashbucket表前不绑定NODE GROUP，则该建表命令会自动绑定集群当前默认的NODE GROUP上。
     ```
     gaussdb=# CREATE TABLE hashbucket_table1(c1 VARCHAR2 (30)) WITH(storage_type=ustore, hashbucket=on) distribute by hash(c1);
     NOTICE:  This is the first time ever to create a hashbucket table in this database. The database will be automatically altered to the installation node group "group_version1".
     NOTICE:  hashbucket table need segment storage, set segment to on by default
     CREATE TABLE
     ```
     
   
   
   
   
2. 创建hashbucket表语法与创建普通表CREATE TABLE语法一致，在建表时需要额外设置参数hashbucket=on，且显式或隐式指定hash分布列。 
   - 存储参数hashbucket默认值为off，取值范围：
     - on：表示创建hashbucket表，
     
     - off：表示非hashbucket表。
      
   
   - 指定hash分布列： hashbucket表要求至少有一列可以作为hash分布列，该列决定数据分布的bucket。hash分布列可以在建表时通过子句DISTRIBUTE BY hash(column_name)显式指定，不显式指定时则会隐式地选择第一个满足hash分布条件的列。
   
   
   
   
- 创建hashbucket普通表。
  ```
  gaussdb=# CREATE TABLE hashbucket_table1(c1 VARCHAR2 (30)) WITH(storage_type=ustore, hashbucket=on) DISTRIBUTE BY hash(c1);
  NOTICE:  hashbucket table need segment storage, set segment to on by default
  CREATE TABLE
  ```
  
- 创建hashbucket分区表。
  ```
  gaussdb=# CREATE TABLE hashbucket_partiton_table_range1 (
      c1 int ,
      c2 bigint NOT NULL ,
      c3 VARCHAR2 ( 30 )
  ) WITH(storage_type=ustore, hashbucket=on) DISTRIBUTE BY hash(c3)
  PARTITION BY RANGE(c1)(
  PARTITION p1 VALUES LESS THAN (100000),
  PARTITION p2 VALUES LESS THAN (200000),
  PARTITION p3 VALUES LESS THAN (MAXVALUE)
  );
  CREATE TABLE
  ```
  
具体语法请参见《参考》中"SQL参考 \> SQL语法 \> C \> CREATE TABLE"章节和"SQL参考 \> SQL语法 \> C \> CREATE TABLE PARTITION"章节。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 在每个数据库内创建第一张hashbucket表相比普通表会更慢，这是由于创建第一张hashbucket表时会创建1024组段页式文件。
- 多张表并发创建时，需要等第一张表的段页式文件创建完成后，其他表才会创建成功。
- 设置GUC参数enable_hashbucket为on后，可以不指定WITH(hashbucket=on)，默认创建hashbucket表。详情请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 其它选项"章节中enable_hashbucket参数的介绍。
 
