amazon-web-services - 红移 DISTKEY / SORTKEY
问题描述
我有一个非常技术性的问题,关于 Redshift 如何处理DISTKEY
和SORTKEY
内部处理以满足存储层和查询执行需求。我已经阅读了这篇精彩的文章,它很好地解释了这些关于桌子设计的含义。
我的问题是假设我有一个包含三列的表A :
CREATE TABLE (
orderdate timestamp distkey,
product_id varchar(50),
product_name varchar(250)
) SORTKEY (product_id)
现在,我们知道 Redshift 是一种针对数据仓库优化的列式方法数据库。在我的示例中,很明显,数据如何在计算节点的切片中分布的方式可能基于DISTKEY
orderdate。但是,列product_id
和会发生什么product_name
?这些是否分布orderdate
在同一个切片上,然后当我执行查询时 Redshift 使用基于我的区域映射SORTKEY
来指出具有数据的列的区域并检索它?
如果 Redshift 是一种列式方法,那么每列不应该有不同的存储方式吗?或者这真正意味着的是:基于从所有列中明智地挑选出来的列,整个列将与然后一起存储在同一个切片上DISTKEY
,然后为了保证性能,用户甚至可以将查询集中在特定区域提取所需的数据。所以我可能总体上是这样的:
DISTKEY
存储层和SORTKEY
查询执行行为
现在,如果我使用 aDISTKEY
所以我的数据是基于准时的列顺序存储的,所以如果以后,我使用 SORTKEY
另一个,因为我DISTKEY
无法更改或更改,所以这是如何工作的?
对不起,如果我错了,但我需要很好地理解这个架构是如何在内部驱动数据的。非常感谢
更新
根据回答这个问题的@JoeHarris 帖子,我试图描绘数据可能看起来是如何存储的。
第一级分布是 my DISTKEY
(日期不好,但只是遵循相同的示例),然后在内部按 my 进行红移排序SORTKEY
,给出如下内容:
感谢您的反馈
解决方案
在切片之间DISTKEY
分配行。
在您的示例中,具有给定的所有行都orderdate
将位于同一切片中。这意味着这些行的所有列都在该切片中。
如果两个表具有相同的 DISTKEY,则两个表中具有相同 DISTKEY 列值的所有行都将位于同一片上。
顺便说一句,日期和时间戳不是 DISTKEY 的好选择,因为它们很少在JOIN
. 像这样的唯一标识符product_id
会成为更好的 DISTKEY。一般规则是使用出现在 most/biggest JOIN 中的列。
SORTKEY
确定行在表中的排序方式。对于存储在每个切片上的行,它们按 SORTKEY 顺序存储。每列的数据存储在单独的块中(并且很可能每列使用许多块),但在列块中,行的顺序相同。
例如,如果一个表有三列,那么每个切片将至少占用三个块(每列一个块)。在这些列块中,行都以相同的顺序排列。
每个块也有一个最小值和最大值(“区域地图”),这使得 Redshift 很容易“跳过”不包含所需值的块。这极大地提高了性能,因为磁盘访问是操作中最慢的部分。
推荐阅读
- c# - 如何在 c# xamarin 上使用代理连接 mysql 数据库
- javascript - Jest 无法检测到模拟函数调用
- flutter - 触发flutter_local_notification时如何调用屏幕?
- reactjs - Intellisense 在 Visual Studio Code 中缺少自动导入
- python - 使用两个需要排除 python 版本的 pip 包
- java - Netbeans 8.2 实体类的会话 bean 后模块尚未部署
- android - 无法使用 kotlin 解决 Android Studio 中的数据绑定问题
- java - 当赋值运算符的优先级最低时,y=x++ 和 y=x-- 有何不同?
- android - 解锁手机并将应用程序置于前台
- r - 条形图标签不匹配