

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

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

# 自動查詢重寫以使用具體化視檢視
<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)。