【问题标题】:How does sortkey in Redshift work internally? [closed]Redshift 中的 sortkey 如何在内部工作? [关闭]
【发布时间】:2021-07-02 03:09:58
【问题描述】:

总的来说,我是 Redshift 和数据仓库的初学者。

当数字或时间戳列被指定为排序键时,Redshift DBMS 是否在查询期间使用二进制搜索来尽可能高效地找到所需的行?

我觉得了解更多这方面的知识会提高我的表格设计技巧。

【问题讨论】:

    标签: database amazon-web-services amazon-redshift data-warehouse


    【解决方案1】:

    Amazon Redshift 是一个列数据存储,这意味着每列都是单独存储的。这对于宽表非常有用,因为 Redshift 只需要读取查询中专门使用的列。数据库查询中最耗时的部分是磁盘访问,因此任何减少/避免磁盘访问的事情都是好事。

    当数据存储在磁盘上时,它存储在 1MB 的磁盘块中。每列可以消耗多个块,每个块只包含与一列相关的数据。 Redshift 会为每个块保留一个Zone Map,其中存储了块中存储的最小值和最大值。例如,如果查询正在搜索 2021 年的数据,并且 Redshift 知道特定块的时间戳列在 2018 年具有最大值,则它不需要从磁盘读取块来检查内容。这大大减少了查询时间。

    数据根据选定的Compression Encoding 存储在块中。这些是减少数据存储空间的非常巧妙的技术。例如,如果一列包含国家列表,并且行按国家/地区的字母顺序排序,则 Redshift 可以简单地存储该块包含 Jamaica x 63, then Japan x 104, then Jordan x 26 的事实。这可能只需要 24 个字节来存储 193 行数据,并且不要忘记每个块的大小为 1MB。因此,压缩减少了检索数据所需的磁盘访问量,再次使查询速度更快。

    回答您关于 Redshift 如何找到所需行的问题:

    • 如果在WHERE 语句中使用了 SORTKEY,那么 Redshift 可以快速找到可能包含所需数据的相关块。我不确定它是否通过二分搜索来做到这一点。
    • 如果WHERE 语句使用 SORTKEY,则查找正确的行效率不高,因为磁盘上的许多块可能包含与 WHERE 语句匹配的行,因为它们没有排序在一起。这会降低查询的效率。
    • Redshift 仍然可以“跳过”所有列的区域映射中不包含匹配数据的块,从而避免从磁盘读取这些块的需要。此外,对各个列进行压缩可以减少需要从磁盘读取的块数。

    Amazon Redshift 的一般规则是:

    • DISTKEY设置为JOIN中最常用的列
    • SORTKEY 设置为WHERE 中最常用的列

    见:Tuning query performance - Amazon Redshift

    【讨论】:

    • 这是一个出色的高级概述,但它必然会跳过大量关键细节。这个概述将让您指向正确的方向,但您距离能够使用 Redshift 有意识地正确设计系统还有一百万英里的距离(尤其是因为官方文档非常缺乏)。 Redshift 是知识密集型的 - 开发人员和用户都必须了解如何使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2010-09-15
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多