使用具體化視觀表將半結構化資料縮減至 SUPER 資料欄 - Amazon Redshift

自 2025 年 11 月 1 日起,Amazon Redshift 將不再支援建立新的 Python UDFs。如果您想要使用 Python UDFs,請在該日期之前建立 UDFs。現有的 Python UDFs將繼續如常運作。如需詳細資訊,請參閱部落格文章

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

使用具體化視觀表將半結構化資料縮減至 SUPER 資料欄

使用 Amazon Redshift,您可以使用具體化視觀表將資料分割為 SUPER 資料欄,以改善查詢效能。碎片是指將半結構化 JSON 或 XML 等複雜資料類型分解為較小、更扁平資料欄的程序。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_orderstatus。您可以省略 c_name 屬性,因為它不涉及巢狀導覽或解除巢狀化。您也必須在具體化視觀表中包含 customer_orders_lineitem 的屬性 c_custkey,以便能夠將基底資料表聯結至具體化視觀表。

要回答第二個查詢,您還必須具體化屬性 o_totalprice 和 c_orders 的陣列索引 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 );

具體化視觀表 super_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 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)