【问题标题】:Amazon Redshift, getting slower in every update runAmazon Redshift,每次更新运行都会变慢
【发布时间】:2017-03-28 22:08:52
【问题描述】:

我从 Amanzon Redshift 开始。

我刚刚加载了一个大表,数百万行和 171 个字段。数据质量很差,有很多字符需要去掉。

我已经为每一列准备了更新,因为 redshift 以列模式存储,我想它按列更快。

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

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

。 . .

UPDATE MyTable set FieldN = Replace(FieldN, '~', '');

第一次“更新”需要 1 分钟。第二个用时 1 分 40 秒...

每次运行一个更新,它都比上一个花费更多的时间。我跑了 19 次,最后一次跑了将近 25 分钟。每一次“更新”所消耗的时间都在增加。

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

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

我已重新启动集群,但问题仍然存在。

拜托,我需要定位来找出这个问题的原因。

【问题讨论】:

    标签: performance amazon-redshift


    【解决方案1】:

    当您更新列时,Redshift 实际上会删除所有这些行并插入具有新值的新行。所以有一堆空间需要回收。所以你需要在更新后清空你的表。

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

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

    【讨论】:

    • 感谢 Jon 的回答,当我尝试 VACUUM 时,它返回此错误:SQL 错误 [500310] [XX000]: [Amazon](500310) 无效操作:1036 详细信息:超出真空列限制对于表 MyTABLE 提示:增加 wlm_query_slot_count 的值或执行深层复制而不是真空。 (PID:14666); com.amazon.support.exceptions.ErrorException: [Amazon](500310) Invalid operation: 1036 我尝试更改 wlm_query_slot_count 值但没有成功,所以我不得不进行 Deep Copy
    • 嗯,是的,真空中似乎存在内存限制。无论如何,深拷贝要快得多。这也是 aws 人们的建议:forums.aws.amazon.com/message.jspa?messageID=532773
    【解决方案2】:

    一个更优化的方法可能是

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

    参考

    1. s3 加载:http://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html

    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;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2023-03-24
      • 2011-08-16
      相关资源
      最近更新 更多