暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

GaussDB分布式表中分片信息的限制

原创 曾令军 2020-02-29
3775

在高斯分布式数据库中创建表,需要指定分片信息。根据分片类型不同,可将普通表分成为哈希表(HASH)、范围表(RANGE)、列表(LIST)及复制表(REPLICATION )。

本文记录关于分布式表中分片信息的限制:

  1. 除复制表外,其余类型的表均需要指定分片字段
SQL> create table t_test3(id1 number);
GS-00601, [1:33]Sql syntax error: expected distribute definition
  1. 分片字段必须有一个非空的默认值或者非空约束,否则会建表失败。
SQL> create table t_test(id1 number,date1 date) distribute by hash(id1);
GS-00601, [1:63]Sql syntax error: Distribute column ID1 should have not null default value or NOT NULL constraint.
  1. 不支持修改分片字段值(update操作)
SQL> create table t_test(id1 number not null,date1 date) distribute by hash(id1);
SQL> insert into t_test values(1,sysdate);
SQL> update t_test set id1=2;
GS-01339, Cannot update distribute column "ID1" .
  1. 分片字段类型的支持
    1)HASH/LIST/RANGE分片类型的分片字段支持如下数据类型:INT、INTEGER、BIGINT、NUMBER、DECIMAL、NUMERIC、DATE、DATETIME、TIMESTAMP、CHAR、VARCHAR、VARCHAR2。
    2)BASIC HASH分片类型的分片字段支持如下数据类型:BINARY_UINT32、UINTEGER、UINT、BINARY_INTEGER、INT、INTEGER、SHORT、SMALLINT、TINYINT、USHORT、USMALLINT、UTINYINT、BIGINT、BINARY_BIGINT、DECIMAL、NUMERIC、NUMBER。
SQL> create table t_test(id1 number not null,date1 date) distribute by hash(id1) using basic;
Succeed.
SQL> create table t_test2(var1 text not null,date1 date) distribute by hash(var1) using basic;
GS-01309, Datatype CLOB is not allowed for distribute column using basic hash distribute type

3)NUMBER、DECIMAL、NUMERIC HASH算法仅对小数点16位以内有效,BASIC HASH只对整数位有效。超过有效位数HASH算法将无法将数据散列开。

--在CN中插入100行小数到按BASIC HASH分片的表中
begin
  for i in 1..100 loop
    insert into t_test values(i/1000,sysdate);
  end loop;
  commit;
end;  
/
--进入DN检查发现100行数据全部在DN1中,数据无法分散到3个DN节点
[omm@gaussdb01 ~]$ zsql enmotest/Changeme_123@127.0.0.1:40000
SQL> select count(1) from enmotest.t_test;
    COUNT(1)            
    --------------------
    100                 
  1. 不支持跨DN节点的唯一性约束;如果需要支持唯一性约束,唯一性约束列必须包含所有分片列。

  2. 不支持外键约束

  3. 分片字符串table_distribute_clauses长度不能超过1024。手册上是这样说的,但实测时发现有一些出入,事实上,分片字符串定义长度超过1024时,建表可以成功,只是超过1024的字符串数据无法平均分配到各个数据节点中。

create table t_test2(var1 varchar(2000) not null,date1 date) distribute by hash(var1);
--在CN中插入100行字符串长度大于1024的数据
begin
  for i in 1..100 loop
    insert into t_test2 values(lpad('a',2000,'a'),sysdate);
  end loop;
  commit;
end;  
/
--进入DN中检查发现100行数据全部在DN2中,数据无法分散到3个DN节点
SQL> select count(1) from enmotest.t_test2;
    COUNT(1)            
    --------------------
    100                 
  1. HASH分片表达式涉及的字段不超过10个
  2. LIST/RANGE分片表达式只支持单列或者SUBSTR函数,若使用函数,则函数中的表达式也须是单列
  3. INSERT …VALUES多值插入形式暂不支持跨DN分片
  4. MERGE INTO xxx using xxx ON(合并条件),合并条件中的字段必须均为分片列,否则会报错
  5. 在集群部署下,可以通过设置路由规则将SQL语句发送给对应的DN执行,设置路由规则时,应人为保证该规则与建表的分片规则一致
最后修改时间:2020-02-29 12:25:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论