

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自动查询重写
<a name="automatic-query-rewriting"></a>

Amazon Redshift 可以自动重写未明确引用用于提高性能的现有实体化视图的 SQL 查询。直接查询实体化视图可以减少查询处理时间，但必须修改查询语句。如果您使用实体化视图来加速查询，则必须考虑如何系统地和自动地使用实体化视图来响应查询。您可以使用透明重写来添加或删除实体化视图，方法与索引相同，不会影响现有 SQL 语句。Amazon Redshift 在自动重写查询时仅使用 up-to-date物化视图。

## 查询重写的工作原理
<a name="query-rewriting-works"></a>

考虑以下 SQL 查询。该查询联接两个表：客户（1000 多万行）和订单（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` 列应用 sum 聚合，然后筛选结果，仅显示订单超过 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. 查询重写功能与自动实体化视图相结合，加快了数据库自主性。