【问题标题】:INSERT INTO table SELECT Redshift super slowINSERT INTO table SELECT Redshift 超级慢
【发布时间】:2018-11-06 01:37:51
【问题描述】:

我们有一张大桌子,我们需要对其进行深度复制。 由于我们没有足够的空磁盘空间来制作一个语句,因此我尝试分批制作它。 但是批次似乎运行得非常非常缓慢。

我正在运行这样的东西:

   INSERT INTO new_table 
   SELECT * FROM old_table 
    WHERE creation_date between '2018-01-01' AND '2018-02-01'

即使查询返回少量的行 ~ 1K

SELECT * FROM old_table 
WHERE creation_date between '2018-01-01' AND '2018-02-01'
  • INSERT 查询大约需要 50 分钟才能完成。

  • old_table 有 ~286M 行和 ~400 列

  • creation_date 是SORTKEYs 之一

解释计划如下:

XN Seq Scan on old_table  (cost=0.00..4543811.52 rows=178152 width=136883)
      Filter: ((creation_date <= '2018-02-01'::date) AND (creation_date >= '2018 01-01'::date))

我的问题是:

  • INSERT 查询需要这么长时间的原因可能是什么?

【问题讨论】:

  • 查看性能选项卡,了解集群中和特定查询可能发生的情况。它应该显示您是否受到内存、IO 等的影响。此外,old_table 中有多少行以及表的SORTKEY 是什么? EXPLAIN 计划是什么样的?随时编辑您的问题以添加更多详细信息。
  • @JohnRotenstein 用更多信息更新了问题
  • 太棒了!接下来,您可以将SELECT 数据与INSERT 的时间分开。试试SELECT COUNT(*) FROM old_table WHERE creation_date between '2018-01-01' AND '2018-02-01'——这会让你有时间运行 SELECT 部分。 (您可能需要稍微更改日期以阻止它使用先前运行相同查询的缓存结果。)如果这很快,那么它似乎是INSERT 部分很慢。同样,值得查看 Performance 选项卡 以查找受限资源。
  • @JohnRotenstein 我试过运行SELECT COUNT(*) FROM old_table WHERE creation_date between '2018-01-01' AND '2018-02-01' 部分,速度很快。我在控制台的“性能”选项卡中没有看到任何有趣的东西,CPU 高达 ~75%
  • 好吧,如果SELECT 部分很快,那么下一部分是INSERT。如果可以,首先TRUNCATE 目标表(警告:它将删除所有数据!)然后尝试您的深层复制(INSERT...SELECT AS)。这将避免VACUUM 出现问题。要尝试的另一件事是增加 slot count,这会为您的查询提供更多内存。查询前先运行:set wlm_query_slot_count to 2;,看看是不是跑得更快。

标签: amazon-web-services amazon-redshift


【解决方案1】:

在我看来,以下是两种可能性——不过,如果您可以为您的问题添加更多细节,那就太好了。

  1. 正如@John 在 cmets 中所说,您的 SORTKEY 在 RedShift 中很重要,是creation_date sortkey?
  2. 您是否对您的old_table 进行了大量更新,如果是,您必须先清理VACUUM DELETE Only old_table,然后进行选择查询。

其他选项,您可能正在使用 S3 方式,但不确定是否要这样做。

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 2016-04-23
    • 2023-03-18
    • 2012-03-11
    • 2011-12-04
    • 2010-10-26
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多