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 子句,并在其中使用逗号分隔的列名。 说明
|
| column_name | 指定物化视图的列名称。缺省情况下,由 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 语句。说明
|
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 JOIN 与 WHERE 子句,即 SPJ 查询。对于不满足条件的物化视图,不会报 错,但不会被用于改写。
DISABLE QUERY REWRITE:默认值,指定当前物化视图不开启自动改写。ENABLE QUERY REWRITE:指定当前物化视图开启自动改写。
更多物化视图改写的信息,参见 物化视图查询改写。
on_query_computation_clause
DISABLE ON QUERY COMPUTATION:默认值,指定创建普通物化视图。ENABLE ON QUERY COMPUTATION:指定创建实时物化视图。
更多实时物化视图的信息,参见 创建物化视图 中 创建实时物化视图 章节。
示例
-
创建表
test_tbl1。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT, col4 INT); -
创建名为
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; -
创建名为
mv2_test_tbl1的物化视图,并指定主键。CREATE MATERIALIZED VIEW mv2_test_tbl1(c1, c2, c3, PRIMARY KEY(c1))
AS SELECT col1, col2, col3
FROM test_tbl1; -
创建列存格式的物化视图
mv3_test_tbl1。CREATE MATERIALIZED VIEW mv3_test_tbl1
WITH COLUMN GROUP(each column)
AS SELECT col1, col2, col3
FROM test_tbl1; -
查看物化视图
mv3_test_tbl1定义。SHOW CREATE VIEW mv3_test_tbl1;