And*_*gel 4 database-design amazon-web-services amazon-redshift
我有一个非常技术性的问题,即Redshift如何在内部处理DISTKEY以及如何SORTKEY满足存储层和查询执行需求。我读了这篇很棒的文章,很好地解释了每个关于餐桌设计的含义。
我的问题是,假设我有一个包含三列的表A:
CREATE TABLE (
orderdate timestamp distkey,
product_id varchar(50),
product_name varchar(250)
) SORTKEY (product_id)
Run Code Online (Sandbox Code Playgroud)
现在,我们知道Redshift是针对数据仓库进行优化的列式方法数据库。在我的示例中很清楚,可能数据如何在计算节点的切片之间进行分配的方式基于DISTKEY订单日期。但是,列product_id和会发生什么product_name?这些分布orderdate在同一切片上,然后在我执行查询时,Redshift使用基于我的区域图SORTKEY来指出具有数据的列的区域并进行检索?
如果Redshift是一种列式方法,那么每一列是否都应该以不同的方式存储?或这的真正含义是:基于明智地选择的一列,整个列将与一起存储在同一片上,DISTKEY然后为保证性能,用户甚至可以将查询集中在特定区域上提取所需的数据。所以我总体来说可能是这样的:
DISTKEY存储层和SORTKEY查询执行行为
现在,如果我使用a,DISTKEY那么我的数据将按守时的列顺序存储,所以如果以后再使用SORTKEY,因为我DISTKEY无法更改或更改,我将使用 另一个,所以这是如何工作的?
非常抱歉,如果我错了,但是我需要很好地了解这种架构如何在内部驱动数据。非常感谢
更新资料
基于回答这个问题的@JoeHarris帖子,我试图描绘出数据可能看起来如何存储。
发行的第一层是我的DISTKEY(日期不是很好,但仅以相同的示例为例),然后由我进行内部红移排序SORTKEY,给出如下内容:
感谢您的反馈
该DISTKEY分配行之间的切片。
在您的示例中,具有给定条件的所有行将orderdate位于同一切片中。这意味着这些行的所有列都在该切片中。
如果两个表具有相同的DISTKEY,则两个表中具有DISTKEY列的相同值的所有行将位于同一片上。
顺便说一句,日期和时间戳不是DISTKEY的理想候选者,因为它们很少在中使用JOIN。像product_id这样的唯一标识符将使DISTKEY更好。一般规则是使用出现在最大/最大JOIN中的列。
该SORTKEY决定行如何在表内排序。对于每个切片上存储的行,它们以SORTKEY顺序存储。每列的数据存储在单独的块中(很可能每列使用许多块),但是在列块中,行的顺序相同。
例如,如果一个表有三列,则每个切片将至少占据三个块(每列一个)。在这些列块中,所有行都以相同的顺序排列。
每个块还具有最小值和最大值(“区域映射”),这使Redshift非常容易“跳过”不包含所需值的块。由于磁盘访问是操作中最慢的部分,因此可以极大地提高性能。
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |