使用具体化视图将内容粘贴到 SUPER 列中 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用具体化视图将内容粘贴到 SUPER 列中

以下示例显示了一个具体化视图,该视图对嵌套数据进行剪切,生成的列仍为 SUPER 数据类型。

SELECT c.c_name, o.o_orderstatus FROM customer_orders_lineitem c, c.c_orders o;

以下示例显示了一个具体化视图,该视图根据已销毁的数据创建传统Amazon Redshift标量列。

SELECT c.c_name, c.c_orders[0].o_totalprice FROM customer_orders_lineitem c;

您可以创建单个具体化视图 super_mv 来加速这两个查询。

要回答第一个查询,您必须具体化属性 o_orderstatus。您可以省略属性 c_name,因为它不涉及嵌套导航也不涉及取消嵌套。您还必须在具体化视图中包含 customer_orders_lineitem 的属性 c_custkey,以便能够将基表与具体化视图联接。

要回答第二个查询,您还必须具体化 c_orders 的 o_totalprice 和数组索引 o_idx。因此,您可以访问 c_orders 的索引 0。

CREATE MATERIALIZED VIEW super_mv distkey(c_custkey) sortkey(c_custkey) AS ( SELECT c_custkey, o.o_orderstatus, o.o_totalprice, o_idx FROM customer_orders_lineitem c, c.c_orders o AT o_idx );

具体化视图 upper_mv 的属性 o_orderstatus 和 o_totalprice 为 SUPER。

具体化视图 super_mv 将在基表 customer_orders_lineitem 的更改后进行增量刷新。

REFRESH MATERIALIZED VIEW super_mv; INFO: Materialized view super_mv was incrementally updated successfully.

要将第一个PartiQL查询重写为常规 SQL 查询,请将 customer_orders_lineitem 与 super_mv 联接,如下所示。

SELECT c.c_name, v.o_orderstatus FROM customer_orders_lineitem c JOIN super_mv v ON c.c_custkey = v.c_custkey;

同样,您可以重写第二个PartiQL查询。以下示例使用 o_idx = 0 的筛选条件。

SELECT c.c_name, v.o_totalprice FROM customer_orders_lineitem c JOIN super_mv v ON c.c_custkey = v.c_custkey WHERE v.o_idx = 0;

在 CREATE MATERIALIZED VIEW 命令中,将 c_custkey 指定为 super_mv 的分配键和排序键。 Amazon Redshift 执行高效的合并联接,假定 c_custkey 也是 customer_orders_lineitem 的分配键和排序键。如果不是这种情况,您可以指定 c_custkey 作为 customer_orders_lineitem 的排序键和分配键,如下所示。

ALTER TABLE customer_orders_lineitem ALTER DISTKEY c_custkey, ALTER SORTKEY (c_custkey);

使用 EXPLAIN 语句验证 是否对重写的查询Amazon Redshift执行合并联接。

EXPLAIN SELECT c.c_name, v.o_orderstatus FROM customer_orders_lineitem c JOIN super_mv v ON c.c_custkey = v.c_custkey; QUERY PLAN ------------------------------------------------------------------------------------------------------ XN Hash Join DS_DIST_NONE (cost=0.06..2.40 rows=72 width=30) Hash Cond: (""outer"".c_custkey = ""inner"".c_custkey) -> XN Seq Scan on mv_tbl__super_mv__0 derived_table2 (cost=0.00..0.72 rows=72 width=16) -> XN Hash (cost=0.05..0.05 rows=5 width=30) -> XN Seq Scan on customer_orders_lineitem c (cost=0.00..0.05 rows=5 width=30)