物化视图(Materialized View)是达梦数据库中以空间换时间的核心优化工具,它物理存储查询结果,适合大数据量下的高频查询场景。
| 对比维度 | 普通视图(VIEW) | 物化视图(MATERIALIZED VIEW) |
|---|---|---|
| 数据存储 | 只存 SQL 定义,不存数据 | 物理存储查询结果集(像一张表) |
| 查询性能 | 每次实时计算,慢 | 直接读数据,快(尤其是聚合查询) |
| 数据实时性 | 实时(查的是基表最新数据) | 可能滞后(取决于刷新策略) |
| 能否建索引 | 不能 | 可以建索引,进一步加速 |
| 占用空间 | 几乎不占 | 占用磁盘空间(和表一样) |
只同步基表变化的部分(通过物化视图日志)
适合基表频繁DML,但需要近实时同步的场景
每次truncate 或者delete后重新插入全部数据
适合基表数据量不大,或允许夜间批量刷新的场景
不自动刷新,需要用户手动执行 REFRESH 命令
适合数据不经常变化,或对实时性无要求的场景
CREATE MATERIALIZED VIEW [模式名.]物化视图名
(
-- 可选:指定列名(不指定则自动继承查询中的列名)
列1, 列2, ...
)
-- ========== 存储选项(物理属性) ==========
[STORAGE (INITIAL 初始大小, NEXT 增长大小, MINEXTENTS 最小区数, ...)]
[USING INDEX STORAGE (索引存储参数)]
[USING INDEX PCTFREE 百分比]
[PARTITION BY 分区方式 (分区列)] -- 支持对物化视图分区
-- ========== 刷新方式(重点) ==========
[REFRESH
{ FAST | COMPLETE | FORCE } -- 刷新方式:快速/完全/强制
[ ON { DEMAND | COMMIT } ] -- 触发时机:按需/提交时
[ START WITH 开始时间 ] -- 首次自动刷新时间
[ NEXT 下次刷新时间表达式 ] -- 刷新间隔
[ WITH { PRIMARY KEY | ROWID } ] -- 刷新依据
]
-- ========== 是否预建表 ==========
[BUILD { IMMEDIATE | DEFERRED }] -- IMMEDIATE(立即创建数据)/ DEFERRED(只建结构,稍后刷新)
-- ========== 查询语句 ==========
AS
SELECT ... FROM ... [GROUP BY ...] [HAVING ...]
创建物化视图日志表
create materialized view log on "DEMO"."SALES"
storage(initial 1, next 1, minextents 1, fillfactor 0, on "DEMO_TABLESPACE") with rowid, primary key ;
创建物化视图
CREATE MATERIALIZED VIEW DEMO.MV_DAILY_SALES
REFRESH COMPLETE ON DEMAND
START WITH SYSDATE
NEXT SYSDATE + INTERVAL '1' DAY -- 每天刷新一次
AS
SELECT
SALE_DATE,
COUNT(*) AS ORDER_COUNT,
SUM(AMOUNT) AS TOTAL_AMOUNT,
SUM(QTY) AS TOTAL_QTY
FROM DEMO.SALES
GROUP BY SALE_DATE;
手动刷新物化视图
-- 完全刷新(重建所有数据)
REFRESH MATERIALIZED VIEW DEMO. MV_DAILY_SALES COMPLETE;
-- 快速刷新(增量同步)
REFRESH MATERIALIZED VIEW DEMO. MV_DAILY_SALES FAST;
-- 强制刷新(先尝试FAST,失败则COMPLETE)
REFRESH MATERIALIZED VIEW DEMO. MV_DAILY_SALES FORCE;
修改和删除物化视图
-- 修改刷新时间(改为每小时刷新)
ALTER MATERIALIZED VIEW DEMO. MV_DAILY_SALES
REFRESH COMPLETE ON DEMAND
START WITH SYSDATE
NEXT SYSDATE + INTERVAL '1' HOUR;
-- 删除物化视图
DROP MATERIALIZED VIEW DEMO. MV_DAILY_SALES;
| 场景 | 说明 | 推荐刷新策略 |
|---|---|---|
| 数据仓库汇总 | 日报/月报统计(SUM/COUNT/AVG) | 完全刷新,每天凌晨 1 次 |
| 大表关联查询 | 多表 JOIN 结果物化,避免重复关联 | 快速刷新,每 10 分钟 |
| 远程数据同步 | 通过 DBLINK 从其他库同步数据 | 快速刷新,按需手动 |
| 实时大屏看板 | 需要秒级响应的聚合数据 | 快速刷新,每 30 秒(注意性能) |
物化视图可以像普通表一样建索引,这是它比普通视图强的地方:
-- 在物化视图上建索引(大幅提升查询速度)
CREATE INDEX IDX_MV_DAILY_SALES_SALE_DATE ON DEMO.MV_DAILY_SALES(SALE_DATE);
CREATE BITMAP INDEX IDX_MV_DAILY_SALES _ORDER_COUNT ON DEMO. MV_DAILY_SALES (ORDER_COUNT);
快速刷新要求物化视图的SQL必须包含ROWID,且不能有DISTINCT、UNION、外连接等复杂操作,否则只能用 REFRESH COMPLETE(全量刷新)
物化视图日志(MLOG$_表名)会不断累积变更记录,必须定期清理:PURGE MATERIALIZED VIEW LOG ON DEMO.SALES;
REFRESH COMPLETE 执行期间,基表会被锁定(DML阻塞),生产环境建议:用 REFRESH FAST 或在业务低峰期执行
文章
阅读量
获赞
