Redshift UPDATE令人望而却步

时间:2014-09-09 18:25:15

标签: sql-update amazon-redshift

我在Redshift集群中有一个表,行数约为10亿。我有一个作业试图根据一些过滤器更新一些列值。在这个表中更新任何东西都非常慢。这是一个例子:

SELECT col1, col2, col3
FROM SOMETABLE
WHERE col1 = 'a value of col1'
  AND col2 = 12;

上面的查询会在不到一秒的时间内返回,因为我在col1col2上有排序键。只有一行符合此条件,因此结果集只有一行。但是,如果我跑:

UPDATE SOMETABLE
SET col3 = 20
WHERE col1 = 'a value of col1'
  AND col2 = 12;

此查询需要一段未知的时间(我在20分钟后停止了)。同样,它应该更新一行的一个列值。

我还尝试按照此处的文档:http://docs.aws.amazon.com/redshift/latest/dg/merge-specify-a-column-list.html,其中讨论了创建临时登台表以更新主表,但得到了相同的结果。

知道这里发生了什么吗?

2 个答案:

答案 0 :(得分:10)

您没有提及您正在更新的表格的百分比,但重要的是要注意Redshift中的UPDATE是一个两步过程:

  1. 必须首先将要更改的每一行标记为删除
  2. 然后必须为表格中的每一列编写的新版数据
  3. 如果您有大量列和/或正在更新大量行,那么此过程对数据库来说可能非常耗费人力。

    您可以尝试使用CREATE TABLE AS语句创建新的"更新"该表的版本,然后删除现有的表并重命名新表。这样做的另一个好处就是为您提供一个完全排序的表格。

答案 1 :(得分:1)

实际上我并不认为RedShift是专为批量更新而设计的,RedShift是专为OLAP而非OLTP设计的,RedShift的更新操作本质上效率低下。

在这个用例中,我建议执行INSERT而不是UPDATE,同时添加TIMESTAMP的另一列,当你对RedShift进行分析时,你需要额外的逻辑来获取最新的TIMESTAMP来消除可能性重复的数据条目。