【发布时间】: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