Sql CTA和select count之间的红移性能差异
我有一个查询Sql CTA和select count之间的红移性能差异,sql,performance,amazon-redshift,Sql,Performance,Amazon Redshift,我有一个查询A,它主要连接了几个不同的表 当我这样做时: select count(1) from ( A ); 查询将在大约40秒内返回计数。数量不大,大约有280万排 然而,当我这样做时: create table tbl as A; 如果是同一个查询,则大约需要2小时才能完成。QueryA返回14列(不多),查询中使用的所有表包括: 抽真空 分析 分布在所有节点上(DISTSTYLE all) 编码/压缩(排序键上除外) 关于我应该看什么有什么想法吗?当使用创建表作为(CT
A
,它主要连接了几个不同的表
当我这样做时:
select count(1) from (
A
);
查询将在大约40秒内返回计数。数量不大,大约有280万排
然而,当我这样做时:
create table tbl as A;
如果是同一个查询,则大约需要2小时才能完成。QueryA
返回14列(不多),查询中使用的所有表包括:
- 抽真空李>
- 分析李>
- 分布在所有节点上(DISTSTYLE all)李>
- 编码/压缩(排序键上除外)
关于我应该看什么有什么想法吗?当使用
创建表作为(CTA)时,会创建一个新表。这涉及到复制所有280万行数据。您没有说明表的大小,但这可能涉及大量数据移动
CTAS不会复制DISTKEY
或SORTKEY
。表示默认的DISTKEY
是偶数
。因此,CTAS操作还将涉及在节点之间重新分配数据。由于源表是DISTKEY ALL
,因此每个节点上至少都有数据可供分发,所以这应该不会太糟糕
如果原始表DDL包含压缩,则这些设置可能已被复制。如果DDL没有指定压缩,那么复制到新表可能触发了自动压缩分析,其中包括加载100000行,为每列选择压缩类型,删除该数据,然后再次启动加载。这可能需要一些时间
最后,它归结为查询A
的复杂性。Redshift可能通过从磁盘读取很少的数据来优化查询,因为它意识到从磁盘读取数据(或者可能不需要任何列)来显示计数。这实际上取决于该查询的内容
可能只是因为您得到了一个非常复杂的查询,需要很长时间来处理(这不是计数的一部分)。如果查询涉及许多JOIN
和WHERE
语句,则可以通过明智地使用DISTKEY
和SORTKEY
值对其进行优化。CREATE TABLE将查询返回的所有数据写入磁盘,count query不会,这就解释了差异。与读取行计数相比,写入所有行的操作成本更高