自动查询重写以使用实体化视图
您可以在 Amazon Redshift 中使用实体化视图的自动查询重写,让 Amazon Redshift 重写查询以使用实体化视图。这样做可加速查询工作负载,即使对于没有显式引用实体化视图的查询也是如此。当 Amazon Redshift 重写查询时,它只使用最新的实体化视图。
使用说明
要检查查询是否使用自动重写查询,可以检查查询计划或 STL_EXPLAIN。下面显示了 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_enable_aqmv_for_session to FALSE 来停止会话级别的自动查询重写。
限制
以下是使用实体化视图的自动查询重写的限制:
自动查询重写适用于不引用或不包含以下任何操作的实体化视图:
子查询
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_enable_aqmv_for_session 选项是否被设置为 TRUE。
您还可以通过检查 STV_MV_INFO 来检查实体化视图是否符合自动重写查询的条件。有关更多信息,请参阅 STV_MV_INFO。