使用具体化视图分解成 SUPER 列 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用具体化视图分解成 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,以便能够将基表与具体化视图联接起来。

要应答第二个查询,您还必须具体化属性 o_totalprice 和数组 index o_idx of c_orders。因此,您可以访问 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 );

具体化视图 super_mv are SUPER 的属性 o_orderstatus 和 o_totalprice。

对基表 customer_orders_lineitem 进行更改时,将以增量方式刷新具体化视图 super_mv。

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

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

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 Merge Join DS_DIST_NONE (cost=0.00..34701.82 rows=1470776 width=27) Merge Cond: ("outer".c_custkey = "inner".c_custkey) -> XN Seq Scan on mv_tbl__super_mv__0 derived_table2 (cost=0.00..14999.86 rows=1499986 width=13) -> XN Seq Scan on customer_orders_lineitem c (cost=0.00..999.96 rows=99996 width=30) (4 rows)