如何通过插入和更新为 Redshift 表规划 diststyle

Posted

技术标签:

【中文标题】如何通过插入和更新为 Redshift 表规划 diststyle【英文标题】:How to plan diststyle for Redshift table with inserts and updates 【发布时间】:2019-04-12 06:12:15 【问题描述】:

我有一个要求,我的 Redshift 不仅可以作为前端的语义层,还可以用于表的插入和更新。

疑问:

1) 前端将是一个简单的框架,它将表格获取到 UI 并通过分页显示,截至目前,我们正在执行 select * from table,大约需要 10 秒才能获取大约 3000 行。可以做得更快吗?

2) 这对我来说是一个非常新的用例,我正在尝试找出在这种情况下哪种分发方式最好?数据非常小,只有几万左右。我正在使用 diststyle all,因为文档建议将它全部用于任何少于 100 万行的表。

3) 对于插入/更新,我们需要一个唯一列,因此我们在表格顶部创建一个自定义标识 (1,1) 列,并将其设置为排序键,因为每次更新都将通过搜索数据库中的唯一行,插入只会为其添加一个增量值。这是正确的方法还是有更复杂的方法来解决这个问题?

4) 欢迎任何其他建议。

【问题讨论】:

【参考方案1】:

像 Amazon Redshift 这样的数据仓库在执行INSERTUPDATE 操作方面非常糟糕。

原因是每当修改一行(UPDATE)时,当前行被标记为已删除,并在存储空间的末尾追加一个新行。即使一列中只有一个值被修改,这也适用。这是因为数据是在存储块内压缩的,如果不重写整个块,就无法修改压缩数据。

当使用INSERT 添加数据时,新行将添加到每一列的存储区域的末尾。 (作为一个列式数据库,每一列都是单独存储的。)这意味着每当添加数据时,未排序区域都会增长,从而降低使用表查找数据的效率。这可以通过运行 VACUUM 来解决,这将重新排序行。

Amazon Redshift 不适合用作标准 OLTP 数据库。相反,它最适合从现有数据源加载大量信息并跨数百万行运行复杂查询。

您最好在普通数据库中进行此类更新,然后将数据提取到 Redshift 以用于报告(“只读”)目的。

对于DISTKEY/SORTKEY,一般规则是:

DISTKEY 设置为JOIN 中最常用的列,因为它将两个表中的数据共同定位到同一个切片中 将SORTKEY 设置为WHERE 语句中最常用的列,因为它允许Redshift“跳过”包含匹配行的磁盘块。

【讨论】:

以上是关于如何通过插入和更新为 Redshift 表规划 diststyle的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中更新整个表的正确方法,删除表 + 创建表与截断 + 插入表

是否可以在 Redshift 中并行运行查询?

Redshift - 将文本列插入数据库表的问题

AWS Glue to Redshift:是否可以替换,更新或删除数据?

Redshift 复制命令追加、替换或更新插入?

Redshift:使用来自另一个表的随机数据更新或插入列中的每一行