我有查询A
,它主要是连接几个不同的表。
当我这样做时:
select count(1) from (
A
);
查询在大约40秒内返回计数。计数不大,大约2.8M行。
然而,当我这样做时:
create table tbl as A;
其中A是相同的查询,大约需要2个小时才能完成。查询A
返回14列(不多),查询中使用的所有表都是:
关于我应该看什么的任何想法?
答案 0 :(得分:1)
使用CREATE TABLE AS
(CTAS)时,会创建一个新表。这涉及复制所有280万行数据。你没有说明你的桌子大小,但可以想象这涉及大量的数据移动。
CTAS不会复制DISTKEY
或SORTKEY
。 CREATE TABLE AS
documentation表示默认DISTKEY
为EVEN
。因此,CTAS操作还涉及在节点之间重新分配数据。由于源表是DISTKEY ALL
,因此至少每个节点上都有可用于分发的数据,所以这不应该太糟糕。
如果原始表格DDL包含压缩,则可能已经复制了这些设置。如果DDL 不指定压缩,则复制到新表可能会触发自动压缩分析,包括加载100,000行,为每列选择压缩类型,删除该数据然后启动再次加载。这可能会耗费一些时间。
最后,它归结为Query A
的复杂性。 Redshift有可能通过从磁盘读取非常少的数据来优化查询,因为它意识到从磁盘读取以显示计数需要非常少的数据列(或者可能没有列)。这实际上取决于该查询的内容。
可能只是因为您有一个非常复杂的查询,需要花费很长时间才能处理(这不会作为Count的一部分进行处理)。如果查询涉及许多JOIN
和WHERE
语句,则可以通过明智地使用DISTKEY
和SORTKEY
值进行优化。
答案 1 :(得分:0)
CREATE TABLE将查询返回的所有数据写入磁盘,count查询不会,这解释了差异。与读取行数相比,写入所有行的操作更加昂贵。