Redshift UPDATE 非常慢

Posted

技术标签:

【中文标题】Redshift UPDATE 非常慢【英文标题】:Redshift UPDATE prohibitively slow 【发布时间】:2014-09-09 18:25:15 【问题描述】:

我在 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,其中谈到了创建临时登台表来更新主表,但得到了相同的结果。

知道这里发生了什么吗?

【问题讨论】:

查看该行是否有未结交易。尝试运行 SELECT * FROM pg_stat_activity;看看你的更新是否正在等待。 @Bob - 刚刚检查过,看起来没有任何东西在等待。 您应该为您的表和索引定义提供您打开的 postgres 版本以及您运行的任何命令的任何输出。你桌上有触发器吗? 还为您的选择添加一个解释计划,您的更新更多信息对于这些类型的事情是一件好事。 我对redshift一无所知,我快速浏览了文档,看起来它是postgres 8.x,与postgres有偏差,比如不受支持的命令等。我不知道知道你是否试过这个。也许更新正在将数据从一个节点移动到另一个节点,而这无法正常工作。那么,您可以将数据插入某个表中,然后删除旧数据吗?十亿行是很多行。当当。 【参考方案1】:

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

    必须首先将要更改的每一行标记为删除 然后必须为表中的每一列写入新版本的数据

如果您有大量的列和/或更新大量的行,那么这个过程对于数据库来说可能是非常耗费人力的。

您可以尝试使用CREATE TABLE AS 语句创建表的新“更新”版本,然后删除现有表并重命名新表。这还有一个额外的好处,那就是为您留下一个完全排序的表格。

【讨论】:

您能否详细说明或参考解释为什么在更改单个列时必须重写“表中的每一列”?也很好奇 UPDATE 性能在给出这个答案后的约 7 年内是否有所提高。我似乎能够在 2021 年以合理的性能对我们的 Redshift 数据集进行更新。【参考方案2】:

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

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

【讨论】:

Redshift cmets 包含插入可能很慢的语句。这可能不是解决方案

以上是关于Redshift UPDATE 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

DatagGrip 无法识别 Redshift 特定命令

Tableau 数据存储迁移到 Redshift

Redshift 终止长时间运行的查询

尝试使用 node-redshift 从节点连接到 redshift 时超时

将 IntelliJ 连接到 Amazon Redshift

(REDSHIFT) 垂直合并 / FIRST_VALUE() 作为聚合