

 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/)。

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

# Amazon Redshift 中的具體化視觀表
<a name="materialized-view-overview"></a>

本節說明如何在 Amazon Redshift 中建立和使用具體化視觀表。具體化視觀表是儲存查詢結果的資料庫物件，可用於改善效能和效率。

在資料倉儲環境中，應用程式通常必須在大型資料表上執行複雜的查詢。例如，SELECT 陳述式會在包含數十億個資料列的資料表上執行多資料表的聯結和彙總。處理這些查詢相當耗費系統資源，且運算結果也會耗費時間。

Amazon Redshift 中的具體化視觀表提供處理這些問題的方式。*具體化視觀表*包含預先運算的結果集，該結果集是以對一或多個基底資料表進行的 SQL 查詢為基礎。您可以使用與查詢資料庫中其他資料表或檢視相同的方式，發出 SELECT 陳述式來查詢具體化視觀表。Amazon Redshift 會從具體化視觀表傳回預先計算的結果，完全不需要存取基底資料表。從使用者的觀點而言，傳回查詢結果的速度會比從基底資料表擷取相同的資料時要快上許多。

具體化視觀表在加速可預測和重複的查詢時特別有用。相較於對大型資料表 (例如彙整或多個聯結) 執行耗費資源的查詢，應用程式可以改為查詢具體化視觀表，並擷取預先運算的結果集。例如，請考慮使用一組查詢來填入儀表板的案例，例如 Amazon Quick。這種使用案例便相當適合使用具體化視觀表，因為查詢是可預期的，且會一再地重複進行。

您可以根據其他具體化視觀表來定義具體化視觀表。使用*具體化視觀表上的具體化視觀表*來擴充具體化視觀表的功能。在這種方法中，現有具體化視觀表的角色會與查詢用來擷取資料的基底資料表相同。

針對不同彙總或 GROUP BY 選項重複使用預先計算的聯結時，此方法特別有用。例如，結合客戶資訊 (包含數百萬個資料列) 與項目訂單詳細資訊 (包含數十億個資料列) 的具體化視觀表。這是重複按需計算的高成本查詢。您可以針對在此具體化視觀表之上建立的具體化視觀表使用不同的 GROUP BY 選項，並與其他資料表結合。這樣做可以節省計算時間，否則每次都要執行高成本的基礎聯結。[STV\$1MV\$1DEPS](r_STV_MV_DEPS.md) 資料表會顯示具體化視觀表在其他具體化視觀表上的相依性。

當您建立具體化視觀表時，Amazon Redshift 會執行使用者指定的 SQL 陳述式，從基底資料表或資料表收集資料，並儲存結果集。下圖為 SQL 查詢使用兩個基礎資料表 `events` 和 `sales` 定義的具體化視觀表 `tickets_mv` 的簡介。

