---
title: "CREATE MATERIALIZED VIEW - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: CREATE MATERIALIZED VIEW 描述 该语句用来创建物化视图。 物化视图是一种特殊类型的数据库对象，它存储查询结果的副本，并定期刷新（也可以手动刷新）以保持数据的最新状态。物化视图可以包含聚合，连接和子查询等操作，并且可以被索引和分区，以进一步提高性能。 权限要求 创建物化视图需要有 CREATE …
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# CREATE MATERIALIZED VIEW

更新时间：2026-03-02 11:13:19

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/2250.create-materialized-views-of-mysql-mode-in-sql.md)  

## 描述

该语句用来创建物化视图。

物化视图是一种特殊类型的数据库对象，它存储查询结果的副本，并定期刷新（也可以手动刷新）以保持数据的最新状态。物化视图可以包含聚合，连接和子查询等操作，并且可以被索引和分区，以进一步提高性能。

## 权限要求

创建物化视图需要有 `CREATE TABLE` 权限。更多有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479241)。

## 语法

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

column_list:
    column_name [, column_name ...]

refresh_clause:
    REFRESH [COMPLETE | FAST | FORCE] [mv_refresh_on_clause]
    | NEVER REFRESH

mv_refresh_on_clause:
    [ON DEMAND] [[START WITH expr] [NEXT expr]]

query_rewrite_clause:
    DISABLE QUERY REWRITE
    | ENABLE QUERY REWRITE

on_query_computation_clause:
    DISABLE ON QUERY COMPUTATION
    | ENABLE ON QUERY COMPUTATION

mv_column_group_option:
    WITH COLUMN GROUP(all columns)
    | WITH COLUMN GROUP(each column)
    | WITH COLUMN GROUP(all columns, each column)

```

## 参数说明

#### 说明

在创建物化视图的语句中，不能直接创建索引。您可以使用 [CREATE INDEX](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479548) 语句或者 [ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479592) 语句为物化视图创建索引。

| **参数** | **描述** |
| --- | --- |
| view_name | 指定待创建的物化视图的名称。 |
| column_list | 可选项，指定物化视图的列列表。如果想要为视图列指定明确的名称，可以使用 column_list 子句，并在其中使用逗号分隔的列名。   #### 说明    - 视图必须具有唯一的列名，不得有重复，就像基表一样。缺省情况下，视图的列名将使用 `SELECT` 语句中检索的列名。 - 在 `column_list` 中指定的列名数量必须与 `SELECT` 语句中检索的列数相同。 |
| column_name | 指定物化视图的列名称。缺省情况下，由 `SELECT` 语句检索的列名将用作视图列名。 |
| PRIMARY KEY | 用于指定物化视图的主键。   #### 注意    - 如果未指定物化视图的列名称，那么在物化视图的主键中所使用的列名应与 `SELECT` 语句所检索的列名相同。 - 当为物化视图指定列名称时，列名称的列表末尾与 `PRIMARY KEY` 定义之间应以英文逗号进行分隔。 |
| table_option_list | 可选项，指定物化视图的表选项。与普通表一样，物化视图可以单独设置 Table Option，更多参数信息，请参见 [CREATE TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479546)。 |
| partition_option | 可选项，指定物化视图的分区选项。与普通表一样，物化视图可以单独设置分区，更多参数信息，请参见 [CREATE TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479546)。 |
| mv_column_group_option | 可选项，指定物化视图的存储格式。不指定时，默认创建行存格式的物化视图。详细介绍可参见下文 [mv_column_group_option](#mv_column_group_option)。 |
| refresh_clause | 可选项，指定物化视图的刷新方式。详细介绍可参见下文 [refresh_clause](#refresh_clause)。 |
| mv_refresh_on_clause | 可选项，指定物化视图的刷新模式，即刷新时机。详细介绍可参见下文 [mv_refresh_on_clause](#mv_refresh_on_clause)。 |
| query_rewrite_clause | 可选项，指定当前物化视图是否开启自动改写。详细介绍可参见下文 [query_rewrite_clause](#query_rewrite_clause)。 |
| on_query_computation_clause | 可选项，指定当前物化视图是否是实时物化视图。详细介绍可参见下文 [on_query_computation_clause](#on_query_computation_clause)。 |
| view_select_stmt | 用于定义物化视图数据的查询（`SELECT`）语句。该语句用于从基表中检索数据，并将结果存储到物化视图中。`view_select_stmt` 的语法与常规 `SELECT` 语句相同，语法信息请参见 [SELECT 语句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480787)。 |

### mv_column_group_option

- `WITH COLUMN GROUP(all columns)`：指定创建行存储格式的物化视图。
 - `WITH COLUMN GROUP(each column)`：指定创建列存储格式的物化视图。
 - `WITH COLUMN GROUP(all columns, each column)`：指定创建行存列存冗余格式的物化视图。

#### 说明

您可以使用 `SHOW CREATE TABLE view_name;` 或者 `SHOW CREATE VIEW view_name;` 命令来查看物化视图的定义，确定物化视图的存储格式。

### refresh_clause

- `REFRESH [FAST | COMPLETE | FORCE] [mv_refresh_on_clause]`：表示刷新物化视图的方式。

     - `[COMPLETE | FAST | FORCE]`：指定物化视图的刷新方式。可选项，如果不指定任何刷新方式默认是 `FORCE`。

           - `COMPLETE`：表示进行全量刷新，即重新计算整个物化视图的数据，确保视图中的数据与源表完全一致。
           - `FAST`：表示进行增量刷新，即只刷新与源表变化相关的数据，避免对整个视图进行完全计算。

            #### 注意

                   - 由于 `REFRESH FAST` 方法利用物化视图日志中的记录信息来确定需要增量刷新的内容，因此在使用增量刷新刷新物化视图时，需要在创建物化视图之前就创建基表的物化视图日志（mlog）。
                   - 增量刷新物化视图中使用的列都必须在 mlog 里。有关创建物化视图日志的信息，请参见 [物化视图日志](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479322)。
           - `FORCE`：默认值，表示进行混合刷新，首先尝试增量刷新，如果增量刷新失败，则执行全量刷新。
 - `NEVER REFRESH`：指定物化视图不需要刷新。即表示物化视图只在创建时进行刷新，并在创建后不允许再次刷新。

### mv_refresh_on_clause

#### 说明

除了使用 `mv_refresh_on_clause` 子句来定义刷新计划，您还可以通过调用 `dbms_mviews.refresh` 存储过程来手动刷新物化视图。

- `ON DEMAND`：可选项，表示按需刷新物化视图。
 - `[[START WITH expr] [NEXT expr]]`：可选项，表示定义刷新间隔。

     - `[START WITH expr]`：可选项，表示刷新计划开始的时间表达式。
     - `[NEXT expr]`：可选项，表示下一次刷新的时间表达式。

      #### 注意

           - 如果使用了 `NEXT` 子句，刷新计划的时间表达式必须设定在未来的时间点，否则会引发错误。
           - 如果期望物化视图周期性自动调度刷新任务，请通过定义 `NEXT` 来设置调度周期。

建议使用 `sysdate()` 表示当前时区时间，时间表达式示例如下：

```sql
START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY

