OceanBase
  • 产品
  • 解决方案
  • 客户
  • 合作伙伴
  • 资源与服务
  • 文档
  • 社区
云控制台登录 / 注册
  • 免费试用
OceanBase AI 数据平台

基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。

一体化能力

TP 事务处理

关键业务稳定运行,保障数据零丢失

AP 实时分析

事务分析一体,驱动智能决策与运营

AI 现代负载

统一多模态数据,支撑生产级应用

关键产品
OceanBase 分布式数据库

首批通过安全可靠测评,面向关键业务

OceanBase 集中式数据库

集中式架构,兼具性能与成本优势

OceanBase AI 数据库

面向 AI 应用与 Agent 的多模数据库

OceanBase AI 湖库

湖库一体的 AI 多模态数据系统

OceanBase DataPilot

企业级 AI 数据分析 Agent

OceanBase Agentbase

企业级 Agent 后端基础设施

OceanBase OAgent

数据库 AI 运维 Agent

OB Cloud

一体化云数据库,提供多云一致体验

OceanBase 数据库一体机

软硬一体,极致性能与高可靠性保障

OceanBase AI 一体机

开箱即用的 AI 数据库一体机

OMA 迁移评估工具

全链路数据库迁移评估

OMS 数据迁移工具

一站式数据传输与同步

OCP 运维管理工具

数据库全生命周期管理

ODC 开发者工具

数据库开发与管控协同

OAS 自治服务工具

数据库智能诊断与自治

通用场景
全场景业务系统 OLTP
实时分析混合负载
异地多活
多基础设施部署
一站式传统数据库升级
混合云部署
一库多芯软硬件混合部署
分布式数据库单机部署
大存储类数据库降本
冷数据归档降本
多实例资源整合
分库分表一体化升级
高并发场景
数据中台
行业解决方案
国有大行和股份制银行核心系统解决方案
区域性银行核心系统解决方案
寿险核心系统解决方案
产险核心系统解决方案
资管交易类系统解决方案
资管 TA 清算类系统解决方案
运营商核心系统解决方案
人社核心系统解决方案
电力核心系统解决方案
行业专区
银行专区

助力银行完成各类核心业务系统升级

保险专区

寿险、产险核心系统升级的更佳选择

零售专区

助力200+零售行业客户规模化落地

DB 大咖说
oceanbase爱奇艺

百亿级卡券业务的“单库双擎”架构升级

oceanbase四川银行

800个测试用例选定分布式数据库

oceanbase太平洋保险

先难后易,核心系统数据库升级复盘

行业案例
oceanbase交通银行

核心数据库的“分布式革命”

oceanbase中国移动

B域核心CRM&BOSS近乎零改造分布式升级

oceanbase理想

打造领先的智能制造系统和自动驾驶体验

演讲实录
oceanbase中国联通

集团应用分布式数据库覆盖B/O/M域

oceanbase国泰海通

智能推送系统稳定支撑单日亿级消息处理量

oceanbase中国联合航空

中国首款机票盲盒背后的数据库力量

用户实践
oceanbase北京银行

最快速度完成40余套系统国产数据库升级

oceanbaseVIVO

替换 MySQL 分库分表,探索成本效益最优

oceanbase滴滴

数据库大规模运维体系建设及落地实践

合作伙伴
合作伙伴类型
联合解决方案
产业生态伙伴
经销商伙伴
技术服务伙伴
培训认证伙伴
生态联合解决方案
神州信息 x OceanBase 银行核心系统
长亮科技 x OceanBase 新核心系统
中电金信 x OceanBase 金融分布式核心系统
天阳科技 x OceanBase 贷记卡方案
易诚互动 x OceanBase 手机银行方案
恒生 x OceanBase UF3.0/O45/TA/估值方案
商业发行版
云树®数据库软件 ActionDB
服务
支持与服务
提交工单
软件下载
OceanBase 企业版
OceanBase 社区版
OB Cloud
学习
培训与认证
在线课堂
在线体验
开发者
开发者中心
资料
行业报告与白皮书
官方博客
年度发布会资料
开发者大会资料
oceanbase白皮书

金融核心系统数据库升级路径与场景实践

oceanbase白皮书

人社关键业务数据库一体化升级实践

产品文档
oceanbaseOceanBase 数据库
数据库一体机
oceanbaseOceanBase AI 数据库
工具与组件
oceanbaseOB Cloud 云数据库
驱动和中间件
快速上手
OceanBase 数据库
OB Cloud 云数据库
知识库
汇聚常见产品使用问题案例
在线体验

Demo与实验,感受 OceanBase 的核心能力与应用场景

OceanBase 最佳实践
了解 OceanBase 分布式数据库的架构与系统原理
技术博客

技术解析 | 用户实践 | 社区月报

在线课堂

电子书 |视频课程|在线培训

Developer Hub
应用开发Demo | 数据开发与集成工具
问答论坛

