我在redshift DC28XL集群中有一个表,该表有约527M行。
我添加了特定的varchar列(称为segment)作为dist键和sort键。每个细分市场大约有4M行。当我对一个段select * from table where segment ='s1';
使用where子句运行一个简单的select时,Redshift始终执行顺序扫描,并花费3分钟以上。
有人可以为我提供避免全表扫描并将性能降低到10秒或更短的方法吗?
答案 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
来确定应压缩的列