

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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 对表 T1 使用查询 `SELECT * FROM T1` 来创建实体化视图 M1。用户 A 对 T1 拥有完全 SELECT 权限。用户 A 向包括用户 B 在内的所有用户授予访问 M1 的权限。但是，当用户 B 尝试直接查询 T1 时，将拒绝其进行访问。这是因为用户 B 对 T1 没有 SELECT 权限。

稍后，用户 B 再次尝试查询 T1，但这次从 T1 得到了结果。这是因为使用实体化视图自动重写查询已将用户 B 对表 T1 (`SELECT <cols> FROM T1`) 的查询重写为对实体化视图 M1 (`SELECT <cols> FROM M1`) 的查询。

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

以下是使用实体化视图的自动查询重写的限制：
+ 自动查询重写适用于不引用或不包含以下任何操作的实体化视图：
  + 子查询
  + Left、right 或 full outer 联接
  + 设置操作 
  + 任意聚合函数（除 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)。