快速答疑 | 常见问题 | 技术交流

社区活动

Meetup | 技术公开课

GitHub

查看源码 | 贡献代码 | 建议反馈

加入社区

社区组织 | 社区用户贡献 |开发者贡献

进入社区首页
oceanbase数据库大赛

第六届OceanBase数据库大赛

oceanbase免费课程

《Easy Data x AI》:面向所有 AI 爱好者的 Data 与 AI 基础知识入门教程

切换语言
  • 中文站 - 简体中文
  • International - English
  • 日本站 - 日本語

OceanBase

OceanBase 海扬数据库始创于 2010 年,是完全自主研发的数据库公司。2020年开始独立商业化运作,历经15年大规模核心场景验证,目前是中国数据库的领军企业之一。从分布式数据库到 AI 数据库,为企业提供安全、稳定、可扩展的数据底座,推动数据基础设施全面拥抱 AI 时代。

关于我们

关于 OceanBase最新动态资质荣誉客户专家委员会招贤纳士合作伙伴年度发布会开发者大会

资源与服务

支持与服务文档知识库软件与工具下载培训与认证在线体验数据库专题视频

社区

快速上手开发者中心博客活动学习问答GitHub

数据库百科

分布式数据库国产数据库OLTP 数据库OLAP 数据库HTAP 数据库数据库向量数据库向量检索

联系我们

服务热线:
400-109-0633
商务咨询
培训认证技术支持媒体合作
京公网安备11010802047223号京公网安备11010802047223号
京ICP备20024574号-1
合字B1.B2-20250395
网站服务协议隐私协议安全响应协议
OceanBase 版权所有 © 2026 基础资源和备案服务由阿里云提供
文档反馈
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V5.0.1
  5. 参考指南
  6. 数据库对象管理
  7. Oracle 模式
  8. 管理视图
  9. 管理物化视图
  10. 创建物化视图
分布式版-V5.0.1
  • 简介
  • 快速上手
  • 应用开发
  • 部署
  • 升级
  • 数据迁移
  • 管理数据库
  • AP
  • AI
  • 生态集成
  • 实践教程
  • 参考指南
    • 系统原理
    • 系统管理
    • 数据库对象管理
      • 数据库对象管理概述
      • MySQL 模式
      • Oracle 模式
        • 创建和管理表
        • 创建和管理分区
        • 创建和管理表组
        • 创建和管理索引
        • 管理视图
          • 管理普通视图
          • 管理物化视图
            • 物化视图概述
            • 物化视图日志
            • 创建物化视图
            • 刷新物化视图
            • 物化视图查询改写
            • 查询物化视图
            • 修改物化视图属性
            • 删除物化视图
            • 物化视图资源隔离
        • 管理序列
        • 管理同义词
        • 创建和管理触发器
        • 管理目录
        • 创建和管理 DBLink
    • 数据库设计规范和约束
    • SQL 参考
    • PL 参考
    • 系统视图
    • 配置项和系统变量
    • 错误码
    • 性能调优
    • 数据库代理
    • 驱动
    • 平台产品
    • 组件 & 工具
    • 数据库插件
  • 常见问题
  • 版本发布记录
  • 术语
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V5.0.1
  5. 参考指南
  6. 数据库对象管理
  7. Oracle 模式
  8. 管理视图
  9. 管理物化视图
  10. 创建物化视图

创建物化视图

更新时间:2026-08-30 22:11:55

github-fill编辑
编组分享

本文将向您介绍如何使用 SQL 语句创建物化视图。

说明

OceanBase 数据库暂时不支持直接修改物化视图的属性,如更新时间、刷新策略等。在这种情况下,可以考虑删除并重新创建物化视图以达到修改物化视图的目的。

权限要求

创建物化视图需要有 CREATE TABLE 权限。更多有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。

语法

创建物化视图的 SQL 语句格式如下:

CREATE MATERIALIZED VIEW view_name [([column_list] [PRIMARY KEY(column_list)])]
    [table_option_list]
    [partition_option]
    [mv_column_group_option]
    [refresh_clause [PARALLEL n] [query_rewrite_clause] [on_query_computation_clause]]
    AS view_select_stmt; 

