diff --git a/docs/guide/03-basic-use.md b/docs/guide/03-basic-use.md index d9ee142..013eee0 100644 --- a/docs/guide/03-basic-use.md +++ b/docs/guide/03-basic-use.md @@ -7,7 +7,7 @@ >本篇将介绍OpenTenBase中特有的shard表、复制表的创建,和基本的DML操作。 ## 1、创建数据表 -### 1.1、创建shard普通表 +### 1.1、创建shard普通表(分片表)    @@ -16,8 +16,25 @@ - distribute by shard(x) 用于指定分布键,数据分布于那个节点就是根据这个字段值来计算分片。 - to group xxx 用于指定存储组(每个存储组可以有多个节点)。 - 分布键字段值不能修改,字段长度不能修改,字段类型不能修改。 + +分布式数据库中,分片表是使用最多的表类型,合理的分片键设置将会系统的性能提升很多倍,不合理的分片键也会导致SQL性能恶化严重,因此分片键的优化是分布式SQL优化的重点中的重点: +分片键选择准则: +* 准则1:高频类SQL的业务字段,避免SQL产生分布式事务,避免跨DN节点数据插入、更新、删除(SQL能带上分片键)。 +* 准则2:分析类SQL的关联字段,尽量避免SQL产生批量跨DN节点数据交互(关联字段为分片键)。 +* 准则3:尽量避免DN节点数据不均衡。 +准则1、2和准则3可能有冲突,选择时准则1高于准则2、3 + +数据库在迁移时,会使用默认的规则指定分片键,大部分情况下是最优的,但仍有部分情景需要调整,下面是默认原则: +1)有主键,则选择主键做分片键。如果主键是复合字段组合,则选择第一个字段做分片键。 +2)有唯一索引,则选择唯一索引列做分片键。如果唯一索引是复合字段组合,则选择第一个字段做分片键。 +3)使用第一个字段做分片键。 + +一般会有两个阶段调整表类型和分片键: +阶段一:迁移之前,针对TOP 20的大表或者常用表确定表的类型和分片键,在迁移完表结构后,进行调整,之后再导入数据。 +阶段二:在适配测试、性能测试阶段,针对有性能问题的业务再进行调优。 + -### 1.2、创建shard普通分区表 +### 1.2、创建shard普通分区表(分片表+分区)   @@ -95,6 +112,37 @@ CREATE TABLE - 复制表是所有节点都有全量数据,对于大数据量的数据表不适合。 - 复制表更新性能较低。 +### 1.4、创建单表 +单表即表只存在于某一个DN节点,目前还不支持指定任意DN节点进行单表创建。可以通过多group的能力迂回实现:先添加一个DN节点,然后将该节点创建为一个独立的group中,可以命名为single_group。然后创建表时,指定表的group为刚刚创建的single_group。(注意:不能使用default_group中的节点,创建group的时候也会失败的) + +``` + +[opentenbase@VM_0_37_centos shell]$ psql -h 172.16.0.42 -p 11387 -d postgres -U opentenbase +psql (PostgreSQL 10.0 opentenbase V2) +Type "help" for help. + +postgres=# create table public.t1_signal +( +f1 int not null, +f2 varchar(20), +primary key(f1) +) +distribute by replication ; +to group single_group; +CREATE TABLE + +``` + +### 1.5、几种表的适用场景简述 + +上述几种表类型有各自的使用场景,合理的使用表类型,对SQL的性能会带来很大的提升: +| 分布式表类型 | 描述 | 适用场景 | 使用约束 | +|--------------|------|----------|----------| +| 分片表 | 表记录按分片键值进行hash打散到所有分片中,每个分片都只有一部分数据。 | 数据量特别大,并且查询、删除、修改该表的数据时可以指定分片键作为操作条件,大多数语句不涉及跨库分布式事务访问。 | 查询、更新、删除数据时需要指定分片键;分片键字段类型、长度不能修改,分片键值不能直接更新;目前不能基于非分片键字段创建主键或者唯一索引。 | +| 复制表 | 所有分片中都存储一份相同的全量数据。 | 经常要使用非分片键字段JOIN并且更新频率较低的小表推荐使用复制表。 | 该表并发更新低、数据量少,不需要同步该表的数据到Kafka。 | +| 单表 | 存储在一个专门定义的group中,这个group中只有一个分片。 | 查询、删除、修改该表的数据时无法利用分片键,更新频繁,但数据量不是特别大。 | 更新频繁,数据量不是特别大,不需要与其它分片表或者复制表进行JOIN操作。 | + + ## 2、DML相关操作 ### 2.1、INSERT