Greenplum行存与列存的选择以及转换方法

背景

数据在数据库中的存储形式多种多样,比较常见的如

1. PostgreSQL的堆表,以行的形式存储,(当变成字段压缩后的长度超过数据块的四分之一时,会以TOAST的形式存储到TOAST表)。

2. MySQL innodb则是以b+tree形式存储的。

  1. 在数据仓库产品中,如Greenplum,支持行存,也支持列存。

还有很多存储格式,本文将讨论行存和列存应该如何选择呢?

行存储优劣分析

Greenplum行存储(堆表)的优势在哪里?

数据顺序写入BLOCK中,持续写入的情况下,一条记录命中在一个块中,IO开销相对比较小,速度较快。

查询多个字段时,因为记录在一个块中命中,速度较快。

Greenplum行存储(堆表)的劣势在哪里?

查询少量字段时,也要访问整条记录,造成一定的IO浪费。

行存储的压缩比有限。

行存储适合什么应用场景

行存储适合非常典型的OLTP应用场景。

列存储优劣分析

Greenplum列存储的优势在哪里?

数据按列存储,压缩比可以做到很高。

当查询少量字段时,扫描的块更少,可以节约IO还能提升效率。

Greenplum列存储的劣势在哪里?

因为是按列存储的,当需要查询大量字段时,或者查询的记录数偏少时,会造成离散IO较多。

例如查询1条记录的20个列,行存储可能只需要扫描1个块,而列存储至少需要扫描20个块。

由于IO的放大,列存储不适合OLTP的场景,如有大量的更新,查询操作。

列存储适合什么应用场景

列存储适合非常典型的OLAP应用场景,按列做较大范围的聚合分析,或者JOIN分析。

如何设置表的存储格式

建表时,在with(storage parameter)中指定

或者在分区的with(storage parameter)中指定

或者在子分区的with(storage parameter)中指定

因此Greenplum的存储格式支持到了子分区这个级别,一张表(指父表)可以混合使用行存储与列存储。

如何转换表的存储格式

行列混合存储应用场景

例如用户如果有一张按时间分区的表,最近1个月的查询类似OLTP的请求,需要查询较多字段,而一个月以前的表则OLAP的需求更旺盛。

这种情况下,我们的需求是将老的分区转换为列存储,怎么做呢?

例子

创建分区表,选择行存储

create table t_digoal (id int, info text, crt_time timestamp) distributed by (id) partition by range(crt_time) (start (date '2016-08-01') inclusive end (date '2016-12-01') exclusive every (interval '1 day'));

查看分区定义

postgres=> select * from pg_partitions;
-[ RECORD 1 ]------------+----------------------------------------------------------------------------------------------------------------------------------------------
schemaname               | public
tablename                | t_digoal
partitionschemaname      | public
partitiontablename       | t_digoal_1_prt_1
partitionname            |
parentpartitiontablename |
parentpartitionname      |
partitiontype            | range
partitionlevel           | 0
partitionrank            | 1
partitionposition        | 1
partitionlistvalues      |
partitionrangestart      | '2016-08-01 00:00:00'::timestamp without time zone
partitionstartinclusive  | t
partitionrangeend        | '2016-08-02 00:00:00'::timestamp without time zone
partitionendinclusive    | f
partitioneveryclause     | '1 day'::interval
partitionisdefault       | f
partitionboundary        | START ('2016-08-01 00:00:00'::timestamp without time zone) END ('2016-08-02 00:00:00'::timestamp without time zone) EVERY ('1 day'::interval)
parenttablespace         | pg_default
partitiontablespace      | pg_default
-[ RECORD 2 ]------------+----------------------------------------------------------------------------------------------------------------------------------------------
schemaname               | public
tablename                | t_digoal
partitionschemaname      | public
partitiontablename       | t_digoal_1_prt_2
partitionname            |
parentpartitiontablename |
parentpartitionname      |
partitiontype            | range
partitionlevel           | 0
partitionrank            | 2
partitionposition        | 2
partitionlistvalues      |
partitionrangestart      | '2016-08-02 00:00:00'::timestamp without time zone
partitionstartinclusive  | t
partitionrangeend        | '2016-08-03 00:00:00'::timestamp without time zone
partitionendinclusive    | f
partitioneveryclause     | '1 day'::interval
partitionisdefault       | f
partitionboundary        | START ('2016-08-02 00:00:00'::timestamp without time zone) END ('2016-08-03 00:00:00'::timestamp without time zone) EVERY ('1 day'::interval)
parenttablespace         | pg_default
partitiontablespace      | pg_default

创建列存单表,用于交换分区

postgres=> create table t_digoal_col(id int, info text, crt_time timestamp) with (appendonly=true, ORIENTATION=column) distributed by (id);
CREATE TABLE

将历史分区数据插入列存储的交换分区

insert into t_digoal_col select * from t_digoal_1_prt_1;

指定对应的rank,交换分区

alter table t_digoal exchange partition for (rank(1)) with table t_digoal_col with validation;

可以使用 without validation 加快速度。

