【玩转PB级数仓GaussDB(DWS)】行列存对比的一些事

举报
sevenjiang 发表于 2023/02/06 19:22:45 2023/02/06
【摘要】 行存表示了一种数据的存储方式,是最传统的一种存储方式。对于GaussDB(DWS)来说可以认为其表示存储引擎的基础实现,在其之上逐步构筑l了列存和hdfs之类的存储特性。如下简单介绍下行列存使用的一些对比。集群设置介绍:参数default_orientation控制建表不指定存储方式的默认行为。通过如下建表显式设置可以指定行列存储:ORIENTATION指定表数据的存储方式,即行存方式、列存...

行存表示了一种数据的存储方式,是最传统的一种存储方式。对于GaussDB(DWS)来说可以认为其表示存储引擎的基础实现,在其之上逐步构筑l了列存和hdfs之类的存储特性。如下简单介绍下行列存使用的一些对比。
集群设置介绍:
参数default_orientation控制建表不指定存储方式的默认行为。
通过如下建表显式设置可以指定行列存储:
ORIENTATION
指定表数据的存储方式,即行存方式、列存方式,该参数设置成功后就不再支持修改。
取值范围:
•    ROW,表示表的数据将以行式存储。
行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。
•    COLUMN,表示表的数据将以列式存储。
列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少

适用场景:
列储存优势:
    列的数据特征比较相似,适合压缩,压缩比很高
    表列的个数比较多,但是访问的列个数比较少, 列存可以大大减少不必要的IO读, 提高性能
    基于列批量数据的运算,CPU的cache命中率比较高,性能比较好
    列存储引擎更适合OLAP大数据统计分析的场景。
列储存劣势:
    列存表(delta表但默认并没有启用)不适合小量 insert 及update操作
行存储优势:
    点查询(返回记录少,基于索引的简单查询)
    增、删、改操作较多的场景
    主要使用整张表的内容,而不是单独某几个列,并且所关注的内容不需要通过任何聚集运算,推荐使用行式存储
对比现状:
    类型支持范围不同 
    不支持表达式索引,索引失效 
    行存默认btree索引,列存默认psort,主健是813版本支持的,老版本不支持 
    老版本列存复制表不支持更新,813版本支持 
    表级的check约束列存不支持 
    cu锁的问题,并发更新会报错 
    没有并发更新,但是开启delta表,更新/delete概率出错
    小CU的问题突出,引发空间膨胀,性能问题等 
    exchange要求表的with中option一致

列存导入实现方式:
(1)列存表推荐使用批量插入(INSERT INTO SELECT/COPY),单行记录插入会造成空间浪费,访问效率下降;
(2)导入数据按列缓存,默认每60000行(通过max_batchrow修改)或者1G的大小生成CU;
(3)生成CU时,根据数据类型,默认low压缩级别(通过compression修改),进行压缩。
(4)先写入CUDesc,再写入CU,同时将CU插入到数据复制队列。最后写入VCU;
(5)CU文件是追加写(APPEND ONLY)。
(6)分区表注意:
    每一个分区是一个独立的列存表;
    vector batch的进入,单条数据进入bulkload_row;
    下盘、读取的处理;
    内存自适应。

存在行列存join情况:
行存列存JOIN 转换的执行计划不符合预期,可以通过  set    enable_force_vector_engine = on;  进行下优化:
enable_force_vector_engine
参数说明:对于支持向量化的执行器算子,如果其子节点是非向量化的算子,通过设置此参数为on,强制生成向量化的执行计划。
当打开enable_force_vector_engine开关时,无论是行存表、列存表或者是行列混存,如果plantree中不包含不支持向量化的场景,则强制走向量化执行引擎。
参数类型:USERSET
取值范围:布尔型
默认值:off

手工基础行转列操作,如果表有业务执行,需要进行加锁或者事务中执行,视图和索引进行单独处理:
create table schema.row_table1 (like schema.table1 including all EXCLUDING RELOPTIONS EXCLUDING INDEXES) WITH (ORIENTATION=column;
insert into schema.row_table1 select * from schema.table1;
ALTER TABLE schema.row_table1 ADD CONSTRAINT row_table1_pk PRIMARY KEY (xxx_id);
alter table rename schema.table1 to col_table1;
alter table rename schema.row_table1 to table1;

【一起来玩转PB级数仓GaussDB(DWS),分享你的技术经验与体验心得,赢开发者大礼包!】第19期有奖征文火热进行中

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。