自 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)