为啥 Amazon Redshift UNLOAD 性能对于新数据要好得多?

Posted

技术标签:

【中文标题】为啥 Amazon Redshift UNLOAD 性能对于新数据要好得多?【英文标题】:Why Amazon Redshift UNLOAD performance is much better for fresh data?为什么 Amazon Redshift UNLOAD 性能对于新数据要好得多? 【发布时间】:2017-06-26 12:43:21 【问题描述】:

我想知道为什么在按不是排序键或排序键的一部分的列进行选择时从大表(>1000 亿行)中卸载对于新添加的数据要快得多. Redshift 如何理解在第二种情况下是时候停止顺序扫描了?

执行查询所花费的时间。 39m 37.02s:

UNLOAD ('SELECT * FROM production.some_table WHERE daytime BETWEEN 
\\'2017-01-15\\' AND \\'2017-01-16\\'') TO ...

对比

执行查询所花费的时间。 23.01 秒:

UNLOAD ('SELECT * FROM production.some_table WHERE daytime BETWEEN 
\\'2017-06-24\\' AND \\'2017-06-25\\'') TO ... 

谢谢!

【问题讨论】:

【参考方案1】:

Amazon Redshift 使用 区域映射 来识别存储在磁盘上每个 1MB 块中的最小值和最大值。每个块只存储与单个列相关的数据(例如daytime)。

如果SORTKEY设置为daytime,则数据未排序,任何特定日期都可能出现在许多不同的块中。如果使用SORTKEY,则特定日期将仅出现在最少数量的块中。

即使没有SORTKEY,您的第二个查询也可能执行得更快,因为您查询的数据可能是最近添加的,因此所有数据一起存储在几个块中。历史数据可能分布在许多块中,因为VACUUM 可能根据正确的SORTKEY 对数据进行了重新排序。事实上,如果您现在执行VACUUM,您可能会发现您的第二个查询变得更慢了。

【讨论】:

以上是关于为啥 Amazon Redshift UNLOAD 性能对于新数据要好得多?的主要内容,如果未能解决你的问题,请参考以下文章

从 Amazon Redshift UNLOAD 创建对 RFC-4180 友好的 CSV 文件的最佳方法是啥?

Redshift UNLOAD 语句在 19 分钟后被取消

Amazon Redshift - 卸载到 S3 - 动态 S3 文件名

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?

为啥 Amazon Redshift 会截断此 JSON 浮点数据的精度?

为啥 Redshift 和 S3 之间的 AWS 文件大小不同?