【发布时间】:2021-07-02 03:09:58
【问题描述】:
总的来说,我是 Redshift 和数据仓库的初学者。
当数字或时间戳列被指定为排序键时,Redshift DBMS 是否在查询期间使用二进制搜索来尽可能高效地找到所需的行?
我觉得了解更多这方面的知识会提高我的表格设计技巧。
【问题讨论】:
标签: database amazon-web-services amazon-redshift data-warehouse
总的来说,我是 Redshift 和数据仓库的初学者。
当数字或时间戳列被指定为排序键时,Redshift DBMS 是否在查询期间使用二进制搜索来尽可能高效地找到所需的行?
我觉得了解更多这方面的知识会提高我的表格设计技巧。
【问题讨论】:
标签: database amazon-web-services amazon-redshift data-warehouse
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 语句匹配的行,因为它们没有排序在一起。这会降低查询的效率。Amazon Redshift 的一般规则是:
DISTKEY设置为JOIN中最常用的列
SORTKEY 设置为WHERE 中最常用的列
【讨论】: