我有一个表,其中的列像record_id、creation_date、active_time、inactive_time和其他一些数据列。截至目前,该表中约有1200万条记录。表中的distinct'record_id'(varchar(6((值计数为:8M(数据分布在此列上是偶数(表中的不同"creation_date"(日期(值计数为:800(数据分布在此列上是偶数(集群细节-总共有16个切片。
如果我讨论这个表与其他表的联接,它主要基于列"record_id"one_answers"creation_date"。一些时间active_time和inactive_time也参与加入。
问题是:-
- 这个表的distribution_key应该取什么,record_id还是creation_Date
- 我应该拿什么排序键?正如我上面所说,activetime和inactivetime有时也会参与联接,那么我应该在排序键中包括这2列吗
亚马逊Redshift的一般规则是:
- 将
DISTKEY
设置为JOIN
中最常用的列 - 将
SORTKEY
设置为WHERE
中最常用的列
对于Redshift来说,一个有1200万行的表不是很大。即使你弄错了,它也会运行得很好。
我建议使用record_id
的DISTKEY(因为它似乎经常是JOINed(。
将SORTKEY设置为您通常用来限制结果的值。它只能是一列。Redshift将按给定列的顺序存储行,并在每个1MB存储块中记住该列的最小值和最大值。这允许它"跳过"不包含该值的块。这使得查询运行得很快,因为它可以避免磁盘访问,而磁盘访问是任何数据库中最慢的部分。
请参阅:亚马逊Redshift设计表格的最佳实践-亚马逊Redshift