KADB 是北京人大金仓信息技术股份有限公司基于开源的greenplum数据库研发的一款分布式关系型数据库,全称是KingbaseAnalyticsDataBase。
学习kadb的表的管理
1、字段类型
在kadb中character类型的char、varchar、text之间在不考虑使用空格填充空白的情况下没有区别,建议使用varchar和text替代char。而数字类型要考虑下类型大小占用的空间问题了,BIGINT类型如果都是填充些INT或者SMALLINT类型3的数据的话将会浪费空间。
2、 约束
字段上,和oracle类似拥有primary、unique、check、not null、foreign约束,只是primary约束有个特殊的就是必须使用hash策略来分布表数据存储,不能在同一个表同时使用主键和唯一约束,并且指定了primary和unique的列必须全部或者部分包含在distributed key中;foreign约束虽然可以定义,但是并不会生效,至少在目前为止没有支持。
3、分布策略
kadb采用的是分布存放数据的架构,有三种分布方式:distributed by (key),采用的是hash算法,distributed randomly,采用的是随机算法;如果不指定分布策略默认使用hash,distributed replicated 复制分布,即每个节点上数据相同。
为了尽可能的并行处理数据,需要选择能够最大化地将数据均匀分布到所有seg的策略,比如选择primary key;分布式处理中将会存在本地和分布式协作的操作,当不同的表使用相同的分部键的时候,大部分的排序、连接关联操作工作将会在本地完成,本地操作往往比分布式操作快上5倍,但是采用随机分布的策略无法享受到这个优势。
默认情况下,不指定分布策略将使用hash策略,并且选择primiary key或者第1个column,key不能是几何类型和用户自定义的类型的column,如果没有合适的列那么会采用randomly策略。
3、blocksize设定
一个参数,可能不会经常用到的:block size介于8192和2097152之间,以byte为单位,即8k到2mb,默认32k。更大的块大小会消耗更多的内存。
4、 数据存储方式
kadb提供了多种的数据存储和组织方式,包括行存储、列存储、行和列混合存储、压缩、只读表等等。
ao表只允许追加数据;列存储只能是ao表;压缩只使用与ao表;
heap堆表 最普通的表形式,适合于较小的、经常更新的数据存储方式。
append only表 在某些情况下使用ao表存放非结构化的数据可以提高数据查询性能。
5、压缩表
可以基于表和行级别对数据进行压缩,基于列级别的压缩可以指定列和选择不同的压缩算法。压缩和解压数据需要消耗更多的cpu资源,同时不要将数据存储到压缩的文件系统中。压缩数据初衷是出于最小化存储空间,但是cpu消耗和压缩速度同样是重要的考虑因素。
针对不同的组织方式的表有以下算法选择:
行表:可以选择zlib和quicklz算法,zlib有1-9个压缩级别,级别越高压缩比越高
列表:可以选择zlib和quicklz以及rle_type算法、zstd算法。
quicklz通常比zlib更少的消耗cpu,更快的压缩速度;在zlib压缩级别1的情况之下,两者通常具有相同的压缩比,在级别大于6的情况下,会有更加显著的压缩比。
6、列级别压缩
只能适用于列存储的表,可以在创建或修改表的语句中指定列压缩命令。
C1 char ENCODING (compresstype=quicklz, blocksize=65536)
COLUMN C1 ENCODING (compresstype=quicklz, blocksize=65536)
DEFAULT COLUMN ENCODING (compresstype=quicklz)
指定参数的生效优先级如下(从高到底):分区表、分区、列,注意压缩属性不会被继承,如果使用like子句创建的表会忽略列和表级别的参数
7、分区表
支持rang和list以及两者混合的分区选项,无限制子分区层级数量;rang分区键只能有一个,适用于时间、数字范围的分区,list可以有多个分区键,适用于字符值的分区。
使用时间分区的时候建议采用最细粒度的平面分区而不是多层级的分区,平面分区有更佳的查询速度,多级分区有更好的查询计划分析时间。
分区表使用限制,分区键必须包含主键或者唯一键;
RAND范围分区:
partiton by range(date) (start (date '2012-01-01') inclusive end (date '2015-01-01') exclusive,every(interval '1 month'))
LIST列表分区:
partiton by list(region) (partition prtusa values('usa'),partition prtchina values('chaina'),default prtother other)
分区的选择性,查询计划只能对稳定的比较运算符执行选择性扫描:= < <= > >= <>,不能选择不稳定的函数,比如时间,但是可以对日期选择比较。