参数说明:

  • view_name:指定待创建的物化视图的名称。

  • column_list:可选项,指定物化视图的列列表。如果想要为视图列指定明确的名称,可以使用 column_list 子句,并在其中使用逗号分隔的列名。

  • PRIMARY KEY(column_list):可选项,用于指定物化视图的主键。

  • table_option_list:可选项,指定物化视图的表选项。

  • partition_option:可选项,指定物化视图的分区选项。

  • mv_column_group_option:可选项,指定物化视图的存储格式。不指定时,默认创建行存格式的物化视图。

  • refresh_clause [PARALLEL n] [query_rewrite_clause] [on_query_computation_clause]:可选项,具体如下:

    • refresh_clause:指定物化视图的刷新方式。
    • PARALLEL n:指定刷新并行度。
    • query_rewrite_clause:可选项,指定当前物化视图是否开启自动改写。
    • on_query_computation_clause:可选项,指定当前物化视图是普通物化视图还是实时物化视图。
  • AS view_select_stmt:用于定义物化视图数据的查询(SELECT)语句。该语句用于从基表中检索数据,并将结果存储到物化视图中。

    说明

    • OceanBase 数据库支持外表作为物化视图的基表来创建全量刷新物化视图。
    • OceanBase 数据库支持在创建物化视图时对基表添加 AS OF PROCTIME() 子句,若在创建物化视图基表位置之外的地方使用了 AS OF PROCTIME() 则会报错。AS OF PROCTIME() 用于指定增量刷新时跳过这张表的刷新,并且 AS OF PROCTIME() 的表可以不创建 mlog。
    • OceanBase 数据库支持普通视图声明为维度表(AS OF PROCTIME())时,可以作为增量刷新物化视图的基表。

有关创建物化视图语法的详细参数说明信息,请参见 CREATE MATERIALIZED VIEW。

创建物化视图

创建普通物化视图

创建物化视图时,省略或者指定 DISABLE ON QUERY COMPUTATION 子句创建普通物化视图。

注意

OceanBase 数据库 Oracle 模式下,创建物化视图指定 DISABLE ON QUERY COMPUTATION 子句(on_query_computation_clause)时,必须指定刷新方式(refresh_clause)。

示例如下:

  1. 创建表 tbl1 作为物化视图的基表。

    CREATE TABLE tbl1 (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(20), col3 NUMBER);
    
  2. 基于表 tbl1 创建名为 mv_tbl1 的物化视图。

    CREATE MATERIALIZED VIEW mv_tbl1
        AS SELECT col1, col2
          FROM tbl1
          WHERE col3 >= 20;
    

    或者

    CREATE MATERIALIZED VIEW mv_tbl1
        REFRESH FORCE
        DISABLE ON QUERY COMPUTATION
        AS SELECT col1, col2
          FROM tbl1
          WHERE col3 >= 20;
    

创建嵌套物化视图

嵌套物化视图就是在已有的物化视图上构建的物化视图。例如下图,物化视图 mv1 基于表 tbl1 和表 tbl2 构建,是典型的物化视图。物化视图 mv2 则基于物化视图 mv1 和表 tbl3 构建,属于是嵌套物化视图。同理,物化视图 mv3 基于物化视图 mv1 和物化视图 mv2 构建,也是嵌套物化视图。

1

OceanBase 数据库创建嵌套物化视图时支持指定刷新策略,取值如下:

  • INDIVIDUAL:默认值,表示独立刷新。
  • INCONSISTENT:表示级联非一致性刷。
  • CONSISTENT:表示级联一致性刷新。

说明

对于非嵌套物化视图来说,不存在级联刷新行为,无论指定为何种刷新策略均无意义,都默认独立刷新。指定的三种刷新策略只在后台任务生效,当手动使用 PL 包(DBMS_MVIEW.REFRESH)调度刷新,按照指定的 PL 参数执行刷新。

嵌套物化视图功能限制

  • 为了支持嵌套物化视图的增量刷新,需要在物化视图(基表)上创建 mlog。
  • 如果一个物化视图进行了全量刷新,那么依赖它的物化视图(嵌套物化视图)在后续进行增量刷新前必须先进行一次全量刷新,否则会报错。
  • 嵌套物化视图不支持创建为实时物化视图,即创建嵌套物化视图时不支持指定 ENABLE ON QUERY COMPUTATION 子句。

示例如下:

  1. 创建表 tbl3 作为物化视图的基表。

    CREATE TABLE tbl3(id INT, name VARCHAR2(30), PRIMARY KEY(id));
    
  2. 创建表 tbl4 作为物化视图的基表。

    CREATE TABLE tbl4(id INT, age INT, PRIMARY KEY(id));
    
  3. 基于 tbl3 和 tbl4 创建物化视图 mv1_tbl3_tbl4。

    CREATE MATERIALIZED VIEW mv1_tbl3_tbl4 (PRIMARY KEY (id1, id2))
        REFRESH COMPLETE
        AS SELECT tbl3.id id1, tbl4.id id2, tbl3.name, tbl4.age
            FROM tbl3, tbl4
            WHERE tbl3.id = tbl4.id;
    
  4. 基于物化视图 mv1_tbl3_tbl4 创建物化视图(嵌套物化视图) mv_mv1_tbl3_tbl4。

    CREATE MATERIALIZED VIEW mv_mv1_tbl3_tbl4
        REFRESH COMPLETE
        AS SELECT SUM(AGE) age_sum
            FROM mv1_tbl3_tbl4;
    
  5. 基于物化视图 mv1_tbl3_tbl4 创建物化视图(嵌套物化视图) mv1_mv1_tbl3_tbl4,刷新策略为 INCONSISTENT。

    CREATE MATERIALIZED VIEW mv1_mv1_tbl3_tbl4
        REFRESH COMPLETE INCONSISTENT
        AS SELECT SUM(AGE) age_sum
            FROM mv1_tbl3_tbl4;
    

