

 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_SUPER_MV"></a>

透過 Amazon Redshift，您可以使用具體化視觀表來增強針對 SUPER 資料類型執行之查詢的效能和彈性。SUPER 資料類型可讓您將基礎資料表中欄的超集儲存在具體化視觀表中，如此就能直接查詢具體化視觀表，而不需要聯結基礎資料表。下列各節說明如何在 Amazon Redshift 中建立和使用 SUPER 資料類型的具體化視觀表。

Amazon Redshift 支援內有 SUPER 資料類型欄和 PartiQL 查詢的具體化視觀表。具體化視觀表可以進行累加式重新整理，而 Amazon Redshift 只會更新基礎資料表中自上次重新整理操作後有所變更的資料。這種選擇性更新方法讓重新整理程序比完整重新計算更有效率。如需具體化視觀表的相關資訊，請參閱 [Amazon Redshift 中的具體化視觀表](materialized-view-overview.md)。

## 加速 PartiQL 查詢
<a name="r_accelerate_mv"></a>

您可以使用具體化視觀表來加速導覽和/或解除巢狀化 SUPER 欄中階層式資料的 PartiQL 查詢。藉由建立一或多個具體化視觀表將 SUPER 值分解成多個欄，並利用 Amazon Redshift 分析查詢的單欄式組織，您基本上就可以擷取和標準化巢狀資料。標準化程度取決於您將 SUPER 資料轉換為傳統單欄式資料所付出的努力。

下列主題示範將複雜資料細分或分解成較小的欄，以及從分解後的資料建立純量欄以改善效能的範例。

**Topics**
+ [加速 PartiQL 查詢](#r_accelerate_mv)
+ [透過具體化視觀表將半結構化資料分解成 SUPER 欄](r_shred_super.md)
+ [從分解的資料建立 Amazon Redshift 純量欄](r_create_scalar.md)

# 透過具體化視觀表將半結構化資料分解成 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)
```

# 從分解的資料建立 Amazon Redshift 純量欄
<a name="r_create_scalar"></a>

儲存在 SUPER 中的無結構描述資料可能會影響 Amazon Redshift 的效能。例如，篩選述詞或聯結條件做為範圍限制掃描可能無法有效地使用區域地圖。使用者和 BI 工具可以使用具體化視觀表做為資料的常規表示形式，並提高分析查詢的效能。

下列查詢會掃瞄具體化視觀表 `super_mv` 和篩選 `o_orderstatus`。

```
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_orderstatus = 'F';
```

檢查 `stl_scan` 以確認 Amazon Redshift 無法在 `o_orderstatus` 範圍限制掃描上有效地使用區域地圖。

```
SELECT slice, is_rrscan FROM stl_scan
WHERE query = pg_last_query_id() AND perm_table_name LIKE '%super_mv%';

 slice | is_rrscan 
-------+-----------
     0 | f
     1 | f
     5 | f
     4 | f
     2 | f
     3 | f
(6 rows)
```

下列範例會調整具體化視觀表 `super_mv`，從分解的資料建立純量欄。在這種情況下，Amazon Redshift 會將 `o_orderstatus` 從 SUPER 轉換為 VARCHAR。此外，請指定 `o_orderstatus` 做為 `super_mv` 的排序索引鍵。

```
CREATE MATERIALIZED VIEW super_mv distkey(c_custkey) sortkey(c_custkey, o_orderstatus) AS (
  SELECT c_custkey, o.o_orderstatus::VARCHAR AS o_orderstatus, o.o_totalprice, o_idx
  FROM customer_orders_lineitem c, c.c_orders o AT o_idx
);
```

重新執行查詢之後，請確認 Amazon Redshift 現在可以使用區域地圖。

```
SELECT v.o_totalprice
FROM super_mv v
WHERE v.o_orderstatus = 'F';
```

您可以驗證範圍限制掃描現在使用區域地圖，如下所示。

```
SELECT slice, is_rrscan FROM stl_scan
WHERE query = pg_last_query_id() AND perm_table_name LIKE '%super_mv%';

 slice | is_rrscan 
-------+-----------
     0 | t
     1 | t
     2 | t
     3 | t
     4 | t
     5 | t
(6 rows)
```