使用實例化視圖切碎成 SUPER 列 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用實例化視圖切碎成 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_order狀態。您可以省略屬性 c_name,因為它不涉及嵌套導航或取消嵌套。還必須在實例化視圖中包括客户 _orders_line 的屬性 c_custkey,以便能夠將基表與實例化視圖連接起來。

要回答第二個查詢,您還必須實現屬性 o_total價格和c_訂單的數組索引o_idx。因此,您可以訪問 c_Order 的索引 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 );

實例化視圖超級 mv 的「訂單狀態」和「總價格」屬性為「超級」。

實例化視圖 super_mv 將在對基表客户訂單 _ 線項進行更改後以遞增方式刷新。

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

要將第一個 PartiQL 查詢重寫為常規 SQL 查詢,請將客户訂單 _ 行項與超級 _ 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;

在「創建實體化視圖」命令中,指定 c_custkey 作為 Super_mv 的分配鍵和排序鍵。Amazon Redshift 會執行高效的合併連接,假設 c_custkey 也是客户訂單 _ 線項的分配鍵和排序鍵。如果不是這種情況,您可以指定 c_custkey 作為客户 _ 訂單 _ 線項的排序鍵和分配鍵,如下所示。

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)