如何设计排序键中有许多列的表?

Posted

技术标签:

【中文标题】如何设计排序键中有许多列的表?【英文标题】:How to design table with many columns in sort key? 【发布时间】:2019-04-04 02:51:48 【问题描述】:

我正在制作 redshift 原型,需要一些关于排序键设计的建议。我有一个包含 5 个数值和 20 列的表,可用于过滤。我使用日期作为 dist 键,但我迷失了排序键的设计。

我根据历史使用情况对排序列有权重,但是如何在 redshift 中处理这个问题。创建排序键 (col1, col2,.. col20) 似乎不是最好的方法。我是否使用前 5 个最常用的过滤器创建排序键?或者其他方法。

【问题讨论】:

【参考方案1】:

您有很多选择,一点也不容易:) 基于感觉和您描述表格的方式,我认为您应该使用 INTERLEAVED SORTKEY 并添加最多 8 列。如果列没有展开,例如 2 列是同时增长的日期,例如 start 、 end 或 id 同步增长,这不是一个好的解决方案。如果数据均匀分布在 8 列上,那么这是一个非常好的 SORTKEY 选项。

你需要做很多测试,有很多选择,你只有这个表还是其他表?

另一个问题是您将使用哪种类型的 DISTSTYLE ?桌子小,大?您有多种选择,取决于每个节点上的可用空间量和其他因素。如果您有足够的空间,请一一尝试。

请看这里:https://docs.aws.amazon.com/redshift/latest/dg/viewing-distribution-styles.html

更多信息可以帮助我更好地指导您。检查此链接:https://docs.aws.amazon.com/redshift/latest/dg/tutorial-tuning-tables.html

GL !

【讨论】:

【参考方案2】:

使用日期作为DISTKEY 是很不寻常的。

一般规则是:

DISTKEY 设置为JOIN 语句中经常使用的列。这可确保两个表中的数据位于同一个切片上,因此它们可以 JOIN 而无需在切片之间传输数据。 将SORTKEY 设置为WHERE 语句中最常用的列。这使得“跳过”包含相关数据的磁盘块更容易,因为每个块都标有列的最小值和最大值。

一般来说,避免使用交错排序,因为在运行VACUUM 时它需要太多开销。只需对WHERE 中最常用的字段进行排序,这通常是日期列。

见:Amazon Redshift Best Practices for Designing Tables

【讨论】:

以上是关于如何设计排序键中有许多列的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Laravel中查看外键中的表字段

SQL 查询:在主键中查找间隙

如何在 desc 中使用一列的多列排序?

如何从此表中选择并添加平均值然后排序[重复]

如何选择第 n 列,并在 BigQuery 中对列的选择进行排序

如何在不单独指定所有列的情况下对所有列的 SQL 结果进行排序?