注册
DM8物化视图
专栏/技术分享/ 文章详情 /

DM8物化视图

DM_KSL 2026/09/18 236 0 0
摘要

物化视图

物化视图(Materialized View)是达梦数据库中以空间换时间的核心优化工具,它物理存储查询结果,适合大数据量下的高频查询场景。

一、 物化视图与普通视图区别

对比维度 普通视图(VIEW) 物化视图(MATERIALIZED VIEW)
数据存储 只存 SQL 定义,不存数据 物理存储查询结果集(像一张表)
查询性能 每次实时计算,慢 直接读数据,快(尤其是聚合查询)
数据实时性 实时(查的是基表最新数据) 可能滞后(取决于刷新策略)
能否建索引 不能 可以建索引,进一步加速
占用空间 几乎不占 占用磁盘空间(和表一样)

二、 DM物化视图三种类型

1. 快速刷新物化视图(增量刷新)

只同步基表变化的部分(通过物化视图日志)
适合基表频繁DML,但需要近实时同步的场景

2. 完全刷新物化视图(全量刷新)

每次truncate 或者delete后重新插入全部数据
适合基表数据量不大,或允许夜间批量刷新的场景

3. 手动刷新物化视图

不自动刷新,需要用户手动执行 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);

六、 注意事项

1. 快速刷新不是所有SQL都支持

快速刷新要求物化视图的SQL必须包含ROWID,且不能有DISTINCT、UNION、外连接等复杂操作,否则只能用 REFRESH COMPLETE(全量刷新)

2. 物化视图日志大小要注意

物化视图日志(MLOG$_表名)会不断累积变更记录,必须定期清理:PURGE MATERIALIZED VIEW LOG ON DEMO.SALES;

3. 刷新物化视图会锁表

REFRESH COMPLETE 执行期间,基表会被锁定(DML阻塞),生产环境建议:用 REFRESH FAST 或在业务低峰期执行

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服