跳到主要内容

CREATE MATERIALIZED VIEW

描述

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

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

权限要求

创建物化视图需要有 CREATE TABLE 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类

语法

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 [refresh_option [nested_refresh_option]] [mv_refresh_on_clause]
| NEVER REFRESH

refresh_option:
COMPLETE
| FAST
| FORCE

nested_refresh_option:
INDIVIDUAL
| INCONSISTENT
| CONSISTENT

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 语句或者 ALTER TABLE 语句为物化视图创建索引。

参数描述
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
partition_option可选项,指定物化视图的分区选项。与普通表一样,物化视图可以单独设置分区,更多参数信息,请参见 CREATE TABLE
mv_column_group_option可选项,指定物化视图的存储格式。不指定时,默认创建行存格式的物化视图。详细介绍可参见下文 mv_column_group_option
refresh_clause可选项,指定物化视图的刷新方式。详细介绍可参见下文 refresh_clause
mv_refresh_on_clause可选项,指定物化视图的刷新时机。详细介绍可参见下文 mv_refresh_on_clause
query_rewrite_clause可选项,指定当前物化视图是否开启自动改写。详细介绍可参见下文 query_rewrite_clause
on_query_computation_clause可选项,指定当前物化视图是否是实时物化视图。详细介绍可参见下文 on_query_computation_clause
view_select_stmt用于定义物化视图数据的查询(SELECT)语句。该语句用于从基表中检索数据,并将结果存储到物化视图中。view_select_stmt 的语法与常规 SELECT 语句相同,语法信息请参见 SELECT 语句
说明
  • seekdb 支持普通视图和外表作为物化视图的基表来创建全量刷新物化视图。
  • seekdb 支持在创建物化视图时对基表添加 AS OF PROCTIME() 子句,若在创建物化视图基表位置之外的地方使用了 AS OF PROCTIME() 则会报错。AS OF PROCTIME() 用于指定增量刷新时跳过这张表的刷新,并且 AS OF PROCTIME() 的表可以不创建 mlog。
  • seekdb 支持普通视图声明为维度表(AS OF PROCTIME())时,可以作为增量刷新物化视图的基表。

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 [refresh_option [nested_refresh_option]] [mv_refresh_on_clause]:表示刷新物化视图的方式。

    • refresh_option:指定物化视图的刷新方式。可选项,如果不指定任何刷新方式默认是 FORCE。取值如下:

      • COMPLETE:表示进行全量刷新,即重新计算整个物化视图的数据,确保视图中的数据与源表完全一致。

      • FAST:表示进行增量刷新,即只刷新与源表变化相关的数据,避免对整个视图进行完全计算。

        提示
        • 由于 REFRESH FAST 方法利用物化视图日志中的记录信息来确定需要增量刷新的内容,因此在使用增量刷新刷新物化视图时,需要在创建物化视图之前就创建基表的物化视图日志(mlog)。

        • 增量刷新物化视图中使用的列都必须在 mlog 里。有关创建物化视图日志的信息,请参见 物化视图日志

      • FORCE:默认值,表示进行混合刷新,首先尝试增量刷新,如果增量刷新失败,则执行全量刷新。

      • nested_refresh_option:指定嵌套物化视图的刷新策略。可选项,如果不指定刷新策略时,默认为 INDIVIDUAL。取值如下:

        • INDIVIDUAL:默认值,表示独立刷新。
        • INCONSISTENT:表示级联非一致性刷。
        • CONSISTENT:表示级联一致性刷新。
        信息
        • seekdb 支持参数 nested_refresh_option(指定嵌套物化视图的刷新策略)。

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

  • 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() 表示当前时区时间,时间表达式示例如下:

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

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

query_rewrite_clause

提示

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

  • DISABLE QUERY REWRITE:默认值,指定当前物化视图不开启自动改写。
  • ENABLE QUERY REWRITE:指定当前物化视图开启自动改写。

更多物化视图改写的信息,参见 物化视图查询改写

on_query_computation_clause

  • DISABLE ON QUERY COMPUTATION:默认值,指定创建普通物化视图。
  • ENABLE ON QUERY COMPUTATION:指定创建实时物化视图。

更多实时物化视图的信息,参见 创建物化视图创建实时物化视图 章节。

示例

  1. 创建表 test_tbl1

    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 的记录作为基表进行查询,并将查询结果作为物化视图的数据。

    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 的物化视图,并指定主键。

    CREATE MATERIALIZED VIEW mv2_test_tbl1(c1, c2, c3, PRIMARY KEY(c1))
    AS SELECT col1, col2, col3
    FROM test_tbl1;
  4. 创建列存格式的物化视图 mv3_test_tbl1

    CREATE MATERIALIZED VIEW mv3_test_tbl1
    WITH COLUMN GROUP(each column)
    AS SELECT col1, col2, col3
    FROM test_tbl1;
  5. 查看物化视图 mv3_test_tbl1 定义。

    SHOW CREATE VIEW mv3_test_tbl1;

相关文档