Lakehouse 视图与物化视图指南
概述
视图(View)和物化视图(Materialized View)是封装复杂查询逻辑、简化数据访问的重要工具。视图是虚拟表,查询时动态计算;物化视图预计算并存储结果,支持查询改写加速。本指南按业务场景分类,帮助你快速掌握视图的创建与管理方法。
涉及的 SQL 命令
| 命令 | 用途 | 适用场景 |
|---|
CREATE VIEW
CREATE VIEW | 创建逻辑视图 | 封装 JOIN/聚合,简化查询 |
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW | 创建物化视图 | 预计算高频查询结果 |
REFRESH MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW | 刷新物化视图 | 更新预计算数据 |
DROP VIEW
DROP VIEW / DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW | 删除视图 | 清理废弃视图 |
前置准备
以下示例使用模拟的销售明细表
sales_detail
sales_detail
:
-- 创建源表
CREATE TABLE IF NOT EXISTS sales_detail (
sale_id INT,
product_id INT,
region STRING,
amount DOUBLE,
sale_date DATE
);
-- 插入测试数据
INSERT INTO sales_detail VALUES
(1, 101, 'East', 5000, '2024-06-01'),
(2, 102, 'West', 3000, '2024-06-01'),
(3, 101, 'East', 5000, '2024-06-02');
创建普通视图
使用
CREATE VIEW
CREATE VIEW
定义逻辑视图。视图不存储数据,查询时动态执行底层 SQL。
-- 创建按区域汇总的视图
CREATE VIEW v_region_sales AS
SELECT
region,
COUNT(*) as sale_count,
SUM(amount) as total_amount
FROM sales_detail
GROUP BY region;
使用视图:
SELECT * FROM v_region_sales ORDER BY total_amount DESC;
结果说明:
| region | sale_count | total_amount |
|---|
| East | 2 | 10000 |
| West | 1 | 3000 |
💡 提示:视图适合封装复杂逻辑,但每次查询都会重新计算。如果需要预计算加速,物化视图支持查询改写(优化器自动替换,无需改应用代码);如果还需要增量刷新或构建数据管道,则考虑动态表。
创建物化视图
使用
CREATE MATERIALIZED VIEW
CREATE MATERIALIZED VIEW
创建预计算视图。物化视图会存储实际数据,查询时可被优化器自动改写使用。
-- 创建按日期汇总的物化视图
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT
sale_date,
SUM(amount) as daily_total
FROM sales_detail
GROUP BY sale_date;
查询物化视图:
SELECT * FROM mv_daily_sales ORDER BY sale_date;
结果说明:
| sale_date | daily_total |
|---|
| 2024-06-01 | 8000 |
| 2024-06-02 | 5000 |
⚠️ 注意:物化视图创建后不会自动刷新,需手动执行
REFRESH
REFRESH
或配置定时刷新。
刷新物化视图
当源表数据发生变化时,使用
REFRESH MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW
更新物化视图。
-- 向源表插入新数据
INSERT INTO sales_detail VALUES (4, 103, 'South', 4000, '2024-06-03');
-- 刷新物化视图
REFRESH MATERIALIZED VIEW mv_daily_sales;
-- 验证刷新结果
SELECT * FROM mv_daily_sales WHERE sale_date = '2024-06-03';
结果说明:
| sale_date | daily_total |
|---|
| 2024-06-03 | 4000 |
查询改写验证
Lakehouse 优化器会自动将针对源表的查询改写为查询物化视图,从而加速响应。
-- 直接查询源表(优化器可能自动改写为查询 mv_daily_sales)
SELECT sale_date, SUM(amount) as total
FROM sales_detail
GROUP BY sale_date;
💡 提示:使用
EXPLAIN
EXPLAIN
查看执行计划,可确认是否命中了物化视图改写。
删除视图
使用
DROP VIEW
DROP VIEW
或
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW
删除视图。
-- 删除普通视图
DROP VIEW v_region_sales;
-- 删除物化视图
DROP MATERIALIZED VIEW mv_daily_sales;
💡 提示:删除物化视图不会删除源表数据。物化视图在 Time Travel 保留期内可通过
UNDROP TABLE
UNDROP TABLE
恢复。
清理测试数据
完成视图验证后,建议清理测试表:
-- 删除测试表
DROP TABLE IF EXISTS sales_detail;
💡 提示:Lakehouse 支持
UNDROP TABLE
UNDROP TABLE
,误删后可在保留期内恢复。
注意事项
- 视图依赖:删除源表会导致依赖它的视图失效。请使用
DESC VIEW
DESC VIEW
查看依赖关系。
- 物化视图刷新:物化视图默认不自动刷新。对于需要近实时数据的场景,建议使用 Dynamic Table。
- 查询改写条件:优化器仅在物化视图的聚合维度与查询完全匹配时才会改写。
- 存储成本:物化视图会占用额外存储空间,大小与预计算结果集成正比。
- DROP 语法:删除物化视图必须使用
DROP MATERIALIZED VIEW
DROP MATERIALIZED VIEW
,不能使用 DROP VIEW
DROP VIEW
。
相关文档