```

上述子句表示从当前时间（`sysdate()`）开始，每隔 1 天刷新一次物化视图。

### query_rewrite_clause

#### 注意

本功能需要物化视图仅包含 `SELECT JOIN` 与 `WHERE` 子句，即 SPJ 查询。对于不满足条件的物化视图，不会报错，但不会被用于改写。

- `DISABLE QUERY REWRITE`：默认值，指定当前物化视图不开启自动改写。
 - `ENABLE QUERY REWRITE`：指定当前物化视图开启自动改写。

更多物化视图改写的信息，参见 [物化视图查询改写](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479317)。

### on_query_computation_clause

- `DISABLE ON QUERY COMPUTATION`：默认值，指定创建普通物化视图。
 - `ENABLE ON QUERY COMPUTATION`：指定创建实时物化视图。

更多实时物化视图的信息，参见 [创建物化视图](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479318) 中 **创建实时物化视图** 章节。

## 示例

1. 创建表 `test_tbl1`。

   ```sql
   CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT, col4 INT);

   ```
 2. 创建名为 `mv_test_tbl1` 的物化视图。将物化视图按照 `col1` 列进行 Hash 分区，并分为 `8` 个分区；使用完全刷新方法来刷新物化视图，从当前日期开始刷新，并每隔 `1` 天刷新一次；将 `test_tbl1` 表中满足条件 `col3 >= 30` 的记录作为基表进行查询，并将查询结果作为物化视图的数据。

   ```sql
   CREATE MATERIALIZED VIEW mv_test_tbl1
     PARTITION BY HASH(col1) PARTITIONS 8
     REFRESH COMPLETE START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY
     AS SELECT col1, col2, col3
       FROM test_tbl1
       WHERE col3 >= 30;

   ```
 3. 创建名为 `mv2_test_tbl1` 的物化视图，并指定主键。

   ```sql
   CREATE MATERIALIZED VIEW mv2_test_tbl1(c1, c2, c3, PRIMARY KEY(c1))
         AS SELECT col1, col2, col3
           FROM test_tbl1;

   ```
 4. 创建列存格式的物化视图 `mv3_test_tbl1`。

   ```sql
   CREATE MATERIALIZED VIEW mv3_test_tbl1
     WITH COLUMN GROUP(each column)
     AS SELECT col1, col2, col3
       FROM test_tbl1;

   ```
 5. 查看物化视图 `mv3_test_tbl1` 定义。

   ```sql
   SHOW CREATE VIEW mv3_test_tbl1;

   ```

## 相关文档

- [物化视图概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479323)
 - [创建物化视图](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479318)
 - [查询物化视图](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479321)
 - [删除物化视图](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479320)
 - [刷新物化视图](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479319)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