![\[使用來自兩個基礎資料表的資料定義的具體化視觀表。\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/images/materialized-view.png)


然後，您可以在查詢中使用這些具體化視觀表來加速查詢。此外，即使查詢未明確參照具體化視觀表，Amazon Redshift 也可以自動重寫這些查詢以使用具體化視觀表。當您無法將查詢變更為使用具體化視觀表時，自動重寫查詢在提升效能方面尤其強大。

若要更新具體化視觀表中的資料，您可以隨時使用 REFRESH MATERIALIZED VIEW 陳述式來手動重新整理具體化視觀表。Amazon Redshift 會識別在基底資料表或資料表中發生的變更，然後將這些變更套用到具體化視觀表。由於自動重寫查詢需要具體化視觀表維持在最新狀態，所以身為具體化視觀表擁有者，請務必在基礎資料表變更時重新整理具體化視觀表。

Amazon Redshift 提供了幾種讓具體化視觀圖保持在最新狀態的方法，以便自動重寫。您可以使用自動重新整理選項設定具體化視觀表，以在更新具體化視觀表的基礎資料表時重新整理具體化視觀表。此自動重新整理操作會在叢集資源可用時執行，以盡量減少對其他工作負載的干擾。由於自動重新整理排程取決於工作負載，因此您可以更好地控制 Amazon Redshift 重新整理具體化視觀表的時機。您可以使用 Amazon Redshift 排程器 API 和主控台整合來排程具體化視觀表的重新整理工作。如需查詢排程的相關資訊，請參閱[在 Amazon Redshift 主控台上排程查詢](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-schedule-query.html)。

當具體化視觀表中的最新資料需要服務水準協議 (SLA) 時，這樣做特別有用。您也可以手動重新整理任何可以自動重新整理的具體化視觀表。如需如何建立具體化視觀表的相關資訊，請參閱[CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

您可以發出 SELECT 陳述式來查詢具體化視觀表。如需如何查詢具體化視觀表的相關資訊，請參閱[具體化視觀表查詢](materialized-view-query.md)。結果集最終會隨著在基礎資料表中插入、更新和刪除資料而過時。您可以隨時重新整理具體化視觀表，以使用基礎資料表中的最新變更來更新它。如需如何重新整理具體化視觀表的相關資訊，請參閱[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)。

如需用於建立和管理具體化視觀表的 SQL 命令詳細資訊，請參閱下列命令主題：
+ [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)
+ [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)

如需用於監控具體化視觀表的系統資料表和檢視相關資訊，請參閱下列主題：
+ [STV\$1MV\$1INFO](r_STV_MV_INFO.md)
+ [STL\$1MV\$1STATE](r_STL_MV_STATE.md)
+ [SVL\$1MV\$1REFRESH\$1STATUS](r_SVL_MV_REFRESH_STATUS.md)
+ [STV\$1MV\$1DEPS](r_STV_MV_DEPS.md)

**Topics**
+ [

# 具體化視觀表查詢
](materialized-view-query.md)
+ [

# 自動查詢重寫以使用具體化視檢視
](materialized-view-auto-rewrite.md)
+ [

# Amazon Redshift Spectrum 中外部資料湖資料表的具體化視觀表
](materialized-view-external-table.md)
+ [

# 重新整理具體化視觀表
](materialized-view-refresh.md)
+ [

# 自動具體化視觀表
](materialized-view-auto-mv.md)
+ [

# 在具體化視觀表中使用使用者定義函數 (UDF)
](materialized-view-UDFs.md)
+ [

# 將擷取串流至具體化視觀表
](materialized-view-streaming-ingestion.md)

# 具體化視觀表查詢
<a name="materialized-view-query"></a>

您可以透過參考作為資料來源的具體化視觀表名稱在任何 SQL 查詢中使用具體化視觀表，就如同資料表或標準檢視。

當查詢存取具體化視觀表時，其只會看見最近一次重新整理後儲存在具體化視觀表中的資料。因此，查詢可能無法看見具體化視觀表所對應基底資料表中所有最新的變更。

如果其他使用者希望查詢具體化視觀表，具體化視觀表的擁有者會將 SELECT 許可授予那些使用者。其他使用者不需要對基礎的基底資料表具備 SELECT 許可。具體化視觀表的擁有者也可以撤銷其他使用者的 SELECT 許可，防止他們查詢具體化視觀表。請注意，其他使用者仍須具有包含具體化視觀表基礎資料表的結構描述上的 USAGE 許可。

如果具體化視觀表的擁有者不再擁有對基礎資料表的本機 SELECT 許可：
+ 擁有者無法再查詢具體化視觀表。
+ 其他對具體化視觀表擁有 SELECT 許可的使用者無法再查詢具體化視觀表。

這僅限於本機許可。查詢具體化視觀表時，不會驗證 Lake Formation 所管理許可的變更。這表示，如果基礎資料表是由 Lake Formation 管理，而在 Lake Formation 中資料表的選取許可遭到撤銷，您仍然可以查詢具體化視觀表。

以下範例會查詢 `tickets_mv` 具體化視觀表。如需用來建立具體化視觀表的 SQL 命令相關資訊，請參閱 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

```
SELECT sold
FROM tickets_mv
WHERE catgroup = 'Concerts';
```

因為查詢結果是預先運算的，因此無須存取基礎資料表 (`category`、`event` 和 `sales`)。Amazon Redshift 可以直接從 `tickets_mv` 傳回結果。

# 自動查詢重寫以使用具體化視檢視
<a name="materialized-view-auto-rewrite"></a>

您可以使用 Amazon Redshift 中具體化視觀表的自動查詢重寫功能，讓 Amazon Redshift 重寫查詢以使用具體化視觀表。這樣做可以加速查詢工作負載，即使是未明確參考具體化視觀表的查詢也一樣。當 Amazon Redshift 重寫查詢時，其只會使用最新的具體化視觀表。

## 使用須知
<a name="mv_auto-rewrite_usage"></a>

若要檢查查詢的自動重寫功能是否用於查詢，您可以檢查查詢計劃或 STL\$1EXPLAIN。下面顯示了 SELECT 陳述式和原始查詢計劃的 EXPLAIN 輸出。

```
SELECT catgroup, SUM(qtysold) AS sold
FROM category c, event e, sales s
WHERE c.catid = e.catid AND e.eventid = s.eventid
GROUP BY 1;

EXPLAIN 
 XN HashAggregate  (cost=920021.24..920021.24 rows=1 width=35)
   ->  XN Hash Join DS_BCAST_INNER  (cost=440004.53..920021.22 rows=4 width=35)
         Hash Cond: ("outer".eventid = "inner".eventid)
         ->  XN Seq Scan on sales s  (cost=0.00..7.40 rows=740 width=6)
         ->  XN Hash  (cost=440004.52..440004.52 rows=1 width=37)
               ->  XN Hash Join DS_BCAST_INNER  (cost=0.01..440004.52 rows=1 width=37)
                     Hash Cond: ("outer".catid = "inner".catid)
                     ->  XN Seq Scan on event e  (cost=0.00..2.00 rows=200 width=6)
                     ->  XN Hash  (cost=0.01..0.01 rows=1 width=35)
                           ->  XN Seq Scan on category c  (cost=0.00..0.01 rows=1 width=35)
```

下面顯示成功自動重寫後的 EXPLAIN 輸出。此輸出包括查詢計劃中具體化視觀表的掃描，其取代了原始查詢計劃的一部分。

```
* EXPLAIN 
     XN HashAggregate  (cost=11.85..12.35 rows=200 width=41)
       ->  XN Seq Scan on mv_tbl__tickets_mv__0 derived_table1  (cost=0.00..7.90 rows=790 width=41)
```

只有最新的 (全新) 具體化視觀表才會被視為適用自動重新寫入查詢，且不論重新整理策略為何，例如自動、排程或手動。因此，原始查詢會傳回最新結果。在查詢中明確參照具體化視觀表時，Amazon Redshift 會存取具體化視觀表中目前儲存的資料。此資料可能不會反映具體化視觀表之基礎資料表的最新變更。

您可以使用在叢集 1.0.20949 版或更新版本上建立的具體化視觀表自動查詢重寫功能。

您可以藉由使用 SET mv\$1enable\$1aqmv\$1for\$1session to FALSE，停止工作階段層級上的自動查詢重寫功能。

## 自動查詢如何重寫具體化視觀表
<a name="mv_auto-rewrite_behavior"></a>

根據內部最佳化，Amazon Redshift 可能會決定公開透明地調用具體化視觀表的自動查詢重寫，以提供查詢時間最短的最佳查詢執行。

例如，假設使用者 A 使用查詢 `SELECT * FROM T1` 在資料表 T1 上建立具體化視觀表 M1。使用者 A 在 T1 上具有完整的 SELECT 權限。使用者 A 將 M1 的存取權授予所有使用者，包括使用者 B。不過，當使用者 B 嘗試直接查詢 T1 時，其存取會遭拒。這是因為使用者 B 未具備 T1 上的 SELECT 權限。

一段時間後，使用者 B 再次嘗試查詢 T1，但這次就會從 T1 取得結果。這是因為使用具體化視觀表的自動查詢重寫將資料表 T1 (`SELECT <cols> FROM T1`) 上使用者 B 的查詢重寫為具體化視觀表 M1 (`SELECT <cols> FROM M1`) 上的查詢。

## 限制
<a name="mv_auto-rewrite_limitations"></a>

以下是針對具體化視觀表使用自動查詢重寫的限制。
+ 自動查詢重寫適用於不參照或包含下列任何項目的具體化視觀表：
  + 子查詢
  + 左側、右側或完整外部聯結
  + 設定操作 
  + 任何彙總函數，但 SUM、COUNT、MIN、MAX 與 AVG 除外。(這些是唯一可與自動查詢重寫搭配使用的彙總函數。)
  + 任何搭配 DISTINCT 的彙總函數
  + 任何範圍函數
  + SELECT DISTINCT 或 HAVING 子句
  + 外部或共用資料表
  + 其他具體化視觀表
+ 自動查詢重寫功能會重寫參照使用者定義 Amazon Redshift 資料表的 SELECT 查詢。Amazon Redshift 不會重寫以下查詢：
  + CREATE TABLE AS 陳述式
  + SELECT INTO 陳述式
  + 目錄或系統資料表的查詢
  + 具有外部聯結或 SELECT DISTINCT 的查詢
+ 如果查詢未自動重寫，請檢查您是否擁有指定具體化視觀表的 SELECT 許可，且 [mv\$1enable\$1aqmv\$1for\$1session](r_mv_enable_aqmv_for_session.md) 選項設定為 TRUE。

  您也可以藉由檢查 STV\$1MV\$1INFO，來檢查具體化視觀表是否符合自動重寫查詢的資格。如需詳細資訊，請參閱[STV\$1MV\$1INFO](r_STV_MV_INFO.md)。

# Amazon Redshift Spectrum 中外部資料湖資料表的具體化視觀表
<a name="materialized-view-external-table"></a>

具體化視觀表可以提供對外部資料湖資料表進行累加式維護。採取累加式維護時，Amazon Redshift 只會以基礎資料表中自上次重新整理後的資料變更，來更新具體化視觀表中的資料。每次基礎資料表上有資料變更時，採取累加式維護會比完整重新計算具體化視觀表更具成本效益。

當您至少在一個外部資料表上使用具體化視觀表時，具體化視觀表的建立會在下列項目上累加：
+ 標準資料湖資料表 (包括已分割和未分割)，包含任何支援格式的資料檔案 (Parquet、Avro、CSV 等)。
+ Apache Iceberg 資料表 (包括已分割和未分割)，包含寫入時複製和讀取時合併。
+ 與相同資料庫中任何 Amazon Redshift 資料表聯結的 Amazon Redshift Spectrum 資料表。

具體化視觀表重新整理會在下列項目上累加：
+ S3 DELETE 或 PUT 覆寫 (刪除資料檔案) 之後的標準資料湖資料表 (如果具體化視觀表未執行彙總)。
+ INSERT、DELETE、UPDATE 或資料表壓縮後的 Apache Iceberg 資料表。

如需 Amazon Redshift Spectrum 的詳細資訊，請參閱 [Amazon Redshift Spectrum](c-using-spectrum.md)。

## 限制
<a name="materialized-view-external-table-limitations"></a>

具體化視觀表的一般限制仍然適用於資料湖資料表上的具體化視觀表。如需詳細資訊，請參閱[重新整理具體化視觀表](materialized-view-refresh.md)。此外，當您使用外部資料湖資料表的具體化視觀表時，請考慮下列限制。
+ 具體化視觀表的建立在下列項目上為非累加：
  + Hudi 或 Delta Lake 資料表。
  + Spectrum 巢狀資料存取。
  + VARBYTE 欄的參考。
+ 具體化視觀表重新整理在下列項目上會恢復為完整重新計算：
  + Apache Iceberg 資料表，在所需的快照過期時 (如果具體化視觀表執行彙總)。
  + 標準資料湖資料表，在刪除或更新 Amazon S3 上的資料檔案之後 (如果具體化視觀表執行彙總)。
  + 標準資料湖資料表，在交易區塊內重新整理多次時。
  + 由資訊清單控管的標準資料湖資料表。如需資訊清單的詳細資訊，請參閱[使用資訊清單來指定資料檔案](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#copy-command-examples-manifest)。
  + 如果預期效能更高，Amazon Redshift 會恢復完整重新計算，特別是包含聯結且自上次重新整理以來已更新多個基礎資料表的具體化視觀表。
+ 在 Apache Iceberg 資料表上，具體化視觀表重新整理最多只能處理單一資料檔案中刪除的 400 萬個位置。一旦達到此限制，Apache Iceberg 基礎資料表必須壓縮，才能繼續重新整理具體化視觀表。
+ Apache Iceberg 資料表上不支援具體化視觀表建立和重新整理的並行擴展。
+ 不支援自主功能。其中包括[自動化具體化視觀表](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-auto-mv.html)和[自動查詢重寫](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-auto-rewrite.html)。
+ 重新整理累加式具體化視觀表時，IAM 許可僅適用於 Amazon Redshift 基礎資料表已存取的部分。
+ 查詢具體化視觀表時，不會驗證 Lake Formation 所管理許可的變更。這表示，如果具體化視觀表是在資料湖資料表上定義，而選取權限已從 Lake Formation 中的資料表移除，您仍然可以查詢具體化視觀表。

# 重新整理具體化視觀表
<a name="materialized-view-refresh"></a>

本主題說明如何重新整理基礎資料表的具體化視觀表中的資料。

當您建立具體化視觀表時，其內容會反映當時基礎資料庫關係 (資料表或其他具體化視觀表) 的狀態。即使應用程式變更基底資料表中的資料，具體化視觀表中的資料仍會維持不變。若更新具體化視觀表中的資料，您可以隨時使用 `REFRESH MATERIALIZED VIEW` 陳述式來手動重新整理具體化視觀表。當您執行此陳述式時，Amazon Redshift 會識別在基礎關係中發生的變更，並將這些變更套用到具體化視觀表。

Amazon Redshift 有兩種策略可重新整理具體化視觀表：
+ 在許多案例中，Amazon Redshift 可以執行累加式重新整理。在*累加式重新整理*中，Amazon Redshift 會快速識別自上次重新整理之後，基礎關係中資料的變更，並更新具體化視觀表中的資料。定義具體化視觀表時，在查詢中使用的下列 SQL 建構模組上，可支援累加式重新整理。
  + 包含 SELECT、FROM、[INNER] JOIN、WHERE、GROUP BY、HAVING 子句的建構模組。
  + 包含彙總的建構模組，如 SUM、MIN、MAX、AVG 和 COUNT。
  + 大部分的內建 SQL 函數 (特別是不可變的 SQL 函數) 有鑑於此，都會給與相同的輸入引數並始終產生相同的輸出。

  以資料共用資料表或具體化視觀表為基礎的具體化視觀表也支援增量重新整理。
+ 如果無法進行累加式更新，則 Amazon Redshift 會執行完全的重新整理。「完全重新整理」**會重新執行基礎 SQL 陳述式，替換具體化視觀表中的所有資料。
+ Amazon Redshift 會根據用來定義具體化視觀表的 SELECT 查詢，自動選擇具體化視觀表的重新整理方法。

## 巢狀具體化視觀表
<a name="materialized-view-refresh-nested"></a>

具體化視觀表可在其他具體化視觀表上定義。若要重新整理此類具體化視觀表，您必須明確使用最上層具體化視觀表重新整理的 `CASCADE` 關鍵字。例如，假設下列巢狀具體化視觀表結構：

```
CREATE TABLE t(a INT);
CREATE MATERIALIZED VIEW u AS SELECT * FROM t;
CREATE MATERIALIZED VIEW v AS SELECT * FROM u;
CREATE MATERIALIZED VIEW w AS SELECT * FROM v;

-- w -> v -> u -> t

INSERT INTO t VALUES (1);
```

若要讓 w 完整更新，您有兩個選擇：
+ (建議) 使用 `REFRESH MATERIALIZED VIEW w CASCADE` 命令重新整理 w。此命令會在單一交易中重新整理所有具體化視觀表。
+ 依相依性順序 (依序為 u、v、w) 將 u、v 和 w 作為不同的命令重新整理。

如果未明確使用 `CASCADE` 關鍵字，具體化視觀表將在 `RESTRICT` 模式下重新整理，且僅重新整理目前具體化視觀表。下列範例顯示當您在相依於過期具體化視觀表的具體化視觀表上執行 `REFRESH MATERIALIZED VIEW` 時的資訊訊息。

```
REFRESH MATERIALIZED VIEW w;
INFO:  Materialized view w is already up to date.  However, it depends on another materialized view that is not up to date.

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

```
REFRESH MATERIALIZED VIEW v;
INFO: Materialized view v is already up to date. However, it depends on another materialized view that is not up to date.

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

在上述使用層疊重新整理選項的範例中，會先重新整理具體化視觀表 u，接著重新整理具體化視觀表 v，而且不會重新整理具體化視觀表 w。

以下範例顯示如何以程式設計方式，為具體化視觀表建立完整重新整理計劃。若要重新整理具體化視觀表 v，請先重新整理具體化視觀表 u 若要重新整理具體化視觀表 v，請先重新整理具體化視觀表 u，然後再重新整理具體化視觀表 v。

```
WITH RECURSIVE recursive_deps (mv_tgt, lvl, mv_dep) AS
( SELECT trim(name) as mv_tgt, 0 as lvl, trim(ref_name) as mv_dep
  FROM stv_mv_deps
  UNION ALL
  SELECT R.mv_tgt, R.lvl+1 as lvl, trim(S.ref_name) as mv_dep
  FROM stv_mv_deps S, recursive_deps R
  WHERE R.mv_dep = S.name
)

SELECT mv_tgt, mv_dep from recursive_deps
ORDER BY mv_tgt, lvl DESC;

 mv_tgt | mv_dep
--------+--------
 v      | u
 w      | u
 w      | v
(3 rows)
```

## 限制
<a name="materialized-view-refresh-limitations"></a>

Amazon Redshift 不支援非以下列來源為基礎的具體化視觀表的階層式重新整理：
+ 本機資料表
+ 本機 MV
+ 串流 MV

對於使用下列 SQL 元素搭配查詢定義的具體化視觀表，Amazon Redshift 不支援累加式重新整理：
+ OUTER JOIN (RIGHT、LEFT 或 FULL)。
+ 集合操作 UNION、INTERSECT、EXCEPT 和 MINUS。
+ 彙整函數 MEDIAN、PERCENTILE\$1CONT、LISTAGG、STDDEV\$1SAMP、STDDEV\$1POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 及位元彙整函數。
**注意**  
支援 COUNT、SUM 和 AVG 彙總函數。
+ DISTINCT 彙整函數，例如 DISTINCT COUNT、DISTINCT SUM 等。
+ 視窗函數。
+ 使用暫存資料表進行查詢最佳化的查詢，例如最佳化通用子運算式。
+ 子查詢。
+ 在定義具體化視觀表的查詢中，參照下列查詢中的格式的外部資料表。
  +  Delta Lake 
  +  Hudi 

  對於使用上述以外格式定義的具體化視觀表，支援累加式重新整理。如需詳細資訊，請參閱[Amazon Redshift Spectrum 中外部資料湖資料表的具體化視觀表外部資料湖資料表的具體化視觀表](materialized-view-external-table.md)。

## 自動重新整理具體化視觀表
<a name="materialized-view-auto-refresh"></a>

建立或修改具體化視觀表以具有自動重新整理選項時，Amazon Redshift 可以使用其基礎資料表中的最新資料自動重新整理具體化視觀表。Amazon Redshift 會在基本資料表變更後盡快自動重新整理具體化視觀表。

為了在盡量不影響叢集內作用中工作負載的情況下完成重新整理最重要的具體化視觀表，Amazon Redshift 會考慮多個因素。這些因素包括目前的系統負載、重新整理所需的資源、可用的叢集資源，以及使用具體化視觀表的頻率。

Amazon Redshift 會優先考慮您的工作負載而非自動重新整理，並且可以停止自動重新整理以保留使用者工作負載的效能。此方法可能會延遲重新整理部分具體化視觀表。在某些情況下，您的具體化視觀表可能需要更具決定性的重新整理行為。如果是這樣，請考慮使用手動重新整理，如 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md) 所述，或透過 Amazon Redshift 排程器 API 操作或主控台來使用排程重新整理。

您可以使用 CREATE MATERIALIZED VIEW 來設定具體化視觀表的自動重新整理。您也可以使用 AUTO REFRESH 子句自動重新整理具體化視觀表。如需建立具體化視觀表的相關資訊，請參閱 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。您可以使用 [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md) 來開啟目前具體化視觀表的自動重新整理。

重新整理具體化視觀表時應考慮以下項目：
+ 即使您尚未啟用具體化視觀表的自動重新整理，您仍然可以使用 REFRESH MATERIALIZED VIEW 命令明確地重新整理具體化視觀表。
+ 在資料共用資料表或 Iceberg 資料表上定義的具體化視觀表上支援自動重新整理，但不支援兩者的組合。
+ 對於重新整理狀態，您可以檢查 SVL\$1MV\$1REFRESH\$1STATUS，該狀態會記錄使用者啟動或自動重新整理的查詢。
+ 若要在僅限重新計算的具體化視觀表上執行 REFRESH，請確定您擁有結構描述的 CREATE 許可。如需詳細資訊，請參閱[GRANT](r_GRANT.md)。

 從 2026 年 2 月 27 日開始，Amazon Redshift 具體化視觀表的 Auto REFRESH 查詢會以使用者查詢的形式執行，而非背景自律程序。因此，Auto REFRESH 查詢現在會以與其他使用者查詢相同的優先順序執行。

 此變更可改善已啟用 Auto REFRESH 的具體化視觀表的新鮮度，協助他們掌握基礎資料表相較於先前行為的最新變更。

 注意：MV Auto REFRESH 行為變更功能僅適用於修補程式版本 P198 及更新版本的 CURRENT 軌道上的 Amazon Redshift 佈建叢集。它目前在 Serverless 上已停用。

# 自動具體化視觀表
<a name="materialized-view-auto-mv"></a>

本主題說明 Amazon Redshift 如何使用自動具體化視觀表來改善效能。Amazon Redshift 會根據資料庫活動和效能自動建立具體化視觀表。根據預設，Amazon Redshift 會使用自動具體化視觀表。

具體化視觀表是改善 Amazon Redshift 中查詢效能的強大工具。其透過儲存預先計算的結果集來做到這一點。類似的查詢不必每次都重新執行相同的邏輯，因為它們可以從現有的結果集擷取記錄。開發人員和分析師會在分析工作負載之後建立具體化視觀表，以判斷哪些查詢可以受益，以及每個具體化視觀表的維護成本是否值得。隨著工作負載的增長或變化，這些具體化視觀表必須經過審查，以確保它們繼續提供實際的效能優勢。

Redshift 中的自動具體化視觀表 (AutoMV) 功能會根據工作負載監控和機器學習演算法自動建立和管理具體化視觀表，以增強查詢效能。以下包括 AutoMV 的重要功能：
+ *持續監控* - Redshift 使用機器學習技術持續監控工作負載，以透過建立具體化視觀表來找出改善效能的機會。
+ *自動建立和刪除* - 當系統偵測到具體化視觀表會有幫助時，便會自動建立和維護它。相反地，如果先前建立的 AutoMV 不再提供效能優勢，系統便會自動將其捨棄。
+ *無使用者活動需求* - AutoMV 功能只會在叢集上處於低使用者活動或低工作負載的期間運作。這可確保 AutoMV 操作不會干擾或影響客戶工作負載。
+ *CPU 用量激增* - 在無工作負載活動的期間，若 AutoMV 建立或重新整理具體化視觀表，則可能會導致 CPU 用量激增。這是正常行為，因為系統會利用可用的資源來建立和重新整理具體化視觀表。
+ *使用者工作負載優先順序* - 如果您在 AutoMV 操作進行時啟動工作負載，AutoMV 任務會停止，以釋出資源供使用者工作負載使用。這可確保您的工作負載優先於 AutoMV 操作。

雖然 AutoMV 功能可能會在無使用者活動期間導致 CPU 用量激增，但其運作公開透明，且不會影響您的工作負載。系統會管理具體化視觀表以改善查詢效能，並同時排定優先處理使用者工作負載，而非 AutoMV 操作。

AutoMV 行為和功能與使用者建立的具體化視觀表相同。其使用相同的準則和限制以自動且累加的方式進行重新整理。就像使用者建立的具體化視觀表一樣，[自動查詢重寫以使用具體化視檢視](materialized-view-auto-rewrite.md) 會識別可受益於系統建立之 AutoMV 的查詢。它會自動重寫這些查詢以使用 AutoMV，從而改善查詢效能。開發人員不需要修改查詢即可利用 AutoMV。

**注意**  
自動具體化視觀表會間歇性重新整理。重寫為使用 AutoMV 的查詢永遠會傳回最新的結果。當 Redshift 偵測到資料不是最新的時候，就不會將查詢重寫為從自動具體化視觀表讀取。相反地，查詢會從基底資料表中選取最新資料。

任何具有重複使用之查詢的工作負載都可以受益於 AutoMV。常用案例包括：
+ *儀表板* - 儀表板廣泛用於提供關鍵業務指標 (KPI)、事件、趨勢和其他指標的快速檢視。它們通常具有包含圖表和資料表的通用版面配置，但會顯示不同的檢視來用於篩選或維度選取操作 (例如向下鑽研)。儀表板通常有一組共同的查詢，以不同的參數重複使用。儀表板查詢可以從自動具體化視觀表中獲益匪淺。
+  *報告* - 報告查詢可以安排在不同的頻率下進行，根據業務需求和報告的類型。此外，它們可以是自動或隨需形式。報告查詢的一個共同特徵是可以長時間執行且屬於資源密集型。使用 AutoMV 時，這些查詢不需要在每次執行時重新計算，這會減少 Redshift 中每個查詢的執行期和資源使用率。

若要關閉自動具體化視觀表，請將 `auto_mv` 參數群組更新為 `false`。如需詳細資訊，請參閱《Amazon Redshift 叢集管理指南》中的 [Amazon Redshift 參數群組](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html)。

## 自動具體化視觀表的 SQL 範圍和考量
<a name="materialized-view-auto-mv-important"></a>
+ 自動具體化視觀表可以由查詢或子查詢啟動和建立，前提是它包含 `GROUP BY` 子句或下列其中一個彙總函數：SUM、COUNT、MIN、MAX 或 AVG。但不能包含以下任何項目：
  + 左側、右側或完整外部聯結
  + SUM、COUNT、MIN、MAX 與 AVG 以外的彙總函數。(這些特定函式可與自動查詢重寫搭配使用。)
  + 任何包含 DISTINCT 的彙總函數
  + 任何範圍函數
  + SELECT DISTINCT 或 HAVING 子句
  + 其他具體化視觀表

  不保證符合準則的查詢會啟動自動具體化視觀表的建立。系統會根據其對工作負載的預期效益和要維護的資源成本 (包括系統要重新整理的成本)，決定要從哪些候選項目建立檢視。每個產生的具體化視觀表都可透過自動查詢重寫來使用。
+ 即使 AutoMV 可能是由子查詢或集合運算子的個別支段啟動，產生的具體化視觀表也不會包含子查詢或集合運算子。
+ 若要判斷 AutoMV 是否用於查詢，請檢視 EXPLAIN 計劃並在輸出中尋找 `%_auto_mv_%`。如需詳細資訊，請參閱 [EXPLAIN](https://docs.aws.amazon.com/redshift/latest/dg/r_EXPLAIN.html)。
+ 外部資料表 (例如資料共用和聯合資料表) 不支援自動具體化視觀表。

## 自動具體化視觀表限制
<a name="materialized-view-auto-mv-limitations"></a>

下列是使用自動具體化視觀表的限制：
+ *AutoMV 的最大數目* - 叢集中每個資料庫的自動具體化視觀表限制為 200 個。
+ *儲存空間和容量* - AutoMV 的一個重要特點是，它是使用備用背景週期來執行，以協助實現使用者工作負載不受影響的目的。如果叢集忙碌或儲存空間不足，AutoMV 會停止其活動。具體而言，在叢集總容量的 80% 時，不會建立新的自動具體化視觀表。在總容量的 90% 時，它們可能會被捨棄，以在不降低校能的情況下繼續使用者工作負載。如需決定叢集容量的相關資訊，請參閱 [STV\$1NODE\$1STORAGE\$1CAPACITY](r_STV_NODE_STORAGE_CAPACITY.md)。

## 自動具體化視觀表的計費
<a name="materialized-view-auto-mv-billing"></a>

 Amazon Redshift 的自動最佳化功能可建立和重新整理自動具體化視觀表。此程序的運算資源無須付費。自動具體化視觀表的儲存費用是以一般儲存費率計費。如需詳細資訊，請參閱 [Amazon Redshift 定價](https://aws.amazon.com/redshift/pricing/)。

## 其他資源
<a name="materialized-view-auto-mv-resources"></a>

 下列部落格文章提供有關自動具體化視觀表的進一步說明 其中詳細介紹了其建立、維護和捨棄方式。還說明了推動這些決策的基礎演算法：[使用自動具體化視觀表最佳化 Amazon Redshift 查詢效能](https://aws.amazon.com/blogs//big-data/optimize-your-amazon-redshift-query-performance-with-automated-materialized-views/)。

 此影片從具體化視觀表的說明開始，並示範其如何改善效能及節省資源。然後，透過程序流程動畫和現場示範，提供自動具體化視觀表的深入說明。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/-85GSBQOBTA/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/-85GSBQOBTA)


# 在具體化視觀表中使用使用者定義函數 (UDF)
<a name="materialized-view-UDFs"></a>

您可以在 Amazon Redshift 具體化視觀表中使用純量 UDF。在 python 或 SQL 中定義這些內容，並在具體化視觀表定義中加以參照。

## 在具體化視觀表中參照 UDF
<a name="materialized-view-UDFs-examples"></a>

下列程序顯示如何在具體化視觀表定義中使用執行簡單算術比較的 UDF。

1. 建立要在具體化視觀表定義中使用的資料表。

   ```
   CREATE TABLE base_table (a int, b int);
   ```

1. 在 python 中建立一個純量使用者定義函數，該函數會傳回布林值，指出整數是否大於比較整數。

   ```
   CREATE OR REPLACE FUNCTION udf_python_bool(x1 int, x2 int) RETURNS bool IMMUTABLE
   AS $$
     return x1 > x2
   $$ LANGUAGE plpythonu;
   ```

   或者，使用 SQL 建立功能類似的 UDF，您可以使用此功能與第一個結果做比較。

   ```
   CREATE OR REPLACE FUNCTION udf_sql_bool(int, int) RETURNS bool IMMUTABLE
   AS $$
     select $1 > $2;
   $$ LANGUAGE SQL;
   ```

1. 建立可從所建立資料表中選取並參照 UDF 的具體化視觀表。

   ```
   CREATE MATERIALIZED VIEW mv_python_udf AS SELECT udf_python_bool(a, b) AS a FROM base_table;
   ```

   您也可以選擇性地建立參照 SQL UDF 的具體化視觀表。

   ```
   CREATE MATERIALIZED VIEW mv_sql_udf AS SELECT udf_sql_bool(a, b) AS a FROM base_table;
   ```

1. 新增資料至資料表，然後重新整理具體化視觀表。

   ```
   INSERT INTO base_table VALUES (1,2), (1,3), (4,2);
   ```

   ```
   REFRESH MATERIALIZED VIEW mv_python_udf;
   ```

   您也可以選擇性地重新整理參照 SQL UDF 的具體化視觀表。

   ```
   REFRESH MATERIALIZED VIEW mv_sql_udf;
   ```

1. 查詢具體化視觀表的資料。

   ```
   SELECT * FROM mv_python_udf ORDER BY a;
   ```

   查詢結果如下：

   ```
   a
   -----
   false
   false
   true
   ```

   這會針對最後一組值傳回 `true`，因為資料欄 `a` (4) 的值大於資料欄 `b` (2) 的值。

1. 您也可以選擇性地查詢參照 SQL UDF 的具體化視觀表。SQL 函數的結果會與 Python 版本的結果相符。

   ```
   SELECT * FROM mv_sql_udf ORDER BY a;
   ```

   查詢結果如下：

   ```
   a
   -----
   false
   false
   true
   ```

   這將針對最後一組值傳回 `true` 以進行比較。

1. 搭配 CASCADE 使用 DROP 陳述式，以捨棄使用者定義函數及參照該函數的具體化視觀表。

   ```
   DROP FUNCTION udf_python_bool(int, int) CASCADE;
   ```

   ```
   DROP FUNCTION udf_sql_bool(int, int) CASCADE;
   ```

# 將擷取串流至具體化視觀表
<a name="materialized-view-streaming-ingestion"></a>

本主題說明如何使用具體化視觀表快速存取串流資料。

 串流擷取可提供以低延遲、高速的方式，從 [Amazon Kinesis Data Streams](https://aws.amazon.com//kinesis/data-streams/) 和 [Amazon Managed Streaming for Apache Kafka](https://aws.amazon.com//msk/) 將資料擷取至 Amazon Redshift 佈建或 Amazon Redshift Serverless 資料庫。資料會放置在針對此目的設定的 Redshift 具體化視觀表中。如此即可快速存取外部資料。串流擷取可縮短資料存取時間並降低儲存成本。您可以使用一組少量 SQL 命令，為您的 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組進行設定。設定完成後，每個具體化視觀表重新整理每秒都可擷取數百 MB 的資料。

## 資料如何從串流服務傳輸到 Redshift
<a name="materialized-view-streaming-ingestion-data-flow"></a>

 這點有助於了解串流擷取的運作方式，以及程序中所使用的資料庫物件。資料直接從資料串流提供者傳輸至 Amazon Redshift 佈建叢集或 Amazon Redshift Serverless 工作群組。沒有臨時放置區域，例如 Amazon S3 儲存貯體。佈建叢集或工作群組是串流取用者。在 Redshift 資料庫中，從串流讀取的資料會放置在具體化視觀表中。資料一抵達就會加以處理。例如，您可以使用 SQL 取用 JSON 值，並對應至具體化視觀表的資料欄。具體化視觀表重新整理時，Redshift 會取用所配置 Kinesis 資料碎片或 Kafka 分割區中的資料，直到視觀表與串流處於最新狀態為止。

 Amazon Redshift 串流擷取的使用案例包含從其來源持續產生且必須在短時間 (或*延遲*) 內處理的資料。這通常稱為*近乎即時*分析。來源可能包括 IT 裝置、系統遙測裝置，或來自忙碌網站或應用程式的點擊流資料。

## 為改善效能的資料剖析最佳實務
<a name="materialized-view-streaming-recommendations"></a>

當您設定串流擷取時，有幾個選項可供您剖析傳入資料。實務包括在資料抵達時執行商業邏輯或格式化。我們建議採用下列最佳實務，以避免錯誤或資料遺失。這些衍生自內部測試，可協助客戶進行組態故障診斷和剖析問題。
+ **從串流資料擷取值** - 如果您在具體化視觀表定義中使用 [JSON\$1EXTRACT\$1PATH\$1TEXT](https://docs.aws.amazon.com/redshift/latest/dg/JSON_EXTRACT_PATH_TEXT.html) 函式來剖析或*銷毀*串流的 JSON，則可能會大幅影響效能和延遲。為了解釋，針對使用 JSON\$1EXTRACT\$1PATH\$1TEXT 擷取的每一欄，重新剖析傳入的 JSON。在此之後就會進行資料類型轉換、篩選和商業邏輯計算。這表示，假如您從 JSON 資料擷取 10 個欄，則每項 JSON 記錄會剖析 10 次，其中包括額外的邏輯。這會導致擷取延遲提高。我們建議的替代方法是使用 [JSON\$1PARSE 函式](https://docs.aws.amazon.com/redshift/latest/dg/JSON_PARSE.html)，將 JSON 記錄轉換為 Redshift 的 SUPER 資料類型。串流資料放置在具體化視觀表後，使用 PartiQL 從 JSON 資料的 SUPER 表示法擷取個別字串。如需詳細資訊，請參閱[查詢半結構化資料](https://docs.aws.amazon.com/redshift/latest/dg/query-super.html)。

   此外請注意，JSON\$1EXTRACT\$1PATH\$1TEXT 的資料大小上限為 64KB。因此，如果有任何 JSON 記錄大於 64KB，則使用 JSON\$1EXTRACT\$1PATH\$1TEXT 處理該記錄會產生錯誤。
+  **將 Amazon Kinesis Data Streams 串流或 Amazon MSK 主題映射至多個具體化視**觀表 – 我們不建議建立多個具體化視觀表，以從單一串流或主題擷取資料。這是因為每個具體化視觀表都會為 Kinesis Data Streams 串流中的每個碎片或 Kafka 主題中的分割區建立取用者。這可能會導致限流或超過串流或主題的輸送量。此外也可能導致成本提高，因為您多次擷取相同的資料。當您設定串流擷取時，建議您為每個串流或主題建立一個具體化視觀表。

  如果您的使用案例需要您從某一個 KDS 串流或 MSK 主題將資料擷取至多個具體化視觀表，請在執行此操作之前，參考 [AWS 巨量資料部落格](https://aws.amazon.com/blogs/big-data/)，特別是[使用 Amazon Redshift 串流擷取搭配 Amazon MSK 實作近乎即時分析的最佳實務](https://aws.amazon.com/blogs/big-data/best-practices-to-implement-near-real-time-analytics-using-amazon-redshift-streaming-ingestion-with-amazon-msk/)。

## 串流擷取行為和資料類型
<a name="materialized-view-streaming-ingestion-limitations"></a>

下表說明各種資料類型的技術行為詳細資訊和大小限制。我們建議您先熟悉這些內容，再設定具體化視觀表進行串流擷取。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/materialized-view-streaming-ingestion.html)

# 開始使用 Amazon Kinesis Data Streams 中的串流擷取
<a name="materialized-view-streaming-ingestion-getting-started"></a>

本主題說明如何使用具體化視觀表從 Kinesis Data Streams 取用串流資料。

 設定 Amazon Redshift 串流擷取涉及建立對應至串流資料來源的外部結構描述，以及建立參照外部結構描述的具體化視觀表。Amazon Redshift 串流擷取支援以 Kinesis Data Streams 作為來源。因此，在設定串流擷取之前，您必須擁有可用的 Kinesis Data Streams 來源。如果您沒有來源，請按照 [Amazon Kinesis Data Streams 入門](https://docs.aws.amazon.com/streams/latest/dev/getting-started.html)中的 Kinesis 文件指示進行操作，或使用[透過 AWS 管理主控台建立串流](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-create-a-stream.html)中的指示，在主控台上建立一個來源。

 Amazon Redshift 串流擷取會使用具體化視觀表，執行 `REFRESH` 時會直接從串流更新該具體化視觀表。具體化視觀表會對應至串流資料來源。您可以對串流資料執行篩選和彙總，以做為具體化視觀表定義的一部分。您的串流擷取具體化視觀表 (*基礎*具體化視觀表) 只能參照一個串流，但是您可以建立與基礎具體化視觀表及其他具體化視觀表或資料表結合的額外具體化視觀表。

**注意**  
*串流擷取和 Amazon Redshift Serverless* - 本主題中的組態步驟同時適用於佈建的 Amazon Redshift 叢集和 Amazon Redshift Serverless。如需詳細資訊，請參閱[串流擷取行為和資料類型](materialized-view-streaming-ingestion.md#materialized-view-streaming-ingestion-limitations)。

假設您有可用的 Kinesis Data Streams 串流，第一步是使用 `CREATE EXTERNAL SCHEMA` 在 Amazon Redshift 中定義結構描述，並參照 Kinesis Data Streams 資源。之後，若要存取串流中的資料，請在具體化視觀表中定義 `STREAM`。您可以使用半結構化 `SUPER` 格式儲存串流記錄，或定義結構描述，將資料轉換為 Redshift 資料類型。當您查詢具體化視觀表時，傳回的記錄會是串流的時間點檢視。

1. 使用信任政策來建立 IAM 角色，允許 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組擔任該角色。如需如何設定 IAM 角色信任政策的資訊，請參閱[授權 Amazon Redshift 代表您存取其他 AWS 服務](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)。建立角色之後，該角色應具有下列 IAM 政策，該政策提供與 Amazon Kinesis 資料串流通訊的許可。

   **Kinesis 資料串流中未加密串流的 IAM 政策**

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetShardIterator",
                   "kinesis:GetRecords",
                   "kinesis:ListShards",
                   "kinesis:DescribeStream"
               ],
               "Resource": "arn:aws:kinesis:*:111122223333:stream/*"
           },
           {
               "Sid": "ListStream",
               "Effect": "Allow",
               "Action": "kinesis:ListStreams",
               "Resource": "*"
           }
       ]
   }
   ```

------

   **Kinesis 資料串流中加密串流的 IAM 政策**

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetShardIterator",
                   "kinesis:GetRecords",
                   "kinesis:ListShards",
                   "kinesis:DescribeStream"
               ],
               "Resource": "arn:aws:kinesis:*:111122223333:stream/*"
           },
           {
               "Sid": "DecryptStream",
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
           },
           {
               "Sid": "ListStream",
               "Effect": "Allow",
               "Action": "kinesis:ListStreams",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 檢查您的 VPC，並確認您的 Amazon Redshift 叢集或 Amazon Redshift Serverless 具有使用 NAT 閘道或網際網路閘道透過網際網路連線到 Kinesis Data Streams 端點的路徑。如果您希望 Redshift 和 Kinesis Data Streams 之間的流量保留在 AWS 網路中，請考慮使用 Kinesis Interface VPC Endpoint。如需詳細資訊，請參閱 [使用 Amazon Kinesis Data Streams 搭配介面 VPC 端點](https://docs.aws.amazon.com/streams/latest/dev/vpc.html)。

1. 在 Amazon Redshift 中，建立外部結構描述以將 Kinesis 中的資料對應至結構描述。

   ```
   CREATE EXTERNAL SCHEMA kds
   FROM KINESIS
   IAM_ROLE { default | 'iam-role-arn' };
   ```

    Kinesis Data Streams 的串流擷取不需要驗證類型。它會使用 `CREATE EXTERNAL SCHEMA` 陳述式中定義的 IAM 角色來提出 Kinesis Data Streams 要求。

    選用：使用 REGION 關鍵字指定 Amazon Kinesis Data Streams 或 Amazon MSK 串流所在的區域。

   ```
   CREATE EXTERNAL SCHEMA kds
   FROM KINESIS
   REGION 'us-west-2'
   IAM_ROLE { default | 'iam-role-arn' };
   ```

   在此範例中，該區域會指定來源串流的位置。IAM\$1ROLE 是一個範例。

1. 建立具體化視觀表以取用串流資料。使用如下的陳述式，如果無法剖析記錄，其會導致錯誤。如果您不希望略過錯誤記錄，請使用類似這樣的命令。

   ```
   CREATE MATERIALIZED VIEW my_view AUTO REFRESH YES AS
   SELECT *
   FROM kds.my_stream_name;
   ```

   Kinesis 串流名稱會區分大小寫，且可同時包含大寫和小寫字母。若要從具有大寫名稱的串流中擷取，您可以在資料庫層級將組態 `enable_case_sensitive_identifier` 設定為 `true`。如需詳細資訊，請參閱[名稱和識別碼](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html)與 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。

   若要開啟自動重新整理，請使用 `AUTO REFRESH YES`。預設行為是手動重新整理。請注意，當您使用 CAN\$1JSON\$1PARSE 時，可能會略過無法剖析的記錄。

   中繼資料資料欄包括下列項目：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started.html)

   請務必注意，如果您的具體化視觀表定義中有商務邏輯，商業邏輯錯誤可能會導致串流擷取在某些情況下遭到封鎖。這可能會導致您必須捨棄並重新建立具體化視觀表。為了避免這種情況，我們建議您盡可能簡化邏輯，並在擷取資料後，對資料執行大部分的商務邏輯檢查。

1. 重新整理檢視，這會調用 Redshift 從串流讀取，並將資料載入具體化視觀表。

   ```
   REFRESH MATERIALIZED VIEW my_view;
   ```

1. 查詢具體化視觀表中的資料。

   ```
   select * from my_view;
   ```

# 開始從 Apache Kafka 來源進行串流擷取
<a name="materialized-view-streaming-ingestion-getting-started-MSK"></a>

本主題說明如何使用具體化視觀表從 Amazon MSK、Apache Kafka 或 Confluent Cloud 取用串流資料。

 Amazon Redshift 串流擷取的目的是簡化直接從串流服務擷取串流資料至 Amazon Redshift 或 Amazon Redshift Serverless 的程序。這適用於 Amazon MSK Provisioned 和 Amazon MSK Serverless、開放原始碼 Apache Kafka，以及 Confluent Cloud。Amazon Redshift 串流擷取讓您在將串流資料擷取至 Amazon Redshift 之前，不需要在 Amazon S3 中暫存 Apache Kafka 主題。

 在技術層級上，串流擷取可提供以低延遲、高速的方式，將串流或主題資料擷取至 Amazon Redshift 具體化視觀表。在設定之後，您可以使用具體化視觀表重新整理採用大量資料。

您必須擁有可用的 Apache Kafka 來源，才能設定 Amazon Redshift 串流擷取。如果您沒有來源，請使用下列指示建立一個來源：
+ **Amazon MSK** - [開始使用 Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)
+ **Apache Kafka** - [Apache Kafka 快速入門](https://kafka.apache.org/quickstart)
+ **Confluent Cloud** - [Confluent Cloud 快速入門](https://docs.confluent.io/cloud/current/get-started/index.html)

## 設定從 Kafka 執行串流擷取
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup"></a>

使用下列程序設定從 Amazon MSK 或非 AWS受管 Apache Kafka 來源 (Apache Kafka 和 Confluent Cloud) 串流擷取至 Amazon Redshift。

**Topics**
+ [

### 設定身分驗證
](#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth)
+ [

### 設定您的 VPC
](#materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC)
+ [

### 建立具體化視觀表
](#materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view)

### 設定身分驗證
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-auth"></a>

本節說明設定身分驗證，以允許 Amazon Redshift 應用程式存取 Amazon MSK 來源。

建立應用程式的角色後，請連接下列其中一項政策，以允許存取您的 Amazon MSK、Apache Kafka 或 Confluent Cloud 叢集。對於 mTLS 身分驗證，您可以將 Amazon Redshift 使用的憑證儲存在 ACM 或 Secrets Manager 中，因此您必須選擇符合憑證儲存位置的政策。

請注意，當您搭配任何支援的 Apache Kafka 串流來源使用直接串流擷取至 Amazon Redshift 時，身分驗證或傳輸中的資料不支援自我簽署憑證。其中包括 Amazon MSK、Apache Kafka 和 Confluent Cloud。考慮使用透過 AWS Certificate Manager 或任何其他公開信任的憑證授權單位產生的憑證。

只有 Kafka 2.7.1 版或更新版本支援透過 MSK 進行 Amazon Redshift IAM 身分驗證。

**AUTHENTICATION IAM (僅限 Amazon MSK)：**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKIAMpolicy",
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:ReadData",
                "kafka-cluster:DescribeTopic",
                "kafka-cluster:Connect"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:cluster/MyTestCluster/*",
                "arn:aws:kafka:*:111122223333:topic/MyTestCluster/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:group/MyTestCluster/*"
            ]
        }
    ]
}
```

------

**驗證 MTLS：使用存放在 中的憑證 AWS Certificate Manager**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSACMpolicy",
            "Effect": "Allow",
            "Action": [
                "acm:ExportCertificate" 
            ],
            "Resource": [
                "arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID"
            ]
        }
    ]
}
```

------

**驗證 MTLS：使用存放在 中的憑證 AWS Secrets Manager**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSSecretsManagerpolicy",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue" 
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:444455556666:secret:secret_ID"
            ]
        }
    ]
}
```

------

------
#### [ Amazon MSK ]

如果您使用 AUTHENTICATION NONE 連線到 Amazon MSK 來源，則不需要 IAM 角色。不過，如果您使用 AUTHENTICATION IAM 或 MTLS 來驗證 Amazon MSK 叢集，您的 Amazon Redshift 叢集或 Amazon Redshift Serverless 命名空間必須附加具備適當許可的 IAM 角色。使用信任政策來建立 IAM 角色，允許 Amazon Redshift 叢集或 Amazon Redshift Serverless 命名空間擔任該角色。建立角色後，請新增下列其中一項許可，以便支援 IAM 或 MTLS。對於 mTLS 身分驗證，Amazon Redshift 使用的憑證可以存放在 或 中 AWS Certificate Manager AWS Secrets Manager，因此您必須選擇符合憑證存放位置的政策。將角色附加至您的 Amazon Redshift 佈建叢集或 Redshift Serverless 命名空間。如需如何設定 IAM 角色信任政策的資訊，請參閱[授權 Amazon Redshift 代表您存取其他 AWS 服務](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)。

下表顯示可從 Amazon MSK 設定串流擷取的免費組態選項：


| Amazon Redshift 組態 | Amazon MSK 組態 | 在 Redshift 和 Amazon MSK 之間開啟的連接埠 | 
| --- | --- | --- | 
|  AUTHENTICATION NONE  |  TLS 傳輸已停用  | 9092 | 
|  AUTHENTICATION NONE  |  已啟用的 TLS 傳輸  | 9094 | 
|  AUTHENTICATION IAM  |  IAM  | 9098/9198 | 
|  AUTHENTICATION MTLS  |  已啟用的 TLS 傳輸  | 9094 | 

Amazon Redshift 身份驗證是在 CREATE EXTERNAL SCHEMA 陳述式中設定的。

**注意**  
如果 Amazon MSK 叢集已啟用相互傳輸層安全性 (mTLS) 身份驗證，則將 Amazon Redshift 設定為使用 AUTHENTICATION NONE 會指示其使用連接埠 9094 進行未驗證的存取。但是，這將會失敗，因為 mTLS 身份驗證正在使用連接埠。因此，我們建議您在使用 mTLS 時切換到 AUTHENTICATION mtls。

------
#### [ Apache Kafka or Confluent Cloud ]

對於 Apache Kafka 和 Confluent Cloud，Amazon Redshift 支援下列連線通訊協定：
+ 連線至 Apache Kafka 時，您可以使用 mTLS 或純文字搭配 TLS 傳輸進行身分驗證。
+ 連線至 Confluent Cloud 時，您只能使用 mTLS 進行身分驗證。

Amazon Redshift 支援使用下列加密通訊協定連線至 Apache Kafka 和 Confluent Cloud：

**Apache Kafka 和 Confluent Cloud 支援的身分驗證方法**


| Amazon Redshift | Kafka 安全通訊協定 | Apache Kafka 支援 | Confluent Cloud 支援 | 
| --- | --- | --- | --- | 
| AUTHENTICATION NONE | PLAINTEXT | 否 | 否 | 
| AUTHENTICATION NONE | SSL | 是 | 否 | 
| AUTHENTICATION IAM | SASL\$1SSL | 否 | 否 | 
| AUTHENTICATION MTLS | SSL | 是 (使用憑證) | 是 (使用憑證) | 

請注意，Amazon Redshift 不支援 SASL/SCRAM 或 SASL/PLAINTEXT。

------

### 設定您的 VPC
<a name="materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC"></a>

建立身分驗證資源後，請檢查您的 VPC，並確認 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組具有通往 Apache Kafka 來源的路由。

**注意**  
對於 Amazon MSK，Amazon MSK 叢集的輸入安全群組規則應允許您的 Amazon Redshift 叢集或 Redshift Serverless 工作群組的安全群組。您指定的連接埠取決於 Amazon MSK 叢集上設定的身分驗證方法。如需詳細資訊，請參閱[連接埠資訊和](https://docs.aws.amazon.com/msk/latest/developerguide/port-info.html)[從 VPC 內部 AWS 外存取](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access.html)。

接著在您的 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組上啟用增強型 VPC 路由。如需詳細資訊，請參閱[啟用增強型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-enabling-cluster.html)。

### 建立具體化視觀表
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view"></a>

在本節中，您會設定 Amazon Redshift 用來存取 Apache Kafka 串流資料的具體化視觀表。

假設您有可用的 Apache Kafka 叢集，第一步是使用 `CREATE EXTERNAL SCHEMA` 在 Redshift 中定義結構描述，並將叢集作為資料來源參考。之後，若要存取主題中的資料，請在具體化視觀表中定義 `STREAM`。您可以使用預設的 Amazon Redshift VARBYTE 資料類型儲存來自主題的記錄，或定義結構描述，將資料轉換為半結構化的 `SUPER` 格式。當您查詢具體化視觀表時，傳回的記錄會是主題的時間點檢視。

1. 在 Amazon Redshift 中，建立外部結構描述以對應至 Apacke Kafka 叢集。語法如下：

   ```
   CREATE EXTERNAL SCHEMA MySchema
   FROM KAFKA
   [ IAM_ROLE [ default | 'iam-role-arn' ] ]
   AUTHENTICATION [ none | iam | mtls ]
   {AUTHENTICATION_ARN 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'};
   ```

   在 `FROM` 子句中，`KAFKA` 表示結構描述對應來自 Apache Kafka 來源的資料。

    `AUTHENTICATION` 表示串流擷取的身分驗證類型。有三種可用類型：
   + **none** - 指定不需身分驗證。這對應至 MSK 上未經驗證的存取。這對應至 Apache Kafka 中的 SSL 身分驗證。Confluent Cloud 不支援此身分驗證方法。
   + **iam** — 指定 IAM 身份驗證。您只能使用 IAM 身分驗證搭配 Amazon MSK。選擇此選項時，請確保 IAM 角色具有 IAM 身份驗證的許可。如需設定必要 IAM 政策的詳細資訊，請參閱 [設定從 Kafka 執行串流擷取](#materialized-view-streaming-ingestion-getting-started-MSK-setup)。
   + **mtls** - 指定雙向 Transport Layer Security 透過簡化用戶端與伺服器之間的身分驗證來提供安全通訊。在此情況下，用戶端是 Redshift，而伺服器是 Apache Kafka。如需使用 mTLS 設定串流擷取的詳細資訊，請參閱 [從 Apache Kafka 來源執行 Redshift 串流擷取時使用 mTLS 進行身分驗證](materialized-view-streaming-ingestion-mtls.md)。

   請注意，串流擷取不支援使用使用者名稱和密碼的 Amazon MSK 身分驗證。

   `AUTHENTICATION_ARN` 參數指定您用來建立加密連線的 ACM 雙向 Transport Layer Security (mTLS) 憑證的 ARN。

   `SECRET_ARN` 參數會指定包含 Amazon Redshift 用於 mTLS 之憑證的 AWS Secrets Manager 秘密 arn。

   下列範例示範如何在建立外部結構描述時，設定 Amazon MSK 叢集的代理系統 URI：

   **使用 IAM 身分驗證：**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION IAM
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098'
   ```

   **不使用身分驗證：**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA 
   AUTHENTICATION none
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092'
   ```

   **使用 mTLS：**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION MTLS
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b- 2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   {AUTHENTICATION_ARN 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'}
   ```

   如需建立外部結構描述的詳細資訊，請參閱 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

1. 建立具體化視觀表以取用主題的資料。使用下列範例所示的 SQL 命令。

   ```
   CREATE MATERIALIZED VIEW MyView AUTO REFRESH YES AS
   SELECT *
   FROM MySchema."mytopic";
   ```

   Kafka 主題名稱會區分大小寫，且可同時包含大寫和小寫字母。若要從具有大寫名稱的主題中擷取，您可以在工作階段或資料庫層級將組態 `enable_case_sensitive_identifier` 設定為 `true`。如需詳細資訊，請參閱[名稱和識別碼](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html)與 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。

   若要開啟自動重新整理，請使用 `AUTO REFRESH YES`。預設行為是手動重新整理。

1. 中繼資料資料欄包括下列項目：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)

   請務必注意，如果您的具體化視觀表定義中有商務邏輯會商業邏輯錯誤，則這可能會導致串流擷取在某些情況下擷取失敗。這可能會導致您必須捨棄並重新建立具體化視觀表。為了避免這種情況，我們建議您盡可能讓商業邏輯保持簡單，並在擷取資料後，對資料執行額外的邏輯。

1. 重新整理檢視，這會調用 Amazon Redshift 從主題讀取，並將資料載入具體化視觀表。

   ```
   REFRESH MATERIALIZED VIEW MyView;
   ```

1. 查詢具體化視觀表中的資料。

   ```
   select * from MyView;
   ```

   執行 `REFRESH` 時，具體化視觀表會直接從主題更新。您可以建立對應至 Kafka 主題資料來源的具體化視觀表。您可以對資料執行篩選和彙總，以做為具體化視觀表定義的一部分。您的串流擷取具體化視觀表 (基礎具體化視觀表) 只能參照一個 Kafka 主題，但是您可以建立與基礎具體化視觀表及其他具體化視觀表或資料表結合的額外具體化視觀表。

如需串流擷取限制的相關資訊，請參閱 [串流擷取行為和資料類型](materialized-view-streaming-ingestion.md#materialized-view-streaming-ingestion-limitations)。

# 從 Apache Kafka 來源執行 Redshift 串流擷取時使用 mTLS 進行身分驗證
<a name="materialized-view-streaming-ingestion-mtls"></a>

雙向 Transport Layer Security (mTLS) 為提供身分驗證的方法，讓伺服器對其傳送資訊的用戶端進行身分驗證，以及讓用戶端對伺服器進行身分驗證。使用 mTLS 的好處在於提供信任的身分驗證，供數種垂直產業應用程式中的各種使用案例使用。這些包括金融、零售、政府和醫療保健產業的使用案例。在串流擷取至 Redshift 的案例中，身分驗證會發生在伺服器 (如 Amazon MSK、Apache Kafka 或 Confluent Cloud) 與 Amazon Redshift 佈建叢集或 Amazon Redshift Serverless 工作群組之間。

本主題提供多項程序和 SQL 命令範例，示範如何建立外部結構描述，以使用 mTLS 在 Redshift 用戶端與任何 Apache Kafka 伺服器之間進行身分驗證。本主題中的步驟補充了設定從 Apache Kafka 來源進行串流擷取的完整步驟。如需詳細資訊，請參閱[開始從 Apache Kafka 來源進行串流擷取](materialized-view-streaming-ingestion-getting-started-MSK.md)。

## 使用 mTLS 進行串流擷取的先決條件
<a name="materialized-view-streaming-ingestion-mtls-prerequisites"></a>

本節提供使用 mTLS 搭配 AWS Certificate Manager 或 AWS Secrets Manager進行串流擷取的先決條件步驟。

作為初步步驟，您必須擁有或建立私有憑證授權機構 (PCA)，可用來發行憑證，以透過安全通訊管道啟用安全通訊。 AWS 私有憑證授權單位 (私有 CA) 是執行此功能的可用服務。如需詳細資訊，請參閱《AWS 私有憑證授權單位 使用者指南》**中的[建立私有 CA](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)。建立私有 CA 之後，匯出根 CA 憑證，並將其儲存至副檔名為 .pem 的檔案。

若要建立使用 CA 憑證的叢集，請執行下列操作：

------
#### [ Amazon MSK ]

1. 建立支援 mtls 用戶端身分驗證的 Amazon MSK 叢集。如需設定 Amazon MSK 叢集的詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》**中的 [Amazon MSK 的雙向 TLS 用戶端身分驗證](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html#msk-authentication-cluster)。

1. 編輯 Amazon MSK 叢集的安全設定，使用 AWS Certificate Manager (ACM) 開啟 TLS 用戶端身分驗證，然後選取您先前建立的 AWS 私有 CA (PCA)。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》**中的[更新叢集的安全設定](https://docs.aws.amazon.com/msk/latest/developerguide/msk-update-security.html)。

------
#### [ Confluent Cloud ]

1. 建立專用的 Confluent Cloud 叢集，最好與 Amazon Redshift 叢集位於相同的 AWS 區域 中。如需建立 Confluent Cloud 叢集的詳細資訊，請參閱[在 Confluent Cloud 中建立 Kafka 叢集](https://docs.confluent.io/cloud/current/get-started/index.html#step-1-create-a-ak-cluster-in-ccloud)。

1. 上傳您先前建立的匯出 AWS 私有 CA 根 CA 憑證 pem 檔案。如需詳細資訊，請參閱[管理 Confluent Cloud 的 mTLS 身分驗證的憑證認證機構](https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/mtls/certificate-authority.html)。Confluent Cloud 使用此憑證來驗證 Amazon Redshift 用戶端憑證。

------

## 使用 mTLS 搭配 進行串流擷取 AWS Certificate Manager
<a name="materialized-view-streaming-ingestion-mtls-acm"></a>

下列程序說明如何使用 AWS Certificate Manager (ACM) 儲存和管理憑證，以設定 Redshift 串流擷取使用的 mTLS：

1. 透過 ACM 請求私有憑證。當您執行此操作時，請選取您在「先決條件」一節中建立的 PCA 作為憑證認證機構。ACM 會儲存已簽署的憑證和附加的私有金鑰，以進行安全通訊。如需使用 ACM 管理憑證的詳細資訊，請參閱《AWS Certificate Manager 使用者指南》**中的[發行和管理憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs.html)。

1. 對於您用來管理 Redshift 叢集或 Amazon Redshift Serverless 工作群組的 IAM 角色，請附加許可以匯出憑證，即 **acm:ExportCertificate**。如需設定串流擷取所需 IAM 資源的詳細資訊，請參閱 [設定從 Kafka 執行串流擷取](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup)。在下一個步驟中指定相同的 IAM 角色，以建立外部結構描述。
**注意**  
請求在您的 VPC 中 AWS Certificate Manager 需要網際網路閘道 (IGW) 或 NAT 閘道 (NGW)。如果您的 VPC 沒有 IGW 或 NGW，請執行下列操作：  
使用 Secrets Manager 儲存您的憑證，而不要使用 ACM。
將 Secrets Manager VPC 端點附加至您的 VPC。
如需使用 Secrets Manager 搭配 mTLS 進行串流擷取的詳細資訊，請參閱後續的 [使用 mTLS 搭配 進行串流擷取 AWS Secrets Manager](#materialized-view-streaming-ingestion-mtls-secrets-manager)。

1. 取得 Amazon MSK、Apache Kafka 或 Confluent Cloud 叢集的啟動程序代理系統 URI。如需取得 Amazon MSK 的啟動程序代理系統 URI 的相關資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》**中的[取得 Amazon MSK 叢集的啟動程序代理系統](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)。

1.  執行如下列範例所示的 SQL 命令，以使用 `mtls` 建立將叢集對應至 Redshift 外部結構描述的外部結構描述。

------
#### [ Amazon MSK ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
   ```

------
#### [ Apache Kafka or Confluent Cloud ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'lkc-2v531.domz6wj0p.us-west-1.aws.confluent.cloud:9092'
   AUTHENTICATION_ARN 'arn:aws:acm:region:444455556666:certificate/certificate_ID';
   ```

------

   重要參數：
   + IAM\$1ROLE - 與叢集相關聯的 IAM 角色，用於串流擷取。
   + URI - 叢集的啟動程序代理系統 URI。請注意，對於 Amazon MSK，指定連接埠 9094 與代理系統通訊以進行 TLS 加密。
   + AUTHENTICATION\$1ARN - ACM 憑證的 ARN。當您選擇發出憑證時，ACM 主控台中就會提供 ARN。

執行這些組態設定步驟後，您可以建立 Redshift 具體化視觀表，以參考範例中定義的結構描述，然後使用 REFRESH MATERIALIZED VIEW 來串流資料。如需詳細資訊，請參閱[開始從 Apache Kafka 來源進行串流擷取](materialized-view-streaming-ingestion-getting-started-MSK.md)。

## 使用 mTLS 搭配 進行串流擷取 AWS Secrets Manager
<a name="materialized-view-streaming-ingestion-mtls-secrets-manager"></a>

如果您不想在 AWS Certificate Manager中參考憑證，您可以使用 AWS Secrets Manager 進行憑證管理，藉此為 Redshift 串流擷取設定 mTLS。下列步驟說明如何使用 Secrets Manager 設定 mTLS。

1. 使用您選擇的工具建立憑證簽署請求和私有金鑰。然後，您可以使用簽署請求來產生已簽署憑證，以使用您用來為叢集產生憑證的相同 AWS 私有 CA (PCA)。如需發行憑證的詳細資訊，請參閱 *AWS 私有憑證授權單位 API 參考*中的 [IssueCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_IssueCertificate.html)。

1. 使用 擷取憑證 AWS 私有憑證授權單位。如需詳細資訊，請參閱《AWS 私有憑證授權單位 使用者指南》**中的[擷取私有憑證](https://docs.aws.amazon.com/privateca/latest/userguide/PcaGetCert.html)。

1. 將上一個步驟中產生的憑證和私有金鑰儲存在 AWS Secrets Manager中。選擇 `Other type of secret` 並使用純文字格式。索引鍵/值對的格式應為 `{"certificate":"<cert value>","privateKey":"<pkey value>"}`，如下列範例所示。如需在 中建立和管理秘密的詳細資訊 AWS Secrets Manager，請參閱*AWS Secrets Manager 《 使用者指南*》中的[使用 建立和管理秘密 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)。

   ```
   {"certificate":"-----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   H4hAX8/eE96qCcjkpfT84EdvHzp6fC+/WwM0oXlwUEWlvfMCXNaG5D8SqRq3qA==
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   -----END CERTIFICATE-----",
   "privateKey":"-----BEGIN PRIVATE KEY-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi
   7OD4m1dBEs3Fj++hDMH9rYRp99RqtCOf0EWOUe139KOilOsW+cyhAoc9Ci2+Jo/k
   17u2N1iGILMQEZuCRtnJOkFYkw==
   -----END PRIVATE KEY-----"}
   ```

1. 連接許可政策以將機密擷取至您用來管理 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組的 IAM 角色。此許可為 `secretsmanager:GetSecretValue`。如需詳細資訊，請參閱[設定身分驗證](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth)。如需管理 IAM 政策的詳細資訊，請參閱[編輯 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)。在下一個步驟中指定相同的 IAM 角色，以建立外部結構描述。

1. 在 Redshift 中執行 SQL 命令，以建立外部結構描述。您使用 AUTHENTICATION 類型 `mtls`。您也可以在 AWS Secrets Manager中指定叢集的 URI 和機密 ARN。

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
   ```

重要參數：
+ IAM\$1ROLE - 與叢集相關聯的 IAM 角色，用於串流擷取。
+ URI - 叢集的啟動程序代理系統 URI。請注意，對於 Amazon MSK，指定連接埠 9094 與代理系統通訊以進行 TLS 加密。
+ SECRET\$1ARN - Secrets Manager 中機密的 ARN，包含用於 mTLS 的憑證。

## 針對現有外部結構描述啟用 mTLS 身分驗證
<a name="materialized-view-streaming-ingestion-mtls-alter"></a>

如果您有用於串流擷取的現有外部結構描述，而且想要實作雙向 TLS 進行身分驗證，您可以執行下列命令，以指定 mTLS 身分驗證和 ACM 中的 ACM 憑證 ARN。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
```

或者，您可以指定 mTLS 身分驗證，並參考 AWS Secrets Manager中的機密 ARN。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

如需 ALTER EXTERNAL SCHEMA 命令的相關資訊，請參閱 [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md)。

# 使用 Kinesis 擷取串流資料
<a name="materialized-view-streaming-ingestion-example-station-data"></a>

此程序會示範如何從名為 *ev\$1station\$1data* 的 Kinesis 串流中擷取資料，該串流包含來自不同 EV 充電站的取用資料 (採用 JSON 格式)。該結構描述是明確定義的。此範例會示範如何將資料儲存為原始 JSON，以及如何在擷取資料時將 JSON 資料轉換為 Amazon Redshift 資料類型。

**生產者設定**

1. 使用 Amazon Kinesis Data Streams，按照以下步驟建立名為 `ev_station_data` 的串流。選擇**隨需**做為**容量模式**。如需詳細資訊，請參閱[透過 AWS 管理主控台建立串流](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-create-a-stream.html)。

1. [Amazon Kinesis 資料產生器](https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?)可協助您產生用於串流的測試資料。請依照工具中的詳細步驟來開始使用，並使用下列資料範本來產生資料：

   ```
   {
       
      "_id" : "{{random.uuid}}",
      "clusterID": "{{random.number(
           {   "min":1,
               "max":50
           }
       )}}", 
       "connectionTime": "{{date.now("YYYY-MM-DD HH:mm:ss")}}",
       "kWhDelivered": "{{commerce.price}}",
       "stationID": "{{random.number(
           {   "min":1,
               "max":467
           }
       )}}",
         "spaceID": "{{random.word}}-{{random.number(
           {   "min":1,
               "max":20
           }
       )}}",
    
      "timezone": "America/Los_Angeles",
      "userID": "{{random.number(
           {   "min":1000,
               "max":500000
           }
       )}}"
   }
   ```

    串流資料中的每個 JSON 物件都包含下列屬性：

   ```
   {
       "_id": "12084f2f-fc41-41fb-a218-8cc1ac6146eb",
       "clusterID": "49",
       "connectionTime": "2022-01-31 13:17:15",
       "kWhDelivered": "74.00",
       "stationID": "421",
       "spaceID": "technologies-2",
       "timezone": "America/Los_Angeles",
       "userID": "482329"
   }
   ```

**Amazon Redshift 設定**

這些步驟會說明如何設定具體化視觀表以擷取資料。

1. 建立外部結構描述以將 Kinesis 中的資料對應至 Redshift 物件。

   ```
   CREATE EXTERNAL SCHEMA evdata FROM KINESIS
   IAM_ROLE 'arn:aws:iam::0123456789:role/redshift-streaming-role';
   ```

   如需如何設定 IAM 角色的詳細資訊，請參閱 [開始使用 Amazon Kinesis Data Streams 中的串流擷取](materialized-view-streaming-ingestion-getting-started.md)。

1. 建立具體化視觀表以取用串流資料。下列範例示範如何定義具體化視觀表，以從 Kinesis 串流擷取 JSON 格式的資料。

   首先，以半結構化 SUPER 格式儲存串流記錄。在此範例中，JSON 來源會儲存在 Redshift 中，而不會轉換為 Redshift 類型。

   ```
   CREATE MATERIALIZED VIEW ev_station_data AS
       SELECT approximate_arrival_timestamp,
       partition_key,
       shard_id,
       sequence_number,
       case when can_json_parse(kinesis_data) then json_parse(kinesis_data) else null end as payload,
       case when not can_json_parse(kinesis_data) then kinesis_data else null end as failed_payload
       FROM evdata."ev_station_data" ;
   ```

**查詢串流**

1. 使用以下命令啟用區分大小寫的 SUPER 屬性。Amazon Redshift 預設為不區分大小寫，因此，為了要存取區分大小寫的 SUPER 屬性，您需要啟用此功能。

   ```
   SET enable_case_sensitive_super_attribute to TRUE;
   ```

1. 使用以下命令重新整理具體化視觀表，以便從串流提取資料。

   ```
   REFRESH MATERIALIZED VIEW ev_station_data;
   ```

1. 查詢重新整理的具體化視觀表以取得使用狀況統計資料。

   ```
   SELECT e.payload.connectionTime::date as connectiontime
   ,SUM(e.payload.kWhDelivered::decimal(10,2)) AS Energy_Consumed
   ,count(distinct e.payload.userID) AS #Users
   from ev_station_data as e
   group by connectiontime
   order by 1 desc;
   ```

1. 檢視結果。

   ```
   connectiontime        energy_consumed    #users
   2022-02-08                 4139          10
   2022-02-09                 5571          10
   2022-02-10                 8697          20
   2022-02-11                 4408          10
   2022-02-12                 4257          10
   2022-02-23                 6861          10
   ```