即使使用where子句

时间:2019-01-08 22:49:35

标签: amazon-redshift

我在redshift DC28XL集群中有一个表,该表有约527M行。

我添加了特定的varchar列(称为segment)作为dist键和sort键。每个细分市场大约有4M行。当我对一个段select * from table where segment ='s1';使用where子句运行一个简单的select时,Redshift始终执行顺序扫描,并花费3分钟以上。

有人可以为我提供避免全表扫描并将性能降低到10秒或更短的方法吗?

3 个答案:

答案 0 :(得分:2)

Amazon Redshift的一个很好的经验法则是:

  • DISTKEY设置为JOIN中最常用的列
  • SORTKEY设置为WHERE中最常用的列

由于您的数据是由segment分发的,并且您要查询单个segment,因此所有活动都在一个切片上进行。因此,这不是一个非常有效的操作。

如果此数据在segment子句中经常使用WHERE,则SORTKEY应该是segment,其他应该是DISTKEY(最好是在JOINs中使用的内容,或者,如果未使用JOINs,则使用DISTKEY EVEN)。

答案 1 :(得分:0)

如果将分发样式设置为偶数并将排序关键字保留为段,则可能会获得更好的性能。这将使数据均匀地分布在切片上,但是将段值保持在块内排序在一起。您将以这种方式获得最大程度的并行化,并最大程度地减少需要读取的块。

答案 2 :(得分:0)

我同意Nate的发布风格应该是均匀的。 为了提高性能,建议不要压缩排序键,您需要使用ENCODE raw

检查Redshift工程师回答的问题。

AWS Redshift : DISTKEY / SORTKEY columns should be compressed?

您可以运行ANALYZE COMPRESSION table来确定应压缩的列