创建实时物化视图

创建物化视图时,指定 ENABLE ON QUERY COMPUTATION 子句创建实时物化视图。

注意

OceanBase 数据库 Oracle 模式下,创建实时物化视图必须指定刷新方式(refresh_clause)。

创建实时物化视图注意事项

  • 在创建实时物化视图前,物化视图依赖的基表都需要创建物化视图日志,OceanBase 数据库支持物化视图日志自动管理功能,默认系统自动创建物化视图日志,详细信息参见 物化视图日志。

  • 只有特定类型的物化视图支持指定为实时物化视图,对于不满足条件的物化视图指定实时物化视图时,会导致报错。实时物化视图的要求与增量刷新的物化视图要求是相同的。详细信息,参见 刷新物化视图 中 增量刷新基本要求 内容。

    • 使用 MIN/MAX 函数的物化视图不支持实时物化视图。
    • 带有外连接的聚合物化视图不支持实时物化视图。
    • 带有集合查询的物化视图不支持实时物化视图。
    • 嵌套物化视图不支持创建为实时物化视图。
  • 当执行查询的 Session 上的系统变量值和创建物化视图时固化在物化视图中的 Session 变量不一致时,需要将 Session 上的系统变量值修改为实时物化视图中固化的 Session 变量值,否则实时物化视图不可用,即实时物化视图查询改写不生效或直接查询实时物化视图会报错。

