首页 > 解决方案 > 红移 DISTKEY / SORTKEY

问题描述

我有一个非常技术性的问题,关于 Redshift 如何处理DISTKEYSORTKEY内部处理以满足存储层和查询执行需求。我已经阅读了这篇精彩的文章,它很好地解释了这些关于桌子设计的含义。

我的问题是假设我有一个包含三列的表A :

CREATE TABLE (
orderdate timestamp distkey,
product_id varchar(50),
product_name varchar(250)
) SORTKEY (product_id)

现在,我们知道 Redshift 是一种针对数据仓库优化的列式方法数据库。在我的示例中,很明显,数据如何在计算节点的切片中分布的方式可能基于DISTKEYorderdate。但是,列product_id和会发生什么product_name?这些是否分布orderdate在同一个切片上,然后当我执行查询时 Redshift 使用基于我的区域映射SORTKEY来指出具有数据的列的区域并检索它?

如果 Redshift 是一种列式方法,那么每列不应该有不同的存储方式吗?或者这真正意味着的是:基于从所有列中明智地挑选出来的列,整个列将与然后一起存储在同一个切片上DISTKEY,然后为了保证性能,用户甚至可以将查询集中在特定区域提取所需的数据。所以我可能总体上是这样的:

DISTKEY存储层和SORTKEY查询执行行为

现在,如果我使用 aDISTKEY所以我的数据是基于准时的列顺序存储的,所以如果以后,我使用 SORTKEY另一个,因为我DISTKEY无法更改或更改,所以这是如何工作的?

对不起,如果我错了,但我需要很好地理解这个架构是如何在内部驱动数据的。非常感谢

更新

根据回答这个问题的@JoeHarris 帖子,我试图描绘数据可能看起来是如何存储的。

第一级分布是 my DISTKEY(日期不好,但只是遵循相同的示例),然后在内部按 my 进行红移排序SORTKEY,给出如下内容:

在此处输入图像描述

感谢您的反馈

标签: amazon-web-servicesdatabase-designamazon-redshift

解决方案


在切片之间DISTKEY分配行。

在您的示例中,具有给定的所有行都orderdate将位于同一切片中。这意味着这些行的所有列都在该切片中。

如果两个表具有相同的 DISTKEY,则两个表中具有相同 DISTKEY 列值的所有行都将位于同一片上。

顺便说一句,日期和时间戳不是 DISTKEY 的好选择,因为它们很少在JOIN. 像这样的唯一标识符product_id会成为更好的 DISTKEY。一般规则是使用出现在 most/biggest JOIN 中的列。

SORTKEY确定行在表中的排序方式。对于存储在每个切片上的行,它们按 SORTKEY 顺序存储。每列的数据存储在单独的块中(并且很可能每列使用许多块),但在列块中,行的顺序相同。

例如,如果一个表有三列,那么每个切片将至少占用三个块(每列一个块)。在这些列块中,行都以相同的顺序排列。

每个块也有一个最小值和最大值(“区域地图”),这使得 Redshift 很容易“跳过”不包含所需值的块。这极大地提高了性能,因为磁盘访问是操作中最慢的部分。


推荐阅读