本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动查询重写以使用具体化视图
通过自动重写 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 或更高版本上创建的具体化视图使用自动查询重写。
您可以通过对 FALSE 使用 SET mv_enable_aqmv_for_session,在会话级别禁用自动查询重写。
Limitations
自动查询重写适用于不引用或包括以下任何内容的具体化视图:
-
子查询
-
左、右或完整外部联接
-
使用 ORDER BY 子句设置运算
-
DISTINCT 聚合
-
窗口函数
-
除 SUM、COUNT 或 AVERAGE 之外的任何聚合
-
外部表
自动查询重写重写 SELECT 查询,该查询引用用户定义的 Amazon Redshift 表。Amazon Redshift 不会重写以下查询:
-
CREATE TABLE AS 语句
-
SELECT INTO 语句
-
对目录或系统表的查询
-
具有外部联接或 SELECT DISTINCT 子句的查询
如果未自动重新编写查询,请检查您是否具有指定具体化视图的 SELECT 权限,并且 mv_enable_aqmv_for_session 选项设置为 TRUE。有关 mv_enable_aqmv_for_session 的更多信息,请参阅mv_enable_aqmv_for_session。
您还可以通过检查 STV_MV_INFO 来检查具体化视图是否符合自动重写查询的资格。有关更多信息,请参阅STV_MV_INFO。