如何使用插入和更新为 Redshift table 规划 diststyle

How to plan diststyle for Redshift table with inserts and updates

我有一个要求,我的 Redshift 不仅是前端的语义层,而且还用于 tables 上的插入和更新。

疑惑:

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

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

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

4) 欢迎任何其他建议。

像 Amazon Redshift 这样的数据仓库在执行 INSERTUPDATE 操作方面很差。

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

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

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

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

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

  • DISTKEY 设置为 JOIN 中最常用的列,因为它将来自两个 table 的数据共同定位到同一个切片
  • SORTKEY 设置为 WHERE 语句中最常用的列,因为它允许 Redshift "skip over" 磁盘块 包含匹配的行。