云数据仓库ADB这个支持多表join和where增量物化视图?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
云原生数据仓库AnalyticDB(简称ADB)支持多表JOIN
和WHERE
条件的增量物化视图功能,但需要满足一定的限制条件和配置要求。以下是详细解答:
JOIN
的支持ADB允许在增量物化视图中使用多表JOIN
操作,但需要注意以下几点:
内核版本要求:
如果需要创建包含多表JOIN
的增量物化视图,集群的内核版本需为3.2.1.0及以上。
主键定义:
增量刷新的物化视图必须正确定义主键。如果查询中包含GROUP BY
,主键必须是GROUP BY
列;如果没有GROUP BY
,则主键应与基表的主键一致或为全局唯一的常量。
索引要求:
多表JOIN
的关联列必须有索引。如果基表的关联列未创建索引,可能会导致报错Unable to use index join to refresh this fast MV
。可以通过以下命令为基表添加索引:
ALTER TABLE tablename ADD KEY idx_name(columnname);
数据类型一致性:
JOIN
的关联列数据类型必须一致。如果数据类型不同,可能会出现The join graph is not supported
错误。可以通过以下命令修改列的数据类型:
ALTER TABLE tablename MODIFY COLUMN columnname newtype;
示例代码:
创建一个包含多表JOIN
的增量物化视图:
CREATE MATERIALIZED VIEW join_mv_incre
REFRESH FAST NEXT now() + INTERVAL 3 minute
AS
SELECT
customer.customer_id,
SUM(sales.price) AS price
FROM customer
INNER JOIN (SELECT customer_id, price FROM sales) sales
ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id;
WHERE
条件的支持ADB的增量物化视图支持WHERE
条件过滤,但同样需要满足一些限制:
同步模式与异步模式:
过滤条件的复杂度:
支持大部分过滤和投影操作,但不支持OR
连接的条件或等值条件的左右列来自同一张表的情况。
示例代码:
创建一个包含WHERE
条件的增量物化视图:
CREATE INCREMENTAL MATERIALIZED VIEW mv
AS
SELECT *
FROM base
WHERE id > 40;
ADB提供了自动查询改写功能,可以进一步优化包含多表JOIN
和WHERE
条件的查询性能:
全匹配:
如果查询SQL与物化视图SQL完全相同,系统会自动使用物化视图中的数据加速查询。
查询补偿:
如果查询SQL与物化视图SQL不完全相同,但部分命中,系统会尝试通过补偿操作完成查询。例如:
INNER JOIN
表的顺序交换。LEFT JOIN
与RIGHT JOIN
互相转换。WHERE
子句条件顺序不同或额外条件的补偿。开启/关闭自动查询改写:
SET enable_incremental_matview_query_rewrite TO off;
SET enable_matview_query_rewrite TO on;
在使用多表JOIN
和WHERE
条件的增量物化视图时,需注意以下性能影响因素:
查询语句复杂度:
复杂JOIN
和多层嵌套会降低写入性能。建议尽量简化查询逻辑以提升效率。
写入放大效应:
当小表与大表进行JOIN
时,小表的数据变化可能导致写入性能成比例降低。例如,1万行的小表与10亿行的大表JOIN
时,小表的变化可能对结果集产生较大影响。
实例资源:
实时物化视图的增量计算和写入会占用实例资源。如果写入性能不足,可考虑增加计算资源以提升性能。
多表JOIN
和WHERE
条件的增量物化视图适用于以下场景:
实时ETL处理:
构建实时宽表或实时聚合结果,用于加速查询分析。
高过滤性查询:
查询结果相对于基表仅包含少量行或列,或者需要经过大量计算处理的场景。
大数据量更新:
基表包含大量全量数据,但增量数据更新量远小于全量数据的场景。
版本限制:
确保集群内核版本满足要求(如3.1.9.0及以上版本支持增量刷新,3.2.1.0及以上版本支持多表JOIN
)。
基表操作限制:
对基表执行TRUNCATE
命令时,实时物化视图不会同步变化;DROP TABLE
命令需指定CASCADE
选项;ALTER TABLE
命令无法删除或修改物化视图引用的字段。
常见报错及解决方法:
JOIN
关联列数据类型一致。通过以上说明,您可以根据业务需求合理设计和使用包含多表JOIN
和WHERE
条件的增量物化视图,同时注意性能优化和限制条件。
阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。