CREATE MATERIALIZED VIEW LOG
描述
该语句用来创建物化视图日志。
物化视图日志(Materialized View Log,mlog)用于记录基表(普通表或物化视图)的增量更新数据,以支持物化视图的快速刷新功能。mlog 是一个记录表,追踪基表的变化,并将这些变化应用于相应的物化视图,实现快速刷新。
seekdb mlog 暂时不支持指定 Partition,mlog 的 Partition 和基表的 Partition 是绑定关系。
权限要求
创建物化视图日志需要有 CREATE TABLE 和基表的 SELECT 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类。
语法
CREATE [OR REPLACE] MATERIALIZED VIEW LOG ON [database.] table
[parallel_clause]
[with_clause]
[mv_log_purge_clause];
parallel_clause:
NOPARALLEL
| PARALLEL integer
with_clause:
WITH [ {PRIMARY KEY | ROWID | SEQUENCE}
[ { , PRIMARY KEY | , ROWID | , SEQUENCE }]... ]
(column_name [, column_name]...)
[new_values_clause]
new_values_clause:
{INCLUDING | EXCLUDING} NEW VALUES
mv_log_purge_clause:
PURGE {IMMEDIATE [ SYNCHRONOUS ]
| START WITH datetime_expr [NEXT datetime_expr]
| [START WITH datetime_expr] NEXT datetime_expr
}
参数说明
| 参数 | 描述 |
|---|---|
| OR REPLACE | 可选项,指定 OR REPLACE 表示如果对应的 mlog 已经存在,则根据定义创建一个新的 mlog,用新的 mlog 替换原有的 mlog。重新创建 mlog 过程中不会影响物化视图和基表的正常读写。 |
| database. | 可选项,指定物化视图日志基表所在的数据库。如果省略 database.,则默认基表在您自己的数据库中。 |
| table | 指定物化视图日志对应的基表名称。 |
| parallel_clause | 可选项,指定创建物化视图表的 dop,即用于指定并行处理物化视图日志的级别。详细介绍可参见下文 parallel_clause。 |
| with_clause | 可选项 ,指定物化视图日志中包含的辅助列。用于指示是否记录基表发生变化时的主键(PRIMARY KEY)和行标识符(ROWID),并且还可以使用该子句添加序列(SEQUENCE)来为物化视图日志提供额外的排序信息。详细介绍可参见下文 with_clause。 |
| column_name | 可选项,指定要在所有已更改行的物化视图日志中记录其值的列名称。 |
| new_values_clause | 可选项,是否在物化视图日志中同时记录更新操作中的旧值和新值。详细介绍可参见下文 new_values_clause。 |
| mv_log_purge_clause | 可选项,指定物化视图日志中数据的清除时间。详细介绍可参见下文 mv_log_purge_clause。 |
parallel_clause
-
NOPARALLEL:默认配置,并行度为1。 -
PARALLEL integer:指定并行度,integer取值大于等于1。
with_clause
-
PRIMARY KEY:表示物化视图日志记录的是基表的主键列。对有主键表才生效,如果不指定,系统会自动为物化视图日志添加这个属性,即物化视图日志默认会包含主键列。 -
ROWID:表示物化视图日志记录的是基表的行标识符(ROWID)。如果不指定,系统会自动为物化视图日志添加这个属性,即物化视图日志默认会包含M_ROW$$列。 -
SEQUENCE:表示物化视图日志记录的是事务内的多行更新序号(seq_no)。系统会自动为物化视图日志添加这个属性,即物化视图日志会默认包含SEQUENCE$$列。
new_values_clause
-
INCLUDING:默认设置,表示可以在物化视图日志中保存新旧值。如果希望物化视图支持快速刷新,则必须指定INCLUDING NEW VALUES。 -
EXCLUDING:表示禁用在物化视图日志中记录新值。请不要使用EXCLUDING NEW VALUES,否则将会报错。
mv_log_purge_clause
只有在物化视图成功刷新后,物化视图日志中的相应数据才会被清除。
-
IMMEDIATE:表示在每次刷新完物化视图后就立即清除相应的物化视图日志。默认值是SYNCHRONOUS。SYNCHRONOUS:可选项,表示同步地执行清除。
-
START WITH datetime_expr [NEXT datetime_expr]:START WITH datetime_expr:表示物化视图日志的首次清除时间。[NEXT datetime_expr]:可选项,表示下一次清除物化视图日志的时间。用于设置下一次清除物化视图日志的时间。
-
[START WITH datetime_expr] NEXT datetime_expr:如果未指定START WITH datetime_expr参数,仅指定NEXT datetime_expr参数,那么物化视图日志的第一次清除时间将设定为NEXT datetime_expr参数的值。
请确保 START WITH datetime_expr 和 NEXT datetime_expr 这两个时间表达式设定在未来的时间点,否则会引发错误。
建议使用 sysdate() 表示当前时区时间,时间表达式示例如下:
START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY
上述子句表示从当前时间(sysdate())开始,每隔 1 天清理一次过期的物化视图日志记录。
示例
-
创建表
test_tbl1。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT); -
在
test_tbl1表上创建物化视图日志。指定并行处理物化视图日志的并行度为5和物化视图日志记录col2列的变更信息,并且会记录变更前后的新值;配置物化视图日志从当前日期开始,每隔1天清理一次过期的物化视图日志记录。CREATE MATERIALIZED VIEW LOG ON test_tbl1
PARALLEL 5
WITH SEQUENCE(col2) INCLUDING NEW VALUES
PURGE START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY; -
查看表
test_tbl1上物化视图日志的信息。DESC mlog$_test_tbl1;返回结果如下:
+------------+-------------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+------+---------+-------+
| col1 | int(11) | NO | PRI | NULL | |
| col2 | varchar(20) | YES | | NULL | |
| SEQUENCE$$ | bigint(20) | NO | PRI | NULL | |
| DMLTYPE$$ | varchar(1) | YES | | NULL | |
| OLD_NEW$$ | varchar(1) | YES | | NULL | |
+------------+-------------+------+------+---------+-------+
5 rows in set (0.003 sec) -
将
test_tbl1表上物化视图日志变更为记录col2和col3列的变更信息。CREATE OR REPLACE MATERIALIZED VIEW LOG ON test_tbl1
PARALLEL 5
WITH SEQUENCE(col2 ,col3) INCLUDING NEW VALUES
PURGE START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY; -
查看表
test_tbl1上物化视图日志的信息。DESC mlog$_test_tbl1;返回结果如下:
+------------+-------------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+------+---------+-------+
| col1 | int(11) | NO | PRI | NULL | |
| col2 | varchar(20) | YES | | NULL | |
| col3 | int(11) | YES | | NULL | |
| SEQUENCE$$ | bigint(20) | NO | PRI | NULL | |
| DMLTYPE$$ | varchar(1) | YES | | NULL | |
| OLD_NEW$$ | varchar(1) | YES | | NULL | |
+------------+-------------+------+------+---------+-------+
6 rows in set (0.003 sec)