CTAS与选择计数之间的红移性能差异

时间:2017-04-29 22:14:28

标签: sql performance amazon-redshift

我有查询A,它主要是连接几个不同的表。

当我这样做时:

select count(1) from (
    A
);

查询在大约40秒内返回计数。计数不大,大约2.8M行。

然而,当我这样做时:

create table tbl as A;

其中A是相同的查询,大约需要2个小时才能完成。查询A返回14列(不多),查询中使用的所有表都是:

  • 抽真空;
  • 分析;
  • 分布在所有节点上(DISTSTYLE ALL);
  • 编码/压缩(排除键除外)。

关于我应该看什么的任何想法?

2 个答案:

答案 0 :(得分:1)

使用CREATE TABLE AS(CTAS)时,会创建一个新表。这涉及复制所有280万行数据。你没有说明你的桌子大小,但可以想象这涉及大量的数据移动。

CTAS不会复制DISTKEYSORTKEYCREATE TABLE AS documentation表示默认DISTKEYEVEN。因此,CTAS操作还涉及在节点之间重新分配数据。由于源表是DISTKEY ALL,因此至少每个节点上都有可用于分发的数据,所以这不应该太糟糕。

如果原始表格DDL包含压缩,则可能已经复制了这些设置。如果DDL 指定压缩,则复制到新表可能会触发自动压缩分析,包括加载100,000行,为每列选择压缩类型,删除该数据然后启动再次加载。这可能会耗费一些时间。

最后,它归结为Query A复杂性。 Redshift有可能通过从磁盘读取非常少的数据来优化查询,因为它意识到从磁盘读取以显示计数需要非常少的数据列(或者可能没有列)。这实际上取决于该查询的内容。

可能只是因为您有一个非常复杂的查询,需要花费很长时间才能处理(这不会作为Count的一部分进行处理)。如果查询涉及许多JOINWHERE语句,则可以通过明智地使用DISTKEYSORTKEY值进行优化。

答案 1 :(得分:0)

CREATE TABLE将查询返回的所有数据写入磁盘,count查询不会,这解释了差异。与读取行数相比,写入所有行的操作更加昂贵。