代码之家  ›  专栏  ›  技术社区  ›  Andres Urrego Angel

红移DISTKEY/SORTKEY

  •  0
  • Andres Urrego Angel  · 技术社区  · 7 年前

    DISTKEY SORTKEY 内部以满足存储层和查询执行需求。我读过这本书 post 这很好地解释了这些关于桌子设计的每一个含义。

    我的问题是假设我有一张桌子

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

    现在,我们知道Redshift是一种为数据仓库优化的列式方法。在我的示例中,很明显,数据在计算节点的片上分布的方式可能是基于 订单日期。但是,这个专栏怎么办 product_id 和 product_name ? 这些都是和我们一起分发的吗 orderdate 在同一个切片上,然后当我执行查询时,Redshift使用基于我的 排序键 指出包含数据的列的区域并检索它?

    如果红移是一种列式方法,那么每个列的存储方式不应该不同吗?或者这真正意味着:基于在所有列中明智地选择的列,整个列将与 距离键 然后,为了保证性能,用户甚至可以将查询集中在特定区域上,以提取所需的数据。所以我可能会说:

    距离键 存储层和 排序键 查询执行行为

    现在如果我用 因此,我的数据是基于准时列顺序存储的,因此如果以后使用 排序键 距离键

    抱歉,各位,如果我错了,我需要很好地理解这种体系结构是如何在内部驱动数据的。非常感谢

    更新

    第一级分配是我的 (日期不是很好,只是跟在同一个例子后面)然后内部红移按我的排序 排序键 ,给出类似于:

    enter image description here

    谢谢你的反馈

    1 回复  |  直到 7 年前
        1
  •  28
  •   John Rotenstein    7 年前

    DISTKEY 分发

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

    两张桌子 具有相同值的DISTKEY列将位于同一片上。

    顺便说一句,日期和时间戳不是DISTKEY的好候选对象,因为它们很少在应用程序中使用 JOIN product_id 会成为一个更好的DISTKEY。一般规则是使用出现在最大/最大联接中的列。

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

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

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

    推荐文章