为什么 Redshift 不需要物化视图或索引?

Why does Redshift not need materialized views or indexes?

Redshift FAQ

Q: How does the performance of Amazon Redshift compare to most traditional databases for data warehousing and analytics?

内容如下:

Advanced Compression: Columnar data stores can be compressed much more than row-based data stores because similar data is stored sequentially on disk. Amazon Redshift employs multiple compression techniques and can often achieve significant compression relative to traditional relational data stores. In addition, Amazon Redshift doesn't require indexes or materialized views and so uses less space than traditional relational database systems. When loading data into an empty table, Amazon Redshift automatically samples your data and selects the most appropriate compression scheme.

为什么会这样?

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

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

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

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

老实说有点虚伪(在我看来)。尽管 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 识别要从其他列读取哪些块

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

索引在B树上运行。下面博客中的 'life without a btree' 部分通过示例解释了基于 btree 的索引如何影响 OLAP 工作负载。

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

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

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

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

Redshift 不支持物化视图,但它允许您通过 运行ning select 查询现有 tables。它最终会复制数据,但会以执行查询所需的格式(类似于物化视图)下面的博客为您提供有关上述方法的一些信息。

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

在我们最近的一个基准测试框架中,Redshift 与 Hive、Impala、Spark、BQ 等其他系统相得益彰

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

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

他们最近在 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