示例如下:

  1. 创建表 tbl2 作为物化视图的基表。

    CREATE TABLE tbl2(col1 INT, col2 INT, col3 INT);
    
  2. 基于表 tbl2 创建实时物化视图 mv_tbl2。

    CREATE MATERIALIZED VIEW mv_tbl2
        REFRESH COMPLETE ON DEMAND
        ENABLE ON QUERY COMPUTATION
        AS SELECT col1, count(*) AS cnt
           FROM tbl2
           GROUP BY col1;
    
  3. 创建实时物化视图后,可以通过视图 DBA_MVIEWS 查看物化视图的定位是否为实时物化视图。

    SELECT MVIEW_NAME, ON_QUERY_COMPUTATION
    FROM sys.DBA_MVIEWS
    WHERE MVIEW_NAME = 'MV_TBL2';
    

    注意

    Oracle 模式中视图 sys.DBA_MVIEWS 中字段 MVIEW_NAME 匹配表名时,表名需使用大写字母。

    返回结果如下:

    +------------+----------------------+
    | MVIEW_NAME | ON_QUERY_COMPUTATION |
    +------------+----------------------+
    | MV_TBL2    | Y                    |
    +------------+----------------------+
    1 row in set
    
  4. 查看实时物化视图的执行计划。

    EXPLAIN BASIC SELECT * FROM mv_tbl2;
    

    从下面的执行计划中可以看到,执行期间会同时从物化视图和视图依赖基表的 mlog 读取数据,并对这两部分数据进行计算整合,最终获取实时的物化视图数据。

    返回结果如下:

    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Query Plan                                                                                                                                                                       |
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | ==============================================                                                                                                                                   |
    | |ID|OPERATOR                   |NAME         |                                                                                                                                   |
    | ----------------------------------------------                                                                                                                                   |
    | |0 |HASH GROUP BY              |             |                                                                                                                                   |
    | |1 |└─SUBPLAN SCAN             |INNER_RT_MV$$|                                                                                                                                   |
    | |2 |  └─UNION ALL              |             |                                                                                                                                   |
    | |3 |    ├─TABLE FULL SCAN      |MV_TBL2      |                                                                                                                                   |
    | |4 |    └─HASH GROUP BY        |             |                                                                                                                                   |
    | |5 |      └─SUBPLAN SCAN       |DLT_T$$      |                                                                                                                                   |
    | |6 |        └─WINDOW FUNCTION  |             |                                                                                                                                   |
    | |7 |          └─TABLE FULL SCAN|MLOG$_TBL2   |                                                                                                                                   |
    | ==============================================                                                                                                                                   |
    | Outputs & filters:                                                                                                                                                               |
    | -------------------------------------                                                                                                                                            |
    |   0 - output([INNER_RT_MV$$.COL1], [cast(T_FUN_SUM(INNER_RT_MV$$.CNT), NUMBER(38, 0))]), filter([T_FUN_SUM(INNER_RT_MV$$.CNT) > cast(0, NUMBER(-1, -85))]), rowset=16            |
    |       group([INNER_RT_MV$$.COL1]), agg_func([T_FUN_SUM(INNER_RT_MV$$.CNT)])                                                                                                      |
    |   1 - output([INNER_RT_MV$$.COL1], [INNER_RT_MV$$.CNT]), filter(nil), rowset=16                                                                                                  |
    |       access([INNER_RT_MV$$.COL1], [INNER_RT_MV$$.CNT])                                                                                                                          |
    |   2 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16                                                                                                                 |
    |   3 - output([MV_TBL2.COL1], [MV_TBL2.CNT]), filter(nil), rowset=16                                                                                                              |
    |       access([MV_TBL2.COL1], [MV_TBL2.CNT]), partitions(p0)                                                                                                                      |
    |       is_index_back=false, is_global_index=false,                                                                                                                                |
    |       range_key([MV_TBL2.__pk_increment]), range(MIN ; MAX)always true                                                                                                           |
    |   4 - output([DLT_T$$.COL1], [T_FUN_SUM(CASE WHEN DLT_T$$.OLD_NEW$$ = cast('N', VARCHAR2(1048576 )) THEN cast(1, NUMBER(-1, -85)) ELSE (T_OP_NEG, cast(1,                        |
    |        NUMBER(-1, -85))) END)]), filter(nil), rowset=16                                                                                                                          |
    |       group([DLT_T$$.COL1]), agg_func([T_FUN_SUM(CASE WHEN DLT_T$$.OLD_NEW$$ = cast('N', VARCHAR2(1048576 )) THEN cast(1, NUMBER(-1, -85)) ELSE (T_OP_NEG,                       |
    |        cast(1, NUMBER(-1, -85))) END)])                                                                                                                                          |
    |   5 - output([DLT_T$$.OLD_NEW$$], [DLT_T$$.COL1]), filter([DLT_T$$.OLD_NEW$$ = cast('N', VARCHAR2(1048576 )) AND DLT_T$$.SEQUENCE$$ = DLT_T$$.MAXSEQ$$ OR                        |
    |       DLT_T$$.OLD_NEW$$ = cast('O', VARCHAR2(1048576 )) AND DLT_T$$.SEQUENCE$$ = DLT_T$$.MINSEQ$$]), rowset=16                                                                   |
    |       access([DLT_T$$.OLD_NEW$$], [DLT_T$$.SEQUENCE$$], [DLT_T$$.MAXSEQ$$], [DLT_T$$.MINSEQ$$], [DLT_T$$.COL1])                                                                  |
    |   6 - output([MLOG$_TBL2.OLD_NEW$$], [MLOG$_TBL2.SEQUENCE$$], [T_FUN_MAX(MLOG$_TBL2.SEQUENCE$$)], [T_FUN_MIN(MLOG$_TBL2.SEQUENCE$$)], [MLOG$_TBL2.COL1]), filter(nil), rowset=16 |
    |       win_expr(T_FUN_MAX(MLOG$_TBL2.SEQUENCE$$)), partition_by([MLOG$_TBL2.M_ROW$$]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED             |
    |       FOLLOWING)                                                                                                                                                                 |
    |       win_expr(T_FUN_MIN(MLOG$_TBL2.SEQUENCE$$)), partition_by([MLOG$_TBL2.M_ROW$$]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED             |
    |       FOLLOWING)                                                                                                                                                                 |
    |   7 - output([MLOG$_TBL2.M_ROW$$], [MLOG$_TBL2.SEQUENCE$$], [MLOG$_TBL2.OLD_NEW$$], [MLOG$_TBL2.COL1], [ORA_ROWSCN]), filter([cast(ORA_ROWSCN, NUMBER(-1,                        |
    |        -1)) > last_refresh_scn(500155)]), rowset=16                                                                                                                              |
    |       access([MLOG$_TBL2.M_ROW$$], [MLOG$_TBL2.SEQUENCE$$], [MLOG$_TBL2.OLD_NEW$$], [MLOG$_TBL2.COL1], [ORA_ROWSCN]), partitions(p0)                                             |
    |       is_index_back=false, is_global_index=false, filter_before_indexback[false],                                                                                                |
    |       range_key([MLOG$_TBL2.M_ROW$$], [MLOG$_TBL2.SEQUENCE$$]), range(MIN,MIN ; MAX,MAX)always true                                                                              |
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    40 rows in set
    

创建开启查询改写的物化视图

创建物化视图时,指定 ENABLE QUERY REWRITE 子句开启当前物化视图的自动改写。更多物化视图改写和改写控制的信息,参见 物化视图查询改写。

注意

对于定义了 ENABLE QUERY REWRITE 子句的物化视图并不表示物化视图一定会改写查询。对于不满足查询改写条件的物化视图,不会报错,但不会被用于改写。由于系统变量 query_rewrite_enabled 默认值是 false,所以默认情况下定义了 ENABLE QUERY REWRITE 子句的物化视图并不会被用于改写。