祝大家玩得开心,欢迎随时来 阿里云促膝长谈业务需求 ,恭候光临

阿里云的小伙伴们加油,努力 做好内核与服务,打造最贴地气的云数据库

时间: 2024-08-03 10:23:05

Greenplum行存与列存的选择以及转换方法的相关文章

阿里云HybridDB for PG实践 - 行存、列存,堆表、AO表的原理和选择

标签 PostgreSQL , Greenplum , 向量计算 , 行存储 , 列存 , AO表 背景 Greenplum支持行存和列存,支持堆表和AO表,那么他们有什么不同,如何选择呢? 行存和列存的原理 1.行存,以行为形式组织存储,一行是一个tuple,存在一起.当需要读取某列时,需要将这列前面的所有列都进行deform,所以访问第一列和访问最后一列的成本实际上是不一样的. 在这篇文档中,有deform的详细介绍.<PostgreSQL 向量化执行插件(瓦片式实现) 10x提速OLAP>

行存、列存,堆表、AO表性能对比 - 阿里云HDB for PostgreSQL最佳实践

标签 PostgreSQL , GIS , PostGIS , Greenplum , 空间检索 , GiST , B-Tree , geohash 背景 <Greenplum 行存.列存,堆表.AO表的原理和选择> 以上文档详细的介绍了行存.列存,堆表.AO表的原理以及选择的依据. <一个简单算法可以帮助物联网,金融 用户 节约98%的数据存储成本 (PostgreSQL,Greenplum帮你做到)> 以上文档介绍了提升基于列存的全局数据压缩比的方法. <解密上帝之手 -

HybridDB for PostgreSQL 列存表(AO表)的膨胀、垃圾检查与空间收缩

标签 PostgreSQL , Greenplum , 垃圾检测 , 膨胀 , 列存表 , gp_appendonly_compaction_threshold 背景 Greenplum支持行存储(堆存储)与AO存储,堆存储的垃圾回收和膨胀检测方法请参考: <如何检测.清理Greenplum膨胀.垃圾 - 阿里云HybridDB for PG最佳实践> 对于AO存储,虽然是appendonly,但实际上GP是支持DELETE和UPDATE的,被删除或更新的行,通过BITMAP来标记. AO存储

倒排与列存

一直傻傻分不清倒排和列存,今天有空梳理一下,主要有四个概念要明确:   1. 索引方式: 正向索引,反向索引(倒排)   2. 存储方式: 行存,列存   3. 数据结构: HashMap,B-Tree,BitMap...   4. 存储结构:      + 顺序组织(顺序文件)     + 索引组织(索引文件)     + 散列组织(散列文件)     + 链组织(多关键字文件) 索引方式 索引方式是种指导性的的思想,和具体数据结构和存储结构没有直接关系 正向索引:DocId->Value 反

Greenplum列存压缩表事务机制

事务隔离级别 我们知道Heap表的事务隔离是通过MVCC实现,但是在列存表没有记录xmin,xmax等多版本信息,仅仅记录了块的元信息以及数据,那么它是如何实现事务隔离的? 仍然借助于Heap表,每创建一个列存表,同时创建一个heap辅助表表,通过select * from pg_appendonly可以看到辅助表的OID(segrelid),这个辅助表几面记录了什么呢? typedef struct AOCSVPInfoEntry { int64 eof; int64 eof_uncompre

Greenplum列存压缩表索引机制

列存压缩表,简称AOCS表 数据生成 create table testao(date text, time text, open float, high float, low float, volume int) with(APPENDONLY=true,ORIENTATION=column); create index testao_idx on testao using btree (volume); insert into testao select t, t, t, t, t, t f

Greenplum列存压缩表原理

用法 create table testao(id int, name text) with (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576, OIDS=false) APPENDONLY=true, ORIENTATION=column这两个属性决定了这是列存压缩表. COMPRESSTYPE: 压缩方式,支持zlip,RTE等 COMPRESSLEVEL:

MySQL · 引擎特性 · Infobright 列存数据库

简介 系统架构 存储引擎 优化器和执行器 数据装载和卸载 领域知识 查询优化 简单场景的示例 小结 存储结构 Data Pack Knowledge Node 数据压缩 总结 简介 Infobright 是一个面向 OLAP 场景的开源列存数据库.比较容易找到代码的版本是 Infobright Community Edition 4.0.7,大概是 2006 年前后的代码.2016 年6 月,Infobright 决定停止开源1.由于它同时提供企业版和社区版,开源版本的功能相比企业版而言,肯定是

PgSQL · 特性介绍 · 列存元数据扫描介绍

摘要 本文通过对于阿里云分析型数据库HybridDB for postgresql 数据库的列存扫描的优化特征的解析,让大家了解列存元数据扫描是如何达到提升查询扫描的速度的效果.从而使的分析型查询执行时间进一步缩短.最终能够更好的为阿里云的用户提供更高性价比的服务. 关键字 Meta data scan,HybridDB for postgresql, GreenPlum,column store,MPP 元数据扫描,列存 一.前言 人类社会已经进入了大数据时代,在这个时代人们置身于数据的海洋里