Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql CTA和select count之间的红移性能差异_Sql_Performance_Amazon Redshift - Fatal编程技术网

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小时才能完成。Query
A
返回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不会,这就解释了差异。与读取行计数相比,写入所有行的操作成本更高