写点什么

对比分析数仓中行列存的特性

  • 2023-03-13
    中国香港
  • 本文字数:1715 字

    阅读完需:约 6 分钟

对比分析数仓中行列存的特性

本文分享自华为云社区《【玩转PB级数仓GaussDB(DWS)】行列存对比的一些事》,作者:sevenjiang。


行存表示了一种数据的存储方式,是最传统的一种存储方式。对于 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 期有奖征文火热进行中


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
对比分析数仓中行列存的特性_数据库_华为云开发者联盟_InfoQ写作社区