本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动查询重写
Amazon Redshift 可以自动重写未明确引用用于提高性能的现有实体化视图的 SQL 查询。直接查询实体化视图可以减少查询处理时间,但必须修改查询语句。如果您使用实体化视图来加速查询,则必须考虑如何系统地和自动地使用实体化视图来响应查询。您可以使用透明重写来添加或删除实体化视图,方法与索引相同,不会影响现有 SQL 语句。Amazon Redshift 在自动重写查询时仅使用 up-to-date物化视图。
查询重写的工作原理
考虑以下 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 美元的客户。该查询可能会消耗大量资源。
例如,请考虑本指南创建实体化视图部分中的 mv_total_orders 实体化视图。创建此视图后,Amazon Redshift 会自动重写前面的查询,如下所示:
SELECT cust_id, first_name, total_amount FROM mv_total_orders WHERE total_amount > 500;
这个新查询的运行速度要快得多,因为它使用的是实体化视图,而不是联接两个大表。
由于以下原因,查询重写使得实体化视图得到更广泛的采用:
实体化视图支持查询的透明重写。查询重写将用表来表示的 SQL 语句转换为访问一个或多个实体化视图的语句。这种转换对最终用户是透明的,无需干预,也无需在 SQL 语句中引用实体化视图。
实体化视图简化了缓存通用结果集的应用,并支持跨查询优化,比如预计算。
在数据仓库和数据集成场景中,实体化视图可以将外部表的结果实体化,以隐藏多个数据来源之间的差异,实现本地副本或读/写分离。
查询重写功能与自动实体化视图相结合,加快了数据库自主性。