示例如下:

  1. 基于表 tbl1 创建物化视图 mv_spj_tbl1,并开启自动改写。

    CREATE MATERIALIZED VIEW mv_spj_tbl1
        NEVER REFRESH
        ENABLE QUERY REWRITE
        AS SELECT *
           FROM tbl1;
    
  2. 创建物化视图后,可以通过视图 DBA_MVIEWS 查看物化视图是否开启自动改写。

    SELECT MVIEW_NAME, REWRITE_ENABLED
    FROM sys.DBA_MVIEWS
    WHERE MVIEW_NAME = 'MV_SPJ_TBL1';
    

    注意

    Oracle 模式中视图 sys.DBA_MVIEWS 中字段 MVIEW_NAME 匹配表名时,表名需使用大写字母。

    返回结果如下:

    +-------------+-----------------+
    | MVIEW_NAME  | REWRITE_ENABLED |
    +-------------+-----------------+
    | MV_SPJ_TBL1 | Y               |
    +-------------+-----------------+
    1 row in set
    

创建列存格式物化视图

OceanBase 数据库支持行存、列存和行存列存冗余格式的物化视图,可以通过指定 mv_column_group_option 选项来显示创建列存或者行存列存冗余格式的物化视图。如果物化视图是多表 JOIN 形成的一张大宽表,创建列存格式的物化视图可以提高某些查询的性能。通过指定 WITH COLUMN GROUP(each column) 创建列存格式的物化视图。

说明

不指定 mv_column_group_option 选项时,默认创建行存格式的物化视图。

示例如下:

基于表 tbl1 创建列存格式的物化视图 mv_ec_tbl1。

CREATE MATERIALIZED VIEW mv_ec_tbl1
    WITH COLUMN GROUP(each column)
    AS SELECT *
       FROM tbl1;

创建物化视图时添加主键

注意

为物化视图指定主键后,维护/更新物化视图数据时,如果数据不满足主键约束,将导致视图维护失败。

示例如下:

基于表 tbl1 创建名为 mv_pk_tbl1 的物化视图,并指定主键。

CREATE MATERIALIZED VIEW mv_pk_tbl1(v_id, v_name, PRIMARY KEY(v_id))
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

创建物化视图时添加表选项和分区选项

在创建物化视图时,可以设置表选项,并根据数据特征和访问模式来设计和配置适合的分区选项,以提高查询性能和管理效率。

有关表选项和分区选项的详细参数说明信息,请参见 CREATE TABLE。

示例如下:

基于表 tbl1 创建名为 mv_pp_tbl1 的物化视图,指定物化视图的并行度为 5,将物化视图按照 col1 列进行 Hash 分区,并分为 8 个分区;将 tbl1 表中满足条件 col3 >= 20 的记录作为基表进行查询,并将查询结果作为物化视图的数据。

CREATE MATERIALIZED VIEW mv_pp_tbl1
    PARALLEL 5
    PARTITION BY HASH(col1) PARTITIONS 8
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

物化视图添加索引

在创建物化视图的语句中,不能直接创建索引,但可以使用 CREATE INDEX 语句为物化视图创建索引。

示例如下:

在物化视图 mv_tbl1 的 col1 列上创建名为 idx_mv_tbl1 的索引。

CREATE INDEX idx_mv_tbl1 ON mv_tbl1(col1);

物化视图刷新

OceanBase 数据库物化视图支持全量刷新、增量刷新、混合刷新和永不刷新四种刷新策略。具体如下:

  • 全量刷新:重新计算整个物化视图的数据,确保视图中的数据与源表完全一致。
  • 增量刷新:只刷新与源表变化相关的数据,避免对整个视图进行完全计算。
  • 混合刷新:默认选项,首先尝试增量刷新,如果增量刷新失败,则执行全量刷新。
  • 永不刷新:物化视图只在创建时进行刷新,并在创建后不允许再次刷新。

更多物化视图刷新的信息,请参见 刷新物化视图。

创建全量刷新物化视图

创建物化视图时,使用 REFRESH COMPLETE 子句设置物化视图的刷新策略为全量刷新。

注意

如果一个物化视图进行了全量刷新,那么依赖它的物化视图(嵌套物化视图)在后续进行增量刷新前必须先进行一次全量刷新,否则会报错。

示例如下:

基于表 tbl1 创建名为 mv_rc_tbl1 的物化视图,指定物化视图的刷新策略为全量刷新(REFRESH COMPLETE),指定从 tbl1 表中选择满足 col3 大于等于 20 的 col1 和 col2 列作为物化视图的数据源。

CREATE MATERIALIZED VIEW mv_rc_tbl1
    REFRESH COMPLETE
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

基于外表创建全量刷新物化视图

OceanBase 数据库支持外表作为物化视图的基表来创建全量刷新物化视图。

有关外表的介绍信息,参见 关于外表。

