使用带有压缩的列存储但允许更新最近行的解决方案 - Greenplum

Posted

技术标签:

【中文标题】使用带有压缩的列存储但允许更新最近行的解决方案 - Greenplum【英文标题】:Solutions for using columnar store with compression but allowing recent rows to be updated - Greenplum 【发布时间】:2014-09-17 13:54:01 【问题描述】:

我正在寻找某人在 Greenplum(或另一个 MPP 数据库中)解决以下问题的具体示例:

我有大型事实表,我想以列方向存储并进行压缩(在 Greenplum 中,这具体是 5 级 zlib 压缩)。

但是,每个新行都有一个很短的时间段,可以在它变为“静态”之前对其进行更新 - 例如,允许更改某个值,直到引发某个标志。在 Greenplum 中要使用压缩,我需要使用“仅附加”表类型,这意味着无法安全地直接更新行。

因此,在我缺乏经验的头脑中,我认为解决此问题的方法可能是拥有两个表 - 一个保存允许更新的行,它可以使用标准 HEAP 存储并且没有压缩,另一个只保存那些已成为“静态”(绝大多数),呈柱状方向并被压缩。

显然,其中涉及的机制使生活变得更加复杂(如果我想查看所有内容,将两者结合起来,触发从一个表中删除并在行变为静态时插入另一个表,等等等)所以我非常感谢听到这个问题的现实解决方案。

谢谢

安迪。

【问题讨论】:

【参考方案1】:

Greenplum 4.3.x 允许你更新面向列的表,你应该使用这个版本

一般来说,您可以有分区表,通过“可更新”标志进行分区(一个分区应该是 AO CO,一个堆)。这样您的选择查询不会受到影响,但是将数据从一个分区移动到另一个分区需要从堆分区中删除数据并将其插入面向列的分区(虽然实现起来并不复杂)

【讨论】:

以上是关于使用带有压缩的列存储但允许更新最近行的解决方案 - Greenplum的主要内容,如果未能解决你的问题,请参考以下文章

在具有 350 亿行的列存储索引表上重新创建索引

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

更新重复行的列oracle

如何检查/更新数据库中包含大约百万行的列?

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引

存储过程禁止空参数