存储引擎
- USTORE,表示表支持Inplace-Update存储引擎。(原文更新技术,类似mysql的on-do)
- ASTORE,表示表支持Append-Only存储引擎。(有表??的问题,↑解决这个问题)
存储方法
- ROW:表示表的数据将以行式存储;行存储适合于OLTP业务,适用于点查询或者增删操作比较多的场景。
- COLUMN:表示表的数据将以列式存储;列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且设计的列操作较少。
- MOT:表示表的数据将以内存的形式存储;MOT内存适用于高吞吐事务处理,性能瓶颈加速,消除中间层缓存,大规模流数据提取。
存储方法的使用
存储方法的使用:当sql语句不做指定时,默认使用astore存储引擎,row存储方法
- 创建表时指定 orientation 参数值为row,创建行存表。
create table test_astore_row(col text) with (orientation=row);
- 创建表时指定 orientation 参数值为column,创建列存表。
create table test_astore_column(col text) with (orientation=column);
- 创建表时 create foreign table… server为mot_server 时,创建内存表。
create foreign table test_astore_mot(col int) server mot_server;
- 创建表时,指定 storage_type 参数值为 ustore,创建 ustore 表。
create table test_ustore(col text) with (storage_type=ustore);
分区表
GBase 8c 需要将数据按照一定规律分布到各个数据节点,目前支持hash分片。
在此基础上,分区表功能,支持二级分区,9种分区组合,interval分区。即分片+分区功能。
分区类型 | 一级分区 | 二级分区 |
---|---|---|
hash | hash | hash-list;hash-hash;hash-range |
range | range | range-range;range-hash;rang-list |
list | list | list-list;list-range;list-hash |
interval分区 | range |
表分片
GBase 8c 的数据分片策略:在创建表时,通过关键字distribute、replication来设置表分片策略。
- 通过distribute by hash 创建hash分片表,将数据通过hash算法均匀存储到每个数据节点。
create table t1_dis(c1 int,c2 int) distribute by hash(c1);
- 通过distribute by replication 创建复制表,每个数据节点都会存储一份数据。
crete table t1_rep(c1 int,c2 int) distribute by replication;
-
在不指定时,默认使用hash分片,分布式键按照顺序为第一个满足hash算法的字段。
-
interval分区:根据间隔自动创建分区,例如,1 day 、1 month(主备式)
create table sales(
prod_id number(6),
cust_id number,
time_id date,
channel_id char(1),
promo_id number(6),
quantity_sold number(3),
amount_sold number(10,2))
partition by range(time_id) interval('1 day')
(partition p1 values less than ('2019-02-01 00:00:00'),
partition p2 values less than ('2019-02-02 00:00:00')
);
分区自动管理
分区自动管理:根据间隔自动创建分区,例如:1 day、1 month(分布式)
- 语法:建表时增加 WITH ,或通过 ALTER TABLE xxxx SET (PERIOD=‘1 day’) 来实现。(其中 PERIOD范围是1 hour ~ 1 year)。通过ALTER TABLE xxxx RESET (PERIOD)来关闭。
- 限制:仅支持RANGE分区的一级分区表(其他分区类型,以及带有二级分区的表不支持)
- 效果:从当前命令时间(向下规约到hour)算起,连续增加能覆盖30个period时间范围的分区,每个分区大小为period。如果现有分区在待新增的分区范围内,则跳过此新增分区。且每个period事件后再次执行此流程。
create table range_auto_1hour_tb01(id int,ip text,time timestamp) with(PERIOD='1 hour') partition by range(time)
( partition p1 values less than ('2022-11-23 14:00:00'));
索引类型
GBase 8c 提供了多种索引类型:hash,B-tree,gist,gin。每一种索引类型使用了一种不同的算法来适应不同类型的查询。
- B-tree:适合所有的数据类型,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索。
- hash:索引存储的是被索引字段VALUE的哈希值,只支持等值查询。
- Gist(Generalized Search Tree):即通用搜索树。可处理地理数据,图像,空间,树形图等场景。地理数据、图像:如果我们想要查询在某个地方是否存在某一点,即判断地理位置的“包含”。对于空间数据:Gist索引可以使用R树,以支持相对位置运算符(位于左侧,右侧,包含等)。对于树形图:R树可以支持相交或包含运算符。
- gin:gin索引是“倒排索引”。应用领域是加速全文搜索。当需要搜索多值类型内的VALUE时,适合多值类型,例如数组、全文检索、TOKEN。根据不同的类型,支持相交、包含、大于、在左边、在右边等搜索。
- 默认情况下,create index 使用B-tree索引并适合于大部分情况。
hash索引:create index ... using hash(column);
B-tree索引:create index ... using btree(column);
gist索引:create index ... using gist(column);
gin索引:create index ... using gin(column);
数据压缩
- 行存表:创建表时通过关键字 compress_type,可实现数据压缩,减少磁盘的占用。
create table test_row_compress(col text) with (compress_type = 2,COMPRESS_LEVEL = 3);
compress_type: 行存表参数,设置行存表压缩算法。1代表pglz算法,2代表zstd算法,默认不压缩(仅支持ASTORE下的普通表) 取值范围:0~2,默认值为0
COMPRESS_LEVEL:行存表参数,设置行存表压缩算法等级,仅当COMPRESS_TYPE为2时生效。压缩等级越高,表的压缩效果越好,表的访问速度越慢(仅支持ASTORE下的普通表)取值范围:-31~31,默认值为0
- 列存表 创建表时通过关键字 compression,可实现数据压缩,减少磁盘的占用。
create table test_compress(col text) with (orientation=column,compression=high);
compression:指定表数据的压缩等级,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。行存表不支持压缩。取值范围:列存表的有效值为:YES/NO/LOW/MIDDLE/HIGH,默认值为 LOW。
查表大小:
select * from pg_size_pretty(pg_catalog.pg_table_size('test_column_compress'));
事务
- 子事务:子事务允许你回滚部分已经事务中完成的工作。可通过关键字 SAVEPOINT,EXCEPTION,Autonomous Transacion 启动子事务。
- 自治事务:在主事务执行过程中新启的独立的事务。自治事务的提交和回滚不会影响已提交的数据,同时自治事务也不受主事务的影响。
自治事务在存储过程,函数和匿名块中定义,用PARAGMA AUTONOMOUS_TRANSACION 关键字来声名。