【问题标题】:Why does Redshift not need materialized views or indexes?为什么 Redshift 不需要物化视图或索引?
【发布时间】:2016-09-29 13:40:23
【问题描述】:

Redshift FAQ

问:Amazon Redshift 在数据仓库和分析方面的性能与大多数传统数据库相比如何?

上面写着:

高级压缩:与基于行的数据存储相比,列式数据存储的压缩率更高,因为类似的数据按顺序存储在磁盘上。 Amazon Redshift 采用多种压缩技术,相对于传统的关系数据存储,通常可以实现显着的压缩。此外,Amazon Redshift 不需要索引或物化视图,因此比传统的关系数据库系统占用更少的空间。将数据加载到空表中时,Amazon Redshift 会自动对您的数据进行采样并选择最合适的压缩方案。

为什么会这样?

【问题讨论】:

    标签: sql amazon-redshift materialized-views


    【解决方案1】:

    评论太长了。

    简单的答案是:因为它可以真正、非常快速地并行读取所需的数据。

    索引的主要用途之一是“大海捞针”查询。这些查询只需要相对较少的行数,并且匹配WHERE 子句。列式数据存储以不同方式处理这些问题。整个列被读入内存——但只有列,而不是行的其余数据。这有点类似于在每一列上都有一个索引,除了需要扫描匹配的值(这就是并行性派上用场的地方)。

    索引的其他用途是匹配键对以进行连接或聚合。这些可以通过其他基于哈希的算法来处理。

    对于物化视图,RedShift 的优势在于不更新数据。许多这样的查询在没有具体化的情况下已经足够快了。而且,实现在高事务环境中维护数据会产生大量开销。如果您没有高事务环境,那么您可以在批量加载后增加临时表。

    【讨论】:

    • 嗯,有道理。您能否澄清If you don't have a high transaction environment, then you can increment temporary tables after batch loads. 的含义?我不太确定我是否遵循。
    • 据我所知,根据我的经验,RedShift 不使用entire column is read into memory 范式。相反,它甚至比这更细粒度。列被分成 1MB 的块,其中包含允许根本不读取某些块的汇总统计信息。事实上,如果该字段是唯一的,汇总统计信息允许引擎识别一个要读取的 1MB 块,其余的则忽略。
    • @MatBailie 。 . .我的理解是“页面”标题包含页面上列的最小值和最大值。这对于“排序”列(例如,自动递增的 id 或插入时间)来说是一个巨大的好处。它可能对其他列有益,但不一定如此。当然,这些事情可能会随着时间而改变,所以我的理解可能已经过时了。
    【解决方案2】:

    说实话有点不诚实(在我看来)。尽管 RedShift 两者都没有,但我不确定这与说它不会从中受益是一样的。

    物化视图

    我真的不知道他们为什么提出这种说法。可能是因为他们认为引擎的性能如此之高,以至于拥有它们的收益微乎其微。

    我会对此提出异议,并且我所从事的产品保持其自己的物化视图,并且可以通过这样做显示出显着的性能提升。也许 AWS 一开始就认为我一定做错了什么?

    索引

    RedShift 没有索引。

    它确实有SORT ORDER,它与聚集索引非常相似。它只是对数据进行排序的字段列表(如复合聚集索引)。

    它最近甚至推出了INTERLEAVED SORT KEYS。这是对多个独立排序顺序的直接尝试。而不是按a THEN b THEN c 订购它有效地按他们每个人订购同时

    这成为可能,因为 RedShift 如何实现其列存储。
    - 每列与其他列分开存储
    - 每列存储在 1MB 块中
    - 每个1MB块都有汇总统计

    除了作为存储模式之外,这实际上变成了一组伪索引。
    - 如果数据按a then b then x排序
    - 但你想要z = 1234
    - RedShift 首先查看块统计信息(针对 z 列)
    - 这些统计数据将显示该块存储的最小值和最大值
    - 这允许 Redshift 在某些条件下跳过其中许多块
    - 这个实习生允许 RedShift 识别从其他列中读取哪些块

    【讨论】:

    • 如果我要手动在 redshift 中创建物化视图,我应该只是在间隔内创建和删除表吗?
    • @AR7 - 这取决于你。我们处理数 TB 的数据集。重建整张桌子至少可以说是惩罚性的。 RedShift 的 UPDATE 行为是软删除记录(直到 VACUUM)并在表的未排序部分中插入新数据。出于这个原因,我们只需删除任何已更改或消失的内容,然后插入任何已更改或新的内容。然后在整理阶段处理 VACUUM 和 ANALYZE。重新构建将避免未排序的块,并且本身比 VACUUM 更快。这是一种权衡。
    • 您有什么资源可以推荐用于使用 redshift 吗?我对使用它很陌生,目前那里没有那么多数据,但它肯定会增长,我宁愿不要毫无准备。我对吸尘或 redshift 的最佳实践知之甚少,除了亚马逊在他们的文档中提供的内容之外,我还想了解更多关于它的信息。
    • @AR7 - 说实话,亚马逊自己的文档是最好的资源。里面有很多东西。下一个最好的方法是搜索有关 RedShift 的博客,并通过错误信息的混合搜索并搜索真正的珍珠。我学到的大部分内容都是将上述两者与实际的现实世界经验相结合。不是快速学习的理想方法,而是了解真相的好方法(如果你能有足够的纪律性)
    【解决方案3】:

    索引基本上在 OLTP 系统中用于检索特定或一小组值。相反,OLAP 系统检索大量值并对大量值执行聚合。索引不适合 OLAP 系统。取而代之的是,它使用一种称为带排序键的区域映射的二级结构。

    索引在 B 树上运行。以下博客中的“没有 btree 的生活”部分通过示例解释了基于 btree 的索引如何影响 OLAP 工作负载。

    https://blog.chartio.com/blog/understanding-interleaved-sort-keys-in-amazon-redshift-part-1

    列式存储、压缩编码、数据分布、压缩、查询编译、优化等的组合为 Redshift 提供了更快的能力。

    实施上述因素,减少了 Redshift 上的 IO 操作并最终提供更好的性能。要实施有效的解决方案,需要对上述部分以及您将在 Amazon Redshift 上运行的查询有大量知识。

    例如。 Redshift 支持排序键、复合排序键和交错排序键。 如果您的表结构是 lineitem(orderid,linenumber,supplier,quantity,price,discount,tax,returnflat,shipdate)。 如果您选择 orderid 作为排序键,但如果您的查询基于shipdate,则 Redshift 将有效运行。 如果您在 (orderid, shipdate) 上有一个复合排序键,并且您的查询仅针对发货日期,那么 Redshift 将无法有效运行。 如果您在 (orderid, shipdate) 上有一个交错软键并且您的查询

    Redshift 不支持物化视图,但它允许您通过在现有表上运行选择查询来轻松创建(临时/永久)表。它最终会复制数据,但以所需的格式执行查询(类似于物化视图) 下面的博客为您提供了有关上述方法的一些信息。

    https://www.periscopedata.com/blog/faster-redshift-queries-with-materialized-views-lifetime-daily-arpu.html

    在我们最近的一个基准框架中,Redshift 与 Hive、Impala、Spark、BQ 等其他系统配合得很好

    【讨论】:

      【解决方案4】:

      截至 2019 年 12 月,Redshift 提供了物化视图的预览:Announcement

      来自文档:物化视图包含一个预先计算的结果集,基于对一个或多个基表的 SQL 查询。您可以发出 SELECT 语句来查询物化视图,就像查询数据库中的其他表或视图一样。 Amazon Redshift 从具体化视图返回预先计算的结果,而根本无需访问基表。从用户的角度来看,与从基表中检索相同数据时相比,查询结果的返回速度要快得多。

      【讨论】:

        【解决方案5】:

        他们最近在 Redshift 中添加了对物化视图的支持:https://aws.amazon.com/about-aws/whats-new/2019/11/amazon-redshift-introduces-support-for-materialized-views-preview/

        物化视图创建的语法:

        CREATE MATERIALIZED VIEW mv_name
        [ BACKUP { YES | NO } ]
        [ table_attributes ]   
        AS query 
        

        刷新物化视图的语法:

        REFRESH MATERIALIZED VIEW mv_name
        

        【讨论】:

        • 有没有办法在 RS 中安排 MV 刷新。一种简单的方法是触发在数据库上执行刷新命令的计划 Lambda。想知道是否有任何原生 RS 功能可以做到这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        相关资源
        最近更新 更多