我在Redshift集群中有一个表,行数约为10亿。我有一个作业试图根据一些过滤器更新一些列值。在这个表中更新任何东西都非常慢。这是一个例子:
SELECT col1, col2, col3
FROM SOMETABLE
WHERE col1 = 'a value of col1'
AND col2 = 12;
上面的查询会在不到一秒的时间内返回,因为我在col1
和col2
上有排序键。只有一行符合此条件,因此结果集只有一行。但是,如果我跑:
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,其中讨论了创建临时登台表以更新主表,但得到了相同的结果。
知道这里发生了什么吗?
答案 0 :(得分:10)
您没有提及您正在更新的表格的百分比,但重要的是要注意Redshift中的UPDATE
是一个两步过程:
如果您有大量列和/或正在更新大量行,那么此过程对数据库来说可能非常耗费人力。
您可以尝试使用CREATE TABLE AS
语句创建新的"更新"该表的版本,然后删除现有的表并重命名新表。这样做的另一个好处就是为您提供一个完全排序的表格。
答案 1 :(得分:1)
实际上我并不认为RedShift是专为批量更新而设计的,RedShift是专为OLAP而非OLTP设计的,RedShift的更新操作本质上效率低下。
在这个用例中,我建议执行INSERT而不是UPDATE,同时添加TIMESTAMP的另一列,当你对RedShift进行分析时,你需要额外的逻辑来获取最新的TIMESTAMP来消除可能性重复的数据条目。