Amazon Redshift,在每次更新运行中都会变慢

时间:2017-03-28 22:08:53

标签: performance amazon-redshift

我从Amanzon Redshift开始。

我刚加载了一张大桌子,数百万行和171个字段。数据质量很差,必须删除很多字符。

我已为每列准备更新,因为redshift以列模式存储,我认为按列更快。

UPDATE MyTable SET Field1 = REPLACE(Field1,'〜','');

UPDATE MyTable SET Field2 = REPLACE(Field2,'〜','');

。 。

更新MyTable设置FieldN =替换(FieldN,'〜','');

第一次更新'花了1分钟。第二个花了1分40秒...

每次运行其中一个更新时,都需要比最后一个更多的时间。我跑了19分,最后一分钟差不多25分钟。每次更新所消耗的时间。一个接一个地增加。

另一件事是,第一次更新时,cpu利用率很低,现在最后一次更新需要100%

我有一个3节点的dc1.large实例集群。

我重新启动了群集,但问题仍在继续。

拜托,我需要找到解决问题的原因。

2 个答案:

答案 0 :(得分:1)

更新列时,Redshift实际上会删除所有这些行,并使用新值插入新行。所以需要回收一大堆空间。所以你需要在更新后对你的表进行VACUUM。

他们还建议您在每次更新后运行ANALYZE以更新查询计划程序的统计信息。

http://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html

答案 1 :(得分:0)

更优化的方式可能是

  1. 创建另一个相同的表。
  2. 从第一个表一次读取N(比如10000)行,使用s3处理并加载到第二个表中 加载(而不是插入)。
  3. 删除第一个表并重命名第二个表
  4. 如果遇到空间问题,请在每次迭代后从第一个表中删除N个已迁移的行并运行vacuum delete only <name_of_first_table>
  5. Refrences

    1. s3 loading:http://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html
    2. copy table from 's3://<your-bucket-name>/load/key_prefix' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' options;