Doris 异步物化视图实践:透明改写与自动刷新加速查询性能

发布时间:2026/9/28 20:49:37
Doris 异步物化视图实践:透明改写与自动刷新加速查询性能 Doris 异步物化视图实践透明改写与自动刷新加速查询性能Apache Doris原名 Palo是一款开源的实时分析型数据库广泛应用于大数据场景。物化视图是 Doris 提供的一项重要功能通过预先计算和存储常用查询结果显著提升查询性能。异步物化视图相比同步物化视图具有更好的灵活性和资源利用率特别适合数据量大、更新频繁的场景。Doris 异步物化视图的主要特点包括支持定义何时刷新基于时间或数据变更透明改写机制自动将查询路由到最合适的视图可与基表协同工作保证数据一致性支持多表聚合场景实现复杂查询加速1. Doris 异步物化视图概述异步物化视图是 Doris 提供的高级查询优化功能与同步物化视图相比它不会在基表数据更新时立即刷新而是按照预设策略如定时或触发式进行刷新从而降低对基表写入性能的影响。异步物化视图的核心优势在于资源利用率高避免写入时消耗大量计算资源可在业务低峰期进行刷新减少对在线查询的影响支持复杂多表关联预计算提升复杂查询性能灵活的刷新策略满足不同业务场景需求2. 透明改写机制原理与实践透明改写是 Doris 物化视图的核心优势之一它允许系统自动判断查询是否可以使用物化视图来加速而无需修改查询语句。透明改写的工作原理解析查询语句提取查询条件和聚合函数匹配与现有物化视图的定义如果查询能够从物化视图获取全部或部分数据则使用视图对于无法完全由视图满足的查询采用视图基表的混合策略实践示例-- 创建订单表 CREATE TABLE orders ( order_id BIGINT, user_id BIGINT, amount DECIMAL(10,2), order_date DATE ) ENGINEOLAP DISTRIBUTED BY HASH(user_id) BUCKETS 10 PROPERTIES (replication_num 1); -- 创建订单明细表 CREATE TABLE order_items ( item_id BIGINT, order_id BIGINT, product_id BIGINT, quantity INT, price DECIMAL(10,2) ) ENGINEOLAP DISTRIBUTED BY HASH(order_id) BUCKETS 10 PROPERTIES (replication_num 1); -- 创建异步物化视图统计用户每日订单总额 CREATE MATERIALIZED VIEW user_daily_order_mv BUILD DEFERRED REFRESH AUTO ON SCHEDULE EVERY 1 DAY PROPERTIES ( auto_refresh true ) AS SELECT user_id, order_date, SUM(amount) AS total_amount FROM orders GROUP BY user_id, order_date;上述物化视图会每天自动刷新一次当执行如下查询时Doris 会自动使用该视图加速-- 查询用户每日订单总额 SELECT user_id, order_date, SUM(amount) FROM orders GROUP BY user_id, order_date;3. 自动刷新功能配置与优化Doris 异步物化视图提供了灵活的自动刷新机制可以基于时间或数据变更触发刷新。基于时间的自动刷新CREATE MATERIALIZED VIEW daily_sales_mv BUILD DEFERRED REFRESH AUTO ON SCHEDULE EVERY 1 DAY PROPERTIES ( auto_refresh true, refresh_start_time 02:00:00 ) AS SELECT order_date, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY order_date;基于数据变更的自动刷新CREATE MATERIALIZED VIEW user_order_summary_mv BUILD DEFERRED REFRESH AUTO ON COMMIT PROPERTIES ( auto_refresh true ) AS SELECT user_id, COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY user_id;自动刷新优化策略合理设置刷新频率避免过于频繁消耗资源对于大表物化视图考虑使用增量刷新策略在业务低峰期执行刷新操作减少对在线查询的影响监控刷新性能及时调整参数4. 多表聚合加速场景应用在数据分析场景中经常需要关联多表并执行聚合操作这是异步物化视图的重要应用场景。多表物化视图示例-- 创建产品表 CREATE TABLE products ( product_id BIGINT, category_id BIGINT, product_name VARCHAR(100), price DECIMAL(10,2) ) ENGINEOLAP DISTRIBUTED BY HASH(product_id) BUCKETS 10 PROPERTIES (replication_num 1); -- 创建多表物化视图统计各类产品销售额 CREATE MATERIALIZED VIEW category_sales_mv BUILD DEFERRED REFRESH AUTO ON SCHEDULE EVERY 2 HOUR PROPERTIES ( auto_refresh true ) AS SELECT p.category_id, COUNT(DISTINCT o.order_id) AS order_count, SUM(oi.quantity * oi.price) AS total_sales FROM orders o JOIN order_items oi ON o.order_id oi.order_id JOIN products p ON oi.product_id p.product_id GROUP BY p.category_id;该物化视图通过关联三张表预先计算各类产品的销售数据当执行如下查询时Doris 会直接使用物化视图结果-- 查询各类产品销售情况 SELECT p.category_id, COUNT(DISTINCT o.order_id) AS order_count, SUM(oi.quantity * oi.price) AS total_sales FROM orders o JOIN order_items oi ON o.order_id oi.order_id JOIN products p ON oi.product_id p.product_id GROUP BY p.category_id;5. 实战案例与注意事项完整示例-- 1. 创建基表 CREATE TABLE sales ( id BIGINT, date DATE, store_id INT, product_id INT, quantity INT, amount DECIMAL(10,2) ) ENGINEOLAP DISTRIBUTED BY HASH(store_id) BUCKETS 10 PROPERTIES (replication_num 1); -- 2. 创建异步物化视图按门店统计日销售额 CREATE MATERIALIZED VIEW store_daily_sales_mv BUILD DEFERRED REFRESH AUTO ON SCHEDULE EVERY 1 DAY PROPERTIES ( auto_refresh true ) AS SELECT store_id, date, SUM(amount) AS total_sales, SUM(quantity) AS total_quantity FROM sales GROUP BY store_id, date; -- 3. 创建异步物化视图统计产品月销量 CREATE MATERIALIZED VIEW product_monthly_sales_mv BUILD DEFERRED REFRESH AUTO ON SCHEDULE EVERY 1 DAY PROPERTIES ( auto_refresh true ) AS SELECT product_id, DATE_FORMAT(date, %Y-%m) AS month, SUM(amount) AS total_sales, SUM(quantity) AS total_quantity FROM sales GROUP BY product_id, DATE_FORMAT(date, %Y-%m); -- 4. 查询1使用门店日销售额物化视图 SELECT store_id, date, total_sales FROM store_daily_sales_mv WHERE date 2023-01-01; -- 5. 查询2使用产品月销量物化视图 SELECT product_id, month, total_quantity FROM product_monthly_sales_mv WHERE month 2023-01;注意事项物化视图的查询条件必须完全匹配才能被改写建议经常使用的查询场景创建专门的物化视图大表物化视图会占用大量存储空间需要合理规划频繁更新基表数据时自动刷新可能会影响性能可考虑在业务低峰期设置刷新物化视图不支持所有查询场景复杂查询可能仍需直接查询基表定期检查物化视图是否被有效使用及时清理无用视图以节省资源异步物化视图工作流程是否是否用户提交查询Doris 查询优化器解析查询条件匹配物化视图是否有可用物化视图使用物化视图数据直接查询基表返回查询结果基表数据更新是否配置自动刷新触发刷新机制手动刷新刷新物化视图数据不同物化视图策略对比策略类型优点缺点适用场景同步物化视图数据实时性高无需额外刷新机制每次基表更新都触发刷新影响性能数据更新不频繁查询实时性要求高异步物化视图减少对基表更新的性能影响灵活设置刷新时间数据存在一定延迟数据量大更新频繁允许一定延迟增量刷新策略节省刷新资源仅处理变更数据实现复杂需额外管理增量数据超大表物化视图资源有限触发式刷新精准控制刷新时机资源利用率高需要明确触发条件增加系统复杂性业务有明显周期性需特定条件刷新