示例如下:

注意

示例中涉及 IP 的命令做了脱敏处理,在验证时应根据自己机器真实 IP 填写。

以下将以外部文件的位置在本地和在 OceanBase 数据库 Oracle 模式中创建外表为例,步骤如下:

  1. 准备外部文件。

    执行以下命令,在要登录 OBServer 节点所在机器的 /home/admin/external_csv 目录下,创建文件 ext_tbl1.csv。

    [admin@xxx /home/admin/external_csv]# vi ext_tbl1.csv
    

    文件的内容如下:

    1,'A1'
    2,'A2'
    3,'A3'
    
  2. 设置导入的文件路径。

    注意

    由于安全原因,设置系统变量 secure_file_priv 时,只能通过本地 Socket 连接数据库执行修改该全局变量的 SQL 语句。更多信息,请参见 secure_file_priv。

    1. 执行以下命令,登录到 OBServer 节点所在的机器。

      ssh admin@10.10.10.1
      
    2. 执行以下命令,通过本地 Unix Socket 连接方式连接租户 oracle001。

      obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******
      
    3. 执行以下 SQL 命令,设置导入路径为 /home/admin/external_csv。

      SET GLOBAL secure_file_priv = "/home/admin/external_csv";
      
  3. 重新连接租户 oracle001。

    示例如下:

    obclient -h10.10.10.1 -P2881 -usys@oracle001 -p****** -A
    
  4. 创建外表 ext_tbl1。

    CREATE EXTERNAL TABLE ext_tbl1 ( 
        id INT, 
        name VARCHAR2(50)
        )
        LOCATION = '/home/admin/external_csv'
        FORMAT = (
          TYPE = 'CSV'
          FIELD_DELIMITER = ','
          FIELD_OPTIONALLY_ENCLOSED_BY =''''
          )
        PATTERN = 'ext_tbl1.csv';
    
  5. 基于外表 ext_tbl1 创建全量刷新物化视图 mv_ext_tbl1。

    CREATE MATERIALIZED VIEW mv_ext_tbl1
        REFRESH COMPLETE
        AS SELECT *
            FROM ext_tbl1;
    
  6. 查看物化视图 mv_ext_tbl1 数据。

    SELECT * FROM mv_ext_tbl1;
    

    返回结果如下:

    +------+------+
    | ID   | NAME |
    +------+------+
    |    2 | A2   |
    |    1 | A1   |
    |    3 | A3   |
    +------+------+
    3 rows in set
    

创建增量刷新物化视图

创建物化视图时,使用 REFRESH FAST 子句设置物化视图的刷新策略为增量刷新。

创建增量刷新物化视图注意事项

  • 增量刷新的物化视图目前支持单表非聚合、单表聚合、多表关联、多表关联聚合、集合查询(UNION ALL)的 SQL 语句,对于不满足这五类场景的 SQL 语句,暂不支持增量刷新,增量刷新 SQL 语句要求详见 刷新物化视图 中 增量刷新 章节。

  • REFRESH FAST 方法利用物化视图日志中的记录信息来确定需要增量刷新的内容,OceanBase 数据库支持物化视图日志自动管理功能,默认系统自动创建物化视图日志,详细信息参见 物化视图日志。

  • 在创建物化视图时,可以对基表添加 AS OF PROCTIME() 子句,若在基表位置之外的地方使用了 AS OF PROCTIME() 则会报错。

    • AS OF PROCTIME() 用于指定增量刷新时跳过这张表的刷新,来加速物化视图的增量刷新。并且 AS OF PROCTIME() 的表可以不创建 mlog。如果该表需要使用别名,表别名需放在 AS OF PROCTIME() 子句后面。

    • 使用普通视图声明为维度表(AS OF PROCTIME())作为增量刷新物化视图的基表时,有如下限制:

      • 与基表的维度表类似,不允许物化视图中使用的所有表都为维度表。

示例如下:

  1. 创建表 tbl5 作为物化视图的基表。

    CREATE TABLE tbl5 (col1 INT PRIMARY KEY, col2 INT, col3 INT);
    
  2. 基于表 tbl5 创建名为 mv_tbl5 的物化视图,指定物化视图的刷新策略为增量刷新(REFRESH FAST),在查询部分指定从 tbl5 表中按照 col2 列进行分组,并计算 col3 列的总和(sum_col3)作为物化视图的结果。

    CREATE MATERIALIZED VIEW mv_tbl5
        REFRESH FAST
        AS SELECT col2, SUM(col3) sum_col3
           FROM tbl5
           GROUP BY col2;
    
  3. 基于表 tbl5 和 tbl1 创建名为 mv2_tbl5_tbl1 的物化视图,指定物化视图的刷新策略为增量刷新,通过 col1 字段进行内连接(INNER JOIN)。使用 AS OF PROCTIME() 指定表 tbl1 在物化视图增量刷新时需要跳过此表。

    CREATE MATERIALIZED VIEW mv2_tbl5_tbl1
        REFRESH FAST ON DEMAND
        AS SELECT 
            t5.col1 tbl5_c1,
            t1.col1 tbl1_c1,
            t5.col2 tbl5_c2,
            t1.col2 tbl1_c2
        FROM tbl5 t5
            INNER JOIN tbl1 AS OF PROCTIME() t1
            ON t5.col1 = t1.col1
        WHERE t5.col2 = 3;
    
  4. 基于引用声明为 AS OF PROCTIME() 的普通视图创建增量刷新物化视图。

    1. 基于表 tbl5 创建视图 v1_tbl5。

      obclient> CREATE VIEW v1_tbl5 AS SELECT * FROM tbl5;
      
    2. 基于表 tbl5 和 v1_tbl5 创建名为 mv3_tbl5_v_tbl5 的物化视图,指定物化视图的刷新策略为增量刷新,通过 col1 字段进行连接。使用 AS OF PROCTIME() 指定视图 v1_tbl5 为维度表。

      obclient> CREATE MATERIALIZED VIEW mv3_tbl5_v_tbl5
          AS SELECT
              a.col1 a_c1,
              b.col1 b_c1
          FROM tbl5 a JOIN v1_tbl5 AS OF PROCTIME() b
          ON a.col1 = b.col1;
      

创建混合刷新物化视图(默认选项)

创建物化视图时,省略或者指定 REFRESH FORCE 子句设置物化视图的刷新策略为混合刷新。

示例如下:

基于表 tbl1 创建名为 mv_rf_tbl1 的物化视图,指定物化视图的刷新策略为混合刷新(REFRESH FORCE),指定从 tbl1 表中选择满足 col3 大于等于 20 的 col1 和 col2 列作为物化视图的数据源。

CREATE MATERIALIZED VIEW mv_rf_tbl1
    REFRESH FORCE
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

创建物化视图时指定刷新并行度

创建物化视图时,通过 REFRESH ... PARALLEL n 指定刷新并行度。

示例如下:

基于表 tbl1 创建名为 mv_rcp3_tbl1 的物化视图,指定物化视图的刷新策略为全量刷新(REFRESH COMPLETE),并且指定查询并行度为 16 及刷新并行度为 5,从 tbl1 表中选择满足 col3 大于等于 20 的 col1 和 col2 列作为物化视图的数据源。

obclient> CREATE MATERIALIZED VIEW mv_rcp3_tbl1
    PARALLEL 16
    REFRESH COMPLETE PARALLEL 5 ON DEMAND
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

创建永不刷新物化视图

创建物化视图时,使用 NEVER REFRESH 子句设置物化视图不需要刷新。即表示物化视图只在创建时进行刷新,并在创建后不允许再次刷新。

示例如下:

基于表 tbl1 创建名为 mv_nr_tbl1 的物化视图,指定物化视图的刷新策略为永不刷新(NEVER REFRESH),指定从 tbl1 表中选择满足 col3 大于等于 20 的 col1 和 col2 列作为物化视图的数据源。

CREATE MATERIALIZED VIEW mv_nr_tbl1
    NEVER REFRESH
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

创建自动刷新物化视图

在创建物化视图时,可以通过指定 START WITH datetime_expr 和 NEXT datetime_expr 子句来为物化视图创建一个后台自动刷新任务。

注意

如果使用了 NEXT 子句,刷新计划的时间表达式必须设定在未来的时间点,否则会引发错误。

示例如下:

基于表 tbl1 创建名为 mv_rc_swn_tbl1 的物化视图,指定物化视图的刷新策略为全量刷新,物化视图的刷新计划中初始刷新时间为当前日期,之后每隔 1 小时刷新一次物化视图。

CREATE MATERIALIZED VIEW mv_rc_swn_tbl1
    REFRESH COMPLETE
        START WITH current_date NEXT current_date + INTERVAL '1' HOUR
    AS SELECT col1, col2
       FROM tbl1
       WHERE col3 >= 20;

相关文档

  • DBMS_MVIEW 概述
  • 物化视图概述
  • 物化视图日志
  • 刷新物化视图
  • 物化视图查询改写
  • 查询物化视图
  • 修改物化视图
  • 删除物化视图

本文目录

权限要求语法创建物化视图创建普通物化视图创建嵌套物化视图嵌套物化视图功能限制创建实时物化视图创建实时物化视图注意事项创建开启查询改写的物化视图创建列存格式物化视图创建物化视图时添加主键创建物化视图时添加表选项和分区选项物化视图添加索引物化视图刷新创建全量刷新物化视图创建增量刷新物化视图创建混合刷新物化视图(默认选项)创建物化视图时指定刷新并行度创建永不刷新物化视图创建自动刷新物化视图相关文档
有帮助
无帮助
反馈
AI