

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

# 自動查詢重寫
<a name="automatic-query-rewriting"></a>

Amazon Redshift 可以自動重寫 SQL 查詢，這些查詢不會明確參考用於提升效能的現有具體化視觀表。直接查詢具體化視觀表可減少查詢處理時間，但必須修改查詢陳述式。如果您使用具體化視觀表來加速查詢，請務必考慮如何系統地自動使用具體化視觀表來回應查詢。您可以使用透明重寫以與索引相同的方式來新增或刪除具體化視觀表，而不會影響現有的 SQL 陳述式。Amazon Redshift 只會在自動重寫查詢時使用最新的具體化視觀表。

## 查詢重寫的運作方式
<a name="query-rewriting-works"></a>

考慮下列 SQL 查詢。查詢聯結兩個資料表：客戶 (1 千萬個資料列以上) 和訂單 (100 億個資料列以上)：

```
SELECT c.cust_id,  
       c.first_name,  
       sum(o.amount) as total_amount
FROM orders o  
JOIN customer c 
  ON c.cust_id = o.customer_id
GROUP BY c.cust_id,  
         c.first_name
HAVING sum(o.amount) > 500;
```

此查詢聯結兩個大型資料表，對 `o.amount` 資料欄套用總和彙總，然後篩選結果以僅顯示訂購超過 500 美元的客戶。此查詢可能會消耗大量資源。

例如，考慮來自本指南的[建立具體化視觀表](creating-materialized-views.md)一節中的 `mv_total_orders` 具體化視觀表。建立此檢視之後，Amazon Redshift 會自動重寫上述查詢，如下所示：

```
SELECT cust_id,
       first_name,
       total_amount
FROM mv_total_orders
WHERE total_amount > 500;
```

此新查詢執行速度快得多，因為它使用具體化視觀表，而不是聯結兩個大型資料表。

由於下列原因，查詢重寫導致具體化視觀表得到更廣泛的採用：

1. 具體化視觀表支援透明重寫查詢。查詢重寫將以資料表的形式表示的 SQL 陳述式轉換為為存取一或多個具體化視觀表的陳述式。此轉換對最終使用者而言是透明的，不需要介入，也不需要參考 SQL 陳述式中的具體化視觀表。

1. 具體化視觀表可簡化快取通用結果集的應用程式，並支援跨查詢優化，例如預先運算。

1. 在資料倉儲和資料整合案例中，具體化視觀表可以具體化外部資料表結果，以隱藏多個資料來源之間的差異，從而實作本機複本或讀取/寫入分割。

1. 查詢重寫功能與自動具體化視觀表建立結合可加速資料庫自主性。