

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# 透過具體化視觀表將半結構化資料分解成 SUPER 欄
<a name="r_shred_super"></a>

使用 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\$1mv 來加速這兩項查詢。

要回答第一個查詢，您必須具體化屬性 o\$1orderstatus。您可以省略 c\$1name 屬性，因為它不涉及巢狀導覽或解除巢狀化。您也必須在具體化視觀表中包含 customer\$1orders\$1lineitem 的屬性 c\$1custkey，以便能夠將基底資料表聯結至具體化視觀表。

要回答第二個查詢，您還必須具體化屬性 o\$1totalprice 和 c\$1orders 的陣列索引 o\$1idx。因此，您可以存取 c\$1orders 的索引 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\$1mv 的屬性 o\$1orderstatus 和 o\$1totalprice 都是 SUPER。

具體化視觀表 super\$1mv 會在基底資料表 customer\$1orders\$1lineitem 發生變更時，累加式重新整理。

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

若要將第一個 PartiQL 查詢重寫為常規 SQL 查詢，請將 customer\$1orders\$1lineitem 與 super\$1mv 聯結起來，如下所示。

```
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\$1idx = 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\$1custkey 做為 super\$1mv 的分散索引鍵和排序索引鍵。Amazon Redshift 執行高效率的合併聯結，假設 c\$1custkey 也是 customer\$1orders\$1lineitem 的分散索引鍵和排序索引鍵。如果不是這種情況，您可以指定 c\$1custkey 做為 customer\$1orders\$1lineitem 的排序索引鍵和分散索引鍵，如下所示。

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