When the data in the base table is updated, the data in the materialized view may become inconsistent with that in the base table. To maintain the data in the materialized view, OceanBase Database refreshes the materialized view.
OceanBase Database supports full refresh and incremental refresh for materialized views. You can also manually or automatically refresh a materialized view.
Note
When you refresh a materialized view, all indexes of the materialized view are also updated.
Full refresh
OceanBase Database performs a full refresh by using remote refresh. Specifically, a hidden table is created, the refresh statement is executed on the hidden table, and the original table is then switched with the hidden table. Therefore, a full refresh requires additional space and will rebuild all indexes (if any).
Considerations
- A full refresh may be a very time-consuming process, especially when a large amount of data needs to be read and processed. Therefore, you should always consider the time required for a full refresh before performing it.
- A full refresh is applicable only if the column types of the base table match those of the materialized view. Otherwise, a full refresh cannot be performed.
- If a materialized view is fully refreshed, any dependent materialized views (nested materialized views) must also be fully refreshed before they can be incrementally refreshed. Otherwise, an error will be returned.
Incremental refresh
Currently, incremental refresh is supported for materialized views that use the following types of SQL statements: non-aggregated single-table queries, aggregated single-table queries, multi-table join queries, multi-table join aggregated queries, and UNION ALL queries. For SQL statements that do not fall into these five categories, incremental refresh is not supported. For more information about the requirements for incremental refresh, see the following sections.
Notice
- Because the
REFRESH FASTmethod uses the records in the materialized view log to determine the content to be incrementally refreshed, you must create a materialized view log (mlog) for the base table before you create a materialized view for incremental refresh.- For more information about how to create a materialized view log, see Materialized view logs.
- OceanBase Database supports automatic management of materialized view logs. If you enable automatic management of mlogs, you do not need to create an mlog for the base table before you create a materialized view for incremental refresh. OceanBase Database automatically creates the corresponding mlog or updates the definition of an existing mlog table to include the columns required by the new materialized view. For more information, see Automatic management of materialized view logs.
- All columns used in the materialized view for incremental refresh must be included in the mlog.
Non-aggregated incremental refresh on a single table
Example of non-aggregated incremental refresh on a single table
Create the
tbl1table.CREATE TABLE tbl1 (col1 NUMBER PRIMARY KEY, col2 NUMBER, col3 NUMBER, col4 NUMBER);Create a materialized view log on the
tbl1table.CREATE MATERIALIZED VIEW LOG ON tbl1 WITH SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;Create an incremental refresh materialized view
mv_tbl1based on thetbl1table.CREATE MATERIALIZED VIEW mv_tbl1 REFRESH FAST ON DEMAND AS SELECT col1, col2 FROM tbl1;
Single-table incremental refresh of aggregate views
The following are the basic requirements for single-table incremental refresh of aggregate views:
The
FROMtable must be a base table, not an inline view or a regular view.Note
Nested materialized views do not support real-time materialized views. Therefore, when the
FROMtable is a materialized view, real-time materialized views cannot be used.Only one table exists in the
FROMclause.An mlog is created on the
FROMtable, and the columns used in the view are all included in the mlog.The view definition does not contain subqueries.
Window functions are not supported.
The view definition does not contain the
ROLLUP,HAVING,DISTINCT,ORDER BY,LIMIT, orFETCHclause.If the query contains
DISTINCT, the output columns of the materialized view that can be incrementally updated must be unique. Therefore, you can directly disable theDISTINCTkeyword or remove it.Statements without the
GROUP BYclause must be scalar aggregates.For materialized views with the
GROUP BYclause, only theSUMandCOUNTaggregate functions are supported, and only simple columns can be used in the aggregate functions. The requirements forGROUP BYare as follows:Aggregate function The SELECT clause must contain the dependent columns COUNT( expr ) N/A SUM ( expr ) COUNT( expr ) or expr is not null AVG ( expr ) SUM ( expr ),COUNT( expr ) STDDEV ( expr ) SUM ( expr ),COUNT( expr ),SUM ( expr * expr ) VARIANCE ( expr ) SUM ( expr ),COUNT( expr ),SUM ( expr * expr ) Other aggregate functions that can be decomposed into SUM and COUNT... (The calculation methods may change, which may affect the precision) SUM (col1),COUNT(col1) MAX(expr)/MIN(expr) COUNT(expr) - The
GROUP BYclause must be in the standardGROUP BYsyntax and must not containROLLUPorHAVING. - The
SELECTclause must contain all theGROUP BYcolumns. - The aggregate functions must not contain the
DISTINCTkeyword. - The
SELECTclause must contain the dependent columns and theCOUNT(*)column corresponding to the aggregate functions, in addition to the aggregate function columns. For example, if you use theSUM(expr)aggregate function, you must also include theCOUNT(*)andCOUNT(expr)columns.
- The
Requirements for incremental refresh of aggregate views with MIN/MAX aggregate functions:
Notice
Materialized views with the MIN/MAX aggregate function do not support real-time materialized views.
If the basic requirements for single-table incremental refresh of aggregate views are met, the following requirements apply when you use the MAX and MIN aggregate functions: an index with the GROUP BY columns as the prefix must exist on the base table of the materialized view.
Note
In OceanBase Database, the parameters of the MIN/MAX aggregate functions support non-basic columns. The GROUP BY clause can contain non-basic columns.
Single-table aggregate incremental refresh example
Create a table named
test_tbl1.CREATE TABLE test_tbl1 (col1 NUMBER PRIMARY KEY, col2 NUMBER, col3 NUMBER, col4 NUMBER);Create a materialized view log on the
test_tbl1table.CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;Create a materialized view with an incremental refresh method.
Create a materialized view named
mv1_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view selects thecol2column from thetest_tbl1table and calculates the aggregate results ofcount(*),count(col3), andsum(col3), grouped by the values in thecol2column.CREATE MATERIALIZED VIEW mv1_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col2, count(*) cnt, count(col3) cnt_col3, sum(col3) sum_col3 FROM test_tbl1 GROUP BY col2;Create a materialized view named
mv2_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view calculates the aggregate results ofcount(*),count(col3), andsum(col3)from thetest_tbl1table.CREATE MATERIALIZED VIEW mv2_test_tbl1 REFRESH FAST ON DEMAND AS SELECT count(*) cnt, count(col3) cnt_col3, sum(col3) sum_col3 FROM test_tbl1;Create a materialized view named
mv3_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view calculates the results ofcount(col3)andsum(col3)from thetest_tbl1table.CREATE MATERIALIZED VIEW mv3_test_tbl1 REFRESH FAST ON DEMAND AS SELECT count(col3) cnt_col3, sum(col3) sum_col3 FROM test_tbl1;Create a materialized view named
mv4_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view selects thecol2andcol3columns from thetest_tbl1table and calculates the aggregate results ofcount(*),count(col3), andsum(col3), grouped by the values in thecol2andcol3columns.CREATE MATERIALIZED VIEW mv4_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col2, col3, count(*) cnt, count(col3) cnt_col3, sum(col3) sum_col3 FROM test_tbl1 GROUP BY col2, col3;Create a materialized view named
mv5_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view selects thecol2column from thetest_tbl1table and calculates the aggregate results ofcount(*),count(col3),sum(col3), andavg(col3), as well as some custom columnscalcol1andcalcol2, grouped by the values in thecol2column.CREATE MATERIALIZED VIEW mv5_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col2, count(*) cnt, count(col3) cnt_col3, sum(col3) sum_col3, avg(col3) avg_col3, avg(col3) * sum(col3)/col2 calcol1, col2+sum(col3) calcol2 FROM test_tbl1 GROUP BY col2;Create a materialized view named
mv6_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view selects thecol2column from thetest_tbl1table and calculates the aggregate results ofcount(*),count(col3),sum(col3),count(col3*col3),sum(col3*col3), andSTDDEV(col3), grouped by the values in thecol2column.CREATE MATERIALIZED VIEW mv6_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col2, count(*) cnt, count(col3) cnt_col3, sum(col3) sum_col3, count(col3*col3) cnt_col3_2, sum(col3*col3) sum_col3_2, STDDEV(col3) stddev_col3 FROM test_tbl1 GROUP BY col2;Create a materialized view using the
MAXandMINaggregate functions.Create an index named
idx_test_tbl1on thetest_tbl1table based on thecol1andcol2columns.CREATE INDEX idx_test_tbl1 ON test_tbl1(col1, col2);Create a materialized view named
mv7_test_tbl1. Set the refresh method to incremental refresh, and allow manual refresh triggers as needed. The query part of the materialized view selects thecol1andcol2columns from thetest_tbl1table and calculates the aggregate results ofcount(*), the sum of the minimum value ofcol3and the maximum value ofcol4in each group, grouped by the combination ofcol1andcol2values.CREATE MATERIALIZED VIEW mv7_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col1, col2, count(*) cnt, MIN(col3) + MAX(col4) AS min_max_val FROM test_tbl1 GROUP BY col1, col2;
Use non-basic columns in the
GROUP BYclause.Create a table named
m_tbl1.obclient> CREATE TABLE m_tbl1(col1 NUMBER PRIMARY KEY, col2 DATE, col3 NUMBER, col4 NUMBER, col5 NUMBER, col6 NUMBER);Create a materialized view log on the
m_tbl1table.obclient> CREATE MATERIALIZED VIEW LOG ON m_tbl1 WITH PRIMARY KEY, ROWID, SEQUENCE (col2, col3, col4, col5, col6) INCLUDING NEW VALUES;Create an index named
idx1_m_tbl1on them_tbl1table based on thecol3and(DATE(col2))columns.obclient> CREATE INDEX idx1_m_tbl1 ON m_tbl1(col3, (ROUND(col2)));Create a materialized view named
m_tbl1_mv1with a single-table aggregate incremental refresh method.obclient> CREATE MATERIALIZED VIEW m_tbl1_mv1 REFRESH FAST ON DEMAND AS SELECT col3, ROUND(col2) gby_2, COUNT(*) cnt, MAX(col4) max_c4, MIN(col5 + col6) min_c5_c6 FROM m_tbl1 GROUP BY col3, ROUND(col2);
Incremental refresh of materialized views with multiple tables joined
The following requirements must be met for incremental refresh of materialized views with multiple tables joined:
The
FROMtable must be a base table, not an inline view.The
FROMtable must contain at least two tables.Notice
- The incremental refresh feature of materialized views in OceanBase Database supports outer joins (
LEFT JOIN/RIGHT JOIN). - Outer join restrictions: The join tree must be a left-deep join tree where
INNER JOINis performed first, followed byLEFT JOIN. - If the
SELECTclause of an incremental refresh materialized view contains theLEFT JOINoperator, you cannot specify a primary key (PRIMARY KEY) or unique index (UNIQUE INDEX) when you create the materialized view. This is to prevent refresh exceptions caused by constraint conflicts. - Aggregated materialized views with outer joins do not support real-time materialized views.
- The incremental refresh feature of materialized views in OceanBase Database supports outer joins (
Mlogs must be created for all
FROMtables, and the columns used in the view must exist in the mlogs.The view definition must not contain subqueries.
The view definition must not contain the
ROLLUP,HAVING,WINDOW FUNCTION,DISTINCT,ORDER BY,LIMIT, orFETCHclause.The view definition must not contain expressions that generate unstable output values, such as
ROWNUM,RAND, andSYSDATE.
Example of incremental refresh of materialized views with multiple tables joined
Create base tables
t1andt2.CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);CREATE TABLE t2(c1 INT PRIMARY KEY, c4 INT, c5 INT);Create materialized view logs on tables
t1andt2.CREATE MATERIALIZED VIEW LOG ON t1 WITH PRIMARY KEY, ROWID, SEQUENCE (c2) INCLUDING NEW VALUES;CREATE MATERIALIZED VIEW LOG ON t2 WITH PRIMARY KEY, ROWID, SEQUENCE (c4) INCLUDING NEW VALUES;Create a materialized view
mv1_t1_t2for the join of tablest1andt2.CREATE MATERIALIZED VIEW mv1_t1_t2 REFRESH FAST AS SELECT t1.c1 t1c1, t1.c2, t2.c1 t2c1, t2.c4 FROM t1 JOIN t2 ON t1.c1=t2.c1;
Note
- To achieve better performance in incremental refresh and real-time materialized views for simple join materialized views, we recommend that you create indexes for the materialized view and its dependent base tables as follows:
- Create indexes on the join keys of each table to improve the join performance in incremental updates and real-time materialized views.
- Create indexes on the primary key columns of the base tables in the materialized view.
- As the number of
JOINtables in the materialized view increases, the incremental refresh performance of the materialized view and the query performance of the real-time materialized view typically decrease.
Here is an example of creating indexes for the materialized view and its dependent base tables:
(Optional) Execute the following statement to delete the test data.
You can skip this step if the following database objects do not exist.
DROP MATERIALIZED VIEW LOG ON t1; DROP TABLE t1; DROP MATERIALIZED VIEW LOG ON t2; DROP TABLE t2; DROP MATERIALIZED VIEW rt_mv1;Execute the following statement to create table
t1and indexidx_t1_c2.CREATE TABLE t1(c1 INT GENERATED BY DEFAULT AS IDENTITY, c2 INT, c3 INT, c4 INT, c5 INT, PRIMARY KEY(c1)); CREATE INDEX idx_t1_c2 ON t1(c2);Execute the following statement to create table
t2and indexidx_t2_c3.CREATE TABLE t2(c1 INT GENERATED BY DEFAULT AS IDENTITY, c2 INT, c3 INT, c4 INT, c5 INT, PRIMARY KEY(c1)); CREATE INDEX idx_t2_c3 ON t2(c3);Execute the following statement to create materialized view logs on tables
t1andt2.CREATE MATERIALIZED VIEW LOG ON t1 WITH PRIMARY KEY, ROWID, SEQUENCE (c2, c3, c4) INCLUDING NEW VALUES; CREATE MATERIALIZED VIEW LOG ON t2 WITH PRIMARY KEY, ROWID, SEQUENCE (c2, c3, c4) INCLUDING NEW VALUES;Execute the following statement to create a real-time materialized view
rt_mv1.CREATE MATERIALIZED VIEW rt_mv1 NEVER REFRESH ENABLE ON QUERY COMPUTATION DISABLE QUERY REWRITE AS SELECT t1.c1 AS t1_c1, t2.c1 AS t2_c1, t1.c2 AS t1_c2, t2.c2 AS t2_c2, t1.c3 AS t1_c3, t2.c3 AS t2_c3 FROM t1, t2 WHERE t1.c2 = t2.c3;Execute the following statement to create indexes on the primary key columns of the base tables in the materialized view.
CREATE INDEX idx_mv_t1_c1 ON rt_mv1(t1_c1); CREATE INDEX idx_mv_t2_c1 ON rt_mv1(t2_c1);
Incremental refresh of aggregated views across multiple tables
The basic requirements for incremental refresh of aggregated views across multiple tables are as follows:
- The basic requirements for incremental refresh of aggregated views across multiple tables are the union of the basic requirements for incremental refresh of aggregated views on a single table and incremental refresh of joined views across multiple tables.
- Supports incremental refresh of aggregated views with outer joins. The limitations for outer joins in aggregated views are the same as those for non-aggregated outer-joined materialized views. The limitations for the aggregated part are the same as those for inner-joined aggregated views. However, aggregated views with outer joins do not support the
MINandMAXaggregate functions, and do not support real-time materialized views.
Example of incremental refresh of aggregated views across multiple tables
Create the base tables
t3andt4.CREATE TABLE t3(c1 INT, c2 INT, c3 INT, c4 INT, PRIMARY KEY(c1));CREATE TABLE t4(c1 INT, c2 INT, c3 INT, c4 INT, PRIMARY KEY(c1));Create materialized view logs on the
t3andt4tables.CREATE MATERIALIZED VIEW LOG ON t3 WITH PRIMARY KEY, ROWID, SEQUENCE(c2, c3, c4) INCLUDING NEW VALUES;CREATE MATERIALIZED VIEW LOG ON t4 WITH PRIMARY KEY, ROWID, SEQUENCE(c2, c3, c4) INCLUDING NEW VALUES;Create a real-time materialized view
mv1_t3_t4for the incremental refresh of the aggregated join between thet3andt4tables.CREATE MATERIALIZED VIEW mv1_t3_t4 REFRESH FAST ENABLE ON QUERY COMPUTATION AS SELECT t3.c1, COUNT(*) cnt, COUNT(t4.c4) cnt_c4, SUM(t4.c4) sum_c4, AVG(t4.c4) avg_c4 FROM t3, t4 WHERE t3.c2 = t4.c3 GROUP BY t3.c1;
Incremental refresh of a collection query
A collection materialized view supports the UNION ALL clause and allows incremental refresh. An incremental refresh of a collection materialized view allows you to use all materialized views that support incremental refresh in the collection branches, except for the excepted join materialized views.
The following requirements must be met for an incremental refresh of a collection query:
A materialized view with a collection query does not support real-time materialization.
The top-level query is
UNION ALL, and the view definition does not contain subqueries or clauses such asORDER BY,LIMIT, orFETCH.The output columns at the same projection positions in the
UNION ALLbranches must have the same data types. You cannot forcibly convert the data types of the columns in the subbranches to a consistent type by using theCASTclause.For example, in a materialized view that joins multiple tables, the primary keys of the joined tables must appear in the
SELECTclause. TheSELECToutput columns cannot be forcibly converted to a consistent type by using theCASTclause because of theUNION ALLclause.The
UNION ALLbranches must have the same data types and values for the columns at the same projection positions. The constant columns are used to identify the branches.
Examples
Create the base tables
ua_tbl1andua_tbl2.CREATE TABLE ua_tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT, col4 INT);CREATE TABLE ua_tbl2 (col1 INT PRIMARY KEY, col2 INT, col3 INT, col4 INT);Create materialized view logs on the tables
ua_tbl1andua_tbl2.CREATE MATERIALIZED VIEW LOG ON ua_tbl1 WITH PRIMARY KEY, ROWID, SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;CREATE MATERIALIZED VIEW LOG ON ua_tbl2 WITH PRIMARY KEY, ROWID, SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;Create the collection query materialized view
mv_ua_tbl1_tbl2that allows incremental refresh.CREATE MATERIALIZED VIEW mv_ua_tbl1_tbl2 REFRESH FAST ON DEMAND AS SELECT a.col1 as a_c1, b.col1 as b_c1, 1 marker, a.col2 val FROM ua_tbl1 a INNER JOIN ua_tbl2 b ON a.col2 = b.col3 UNION ALL SELECT col1 a_c1, col2 b_c1, 2 marker, count(*) val FROM ua_tbl1 GROUP BY col1, col2;
Parallelism control for materialized view refresh
OceanBase Database provides a parallelism control mechanism for materialized view refresh: if a user explicitly specifies the parallelism for a refresh operation, the specified value is used; if not, the system variable mview_refresh_dop can be configured to determine the parallelism for the current session.
Set mview_refresh_dop
mview_refresh_dop is a system variable in OceanBase Database that controls the default parallelism for materialized view refresh operations. By appropriately setting its value, you can significantly improve the refresh efficiency and optimize the database performance.
When mview_refresh_dop is set to 0 or 1, parallel refresh is disabled. For more information about the system variable mview_refresh_dop, see mview_refresh_dop.
Here are some examples:
Set the parallelism for the current session to 5.
SET mview_refresh_dop = 5;Set the parallelism for all sessions to 5.
SET GLOBAL mview_refresh_dop = 5;Notice
Setting a global variable does not take effect on the current session. You must log in again to create a new session for the setting to take effect.
View the parallelism of a materialized view
Use the DBA_MVIEWS view to query the background refresh parallelism of a materialized view.
Note
The
DBA_MVIEWSview can only be used to query the parallelism specified for a materialized view.- When the
REFRESH_DOPfield is not 0, the background refresh task of the materialized view will use the parallelism specified byREFRESH_DOP. - When
REFRESH_DOPis 0, the value of the global-levelmview_refresh_dopvariable will be used.
Here is an example:
Create a materialized view named
mv0_t1.CREATE MATERIALIZED VIEW mv0_t1 REFRESH COMPLETE ON DEMAND START WITH current_date NEXT current_date + INTERVAL '10' SECOND AS SELECT c1, c2 FROM t1;Query the background refresh parallelism of the materialized view
mv0_t1.SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM SYS.DBA_MVIEWS WHERE OWNER = 'SYS' AND MVIEW_NAME = 'MV0_T1';The query result is as follows:
+-------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +-------+------------+-------------+ | SYS | MV0_T1 | 0 | +-------+------------+-------------+ 1 row in setChange the parallelism of the materialized view
mv0_t1to 8.ALTER MATERIALIZED VIEW mv0_t1 PARALLEL 8;Query the background refresh parallelism of the materialized view.
SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM SYS.DBA_MVIEWS WHERE OWNER = 'SYS' AND MVIEW_NAME = 'MV0_T1';The query result is as follows:
+-------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +-------+------------+-------------+ | SYS | MV0_T1 | 8 | +-------+------------+-------------+ 1 row in set
- When the
Use the DBA_MVREF_RUN_STATS view to query the historical refresh parallelism of a materialized view.
Here is an example:
SELECT REFRESH_ID, MVIEWS, PARALLELISM FROM SYS.DBA_MVREF_RUN_STATS WHERE MVIEWS = 'SYS.MV0_T1' ORDER BY REFRESH_ID;The query result is as follows:
+------------+------------+-------------+ | REFRESH_ID | MVIEWS | PARALLELISM | +------------+------------+-------------+ | 6752103 | SYS.MV0_T1 | 5 | | 6752733 | SYS.MV0_T1 | 5 | | 6753371 | SYS.MV0_T1 | 5 | | 6753985 | SYS.MV0_T1 | 8 | | 6754618 | SYS.MV0_T1 | 8 | | 6755249 | SYS.MV0_T1 | 8 | +------------+------------+-------------+ 6 rows in set
Manually refresh a materialized view
If the refresh mode of a materialized view is ON DEMAND, you can use the DBMS_MVIEW package to manually refresh the materialized view. For a materialized view defined for incremental refresh, you can specify a full refresh when manually refreshing it.
Note
Only the owner or tenant administrator of a materialized view can refresh it.
Use the REFRESH procedure to refresh a materialized view
DBMS_MVIEW.REFRESH (
list IN VARCHAR2, -- The name of the materialized view. Multiple materialized views are not supported.
method IN VARCHAR2 := NULL, -- The refresh option. Valid values: f, ?, C, c, A, and a. The default value is NULL. For more information, see the description of this parameter.
-- f: fast refresh
-- ?: force refresh
-- C|c: complete refresh
-- A|a: always refresh, which is equivalent to C
----------- The following parameters are not supported. They are provided for compatibility with Oracle. ----------------
rollback_seg IN VARCHAR2 := NULL,
push_deferred_rpc IN BOOLEAN := true,
refresh_after_errors IN BOOLEAN := false,
purge_option IN BINARY_INTEGER := 1,
parallelism IN BINARY_INTEGER := 0,
heap_size IN BINARY_INTEGER := 0,
atomic_refresh IN BOOLEAN := true,
nested IN BOOLEAN := false,
out_of_place IN BOOLEAN := false,
skip_ext_data IN BOOLEAN := false,
---------------------------------------------------------
refresh_parallel IN BINARY_INTEGER := 0); -- The refresh parallelism of the materialized view. This parameter is unique to OceanBase Database.
Here is an example:
Insert three rows of data into the
test_tbl1table.INSERT INTO test_tbl1 VALUES (1, 1, 1, 1),(2, 2, 2, 2),(3, 3, 3, 3);View the information of the materialized view
mv1_test_tbl1.SELECT * FROM mv1_test_tbl1;The returned result is as follows:
Empty setManually refresh the materialized view
mv1_test_tbl1by using theDBMS_MVIEW.REFRESHfunction.Refresh the materialized view by using the refresh option specified for the materialized view:
CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1');Refresh the materialized view by specifying the refresh option:
CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1', 'c');
View the information of the materialized view
mv1_test_tbl1again.SELECT * FROM mv1_test_tbl1;The returned result is as follows:
+------+------+----------+----------+ | COL2 | CNT | CNT_COL3 | SUM_COL3 | +------+------+----------+----------+ | 3 | 1 | 1 | 3 | | 2 | 1 | 1 | 2 | | 1 | 1 | 1 | 1 | +------+------+----------+----------+ 3 rows in set
Set the refresh parallelism of a materialized view
You can set the mview_refresh_dop system variable to specify the default refresh parallelism of a materialized view.
You can also explicitly specify the refresh_parallel parameter in the DBMS_MVIEW.REFRESH function to set the refresh parallelism of the current refresh.
Notice
If the refresh parallelism is not explicitly specified and the mview_refresh_dop variable is 0 or 1, no parallel refresh is performed.
Here is an example:
Set the parallelism of the current session to 5.
SET mview_refresh_dop = 5;Manually refresh the materialized view:
Explicitly specify the refresh parallelism as 8. The refresh parallelism of this refresh is 8.
CALL DBMS_MVIEW.REFRESH('mv1', 'c', 8);Do not explicitly specify the refresh parallelism. The refresh parallelism is 5, which is the value of the session variable.
CALL DBMS_MVIEW.REFRESH('mv1', 'c');
Automatic refresh of materialized views
When you create a materialized view, if you specify the START WITH datetime_expr and NEXT datetime_expr clauses, the system automatically creates a background refresh task for the materialized view when the specified conditions are met.
Parallelism for automatic refresh of materialized views
You can specify the parallelism for the automatic refresh of materialized views in the following two ways:
Note
The following parallelism settings are listed in order of decreasing priority.
Specify the parallelism (Table DOP) when you create the materialized view.
Here is an example:
CREATE MATERIALIZED VIEW mv_t1 PARALLEL 8 REFRESH COMPLETE ON DEMAND START WITH current_date NEXT current_date + INTERVAL '10' SECOND AS SELECT c1, c2 FROM t1;Set the global session variable
mview_refresh_dopas the refresh parallelism.Automatic refresh operations are performed using internal sessions. To enable parallel refresh for background sessions, you must set the global-level mview_refresh_dop variable.
Notice
If you do not explicitly specify the parallelism when you create the materialized view and the
mview_refresh_dopvariable is set to 0 or 1, parallel refresh is not enabled for the background refresh task.Here is an example:
Set the global session parallelism to 5.
SET GLOBAL mview_refresh_dop = 5;Create a materialized view:
If you specify the parallelism as 8 when you create the materialized view, the background refresh task will use 8 as the refresh parallelism.
CREATE MATERIALIZED VIEW mv1_t1 PARALLEL 8 REFRESH COMPLETE ON DEMAND START WITH current_date NEXT current_date + INTERVAL '10' SECOND AS SELECT c1, c2 FROM t1;If you do not specify the parallelism when you create the materialized view, the background refresh task will use the value of the
mview_refresh_dopvariable, which is 5, as the refresh parallelism.CREATE MATERIALIZED VIEW mv2_t1 REFRESH COMPLETE ON DEMAND START WITH current_date NEXT current_date + INTERVAL '10' SECOND AS SELECT c1, c2 FROM t1;
Refresh nested materialized views
Note
OceanBase Database allows you to create nested materialized views based on materialized views without a primary key.
Notice
Real-time materialized views cannot be created as nested materialized views. In other words, you cannot specify the ENABLE ON QUERY COMPUTATION clause when you create a nested materialized view.
Refresh rules for nested materialized views
The refresh methods supported by nested materialized views are the same as those supported by non-nested materialized views. Both types of materialized views support full refresh and incremental refresh. Although refreshing a nested materialized view only requires the user tables and materialized views (along with their mlogs) that it directly depends on, the data consistency of a nested materialized view depends on the materialized views it is based on. This means that if you want to refresh a nested materialized view to keep its data up to date, you must first refresh the materialized views it depends on to ensure their data is up to date.
For example, consider the following scenario: Materialized view mv1 is built on tables tbl1 and tbl2, materialized view mv2 is built on materialized view mv1 and table tbl3, and materialized view mv3 is built on materialized views mv1 and mv2. If you refresh mv1, then mv2, and finally mv3, you can ensure the overall data consistency of the nested materialized views. However, if you refresh mv2 first and then mv1, the data in mv2 will not be up to date (it will lag behind mv1). Similarly, if you refresh mv3 first and then mv2, the data in mv3 will not be up to date (it will lag behind mv2).

OceanBase Database supports cascading refreshes for nested materialized views. Cascading refreshes can be either cascading non-consistent refreshes or cascading consistent refreshes:
Cascading non-consistent refresh: This method refreshes all materialized views that the nested materialized view depends on, starting from the bottom. Each materialized view is refreshed without data consistency guarantees, and the data points read from the base tables may not be consistent. Cascading non-consistent refreshes are suitable for batch synchronization scenarios, such as when a business party periodically synchronizes data from the upstream source. After the data synchronization is complete, a cascading non-consistent refresh can be performed to ensure the final consistency of the materialized views.
Cascading consistent refresh: This method ensures that, after the entire cascading refresh is completed, all base tables that the upper-level materialized views depend on are consistent in their data points. Cascading consistent refreshes are suitable for real-time data synchronization scenarios. We ensure that, after each cascading refresh, the data snapshots in the materialized views are at the same data point.
Example of nested materialized view refresh
If a materialized view is fully refreshed, any dependent materialized views must be fully refreshed before they can be incrementally refreshed. Otherwise, an error will occur.
Here is an example:
Create a table
tbl1and insert a row of data.CREATE TABLE tbl1(id INT, name VARCHAR2(30), PRIMARY KEY(id));INSERT INTO tbl1 VALUES (1, 'jack');Create a table
tbl2and insert a row of data.CREATE TABLE tbl2(id INT, age INT, PRIMARY KEY(id));INSERT INTO tbl2 VALUES (1, 21);Create a materialized view log on the
tbl1andtbl2tables.CREATE MATERIALIZED VIEW LOG ON tbl1 WITH PRIMARY KEY (name) INCLUDING NEW VALUES;CREATE MATERIALIZED VIEW LOG ON tbl2 WITH PRIMARY KEY (age) INCLUDING NEW VALUES;Create a materialized view
mv1based on thetbl1andtbl2tables.CREATE MATERIALIZED VIEW mv1 (PRIMARY KEY (id1, id2)) REFRESH FAST ON DEMAND AS SELECT tbl1.id id1, tbl2.id id2, tbl1.NAME, tbl2.AGE FROM tbl1, tbl2 WHERE tbl1.id = tbl2.id;Create a materialized view log on the
mv1materialized view.CREATE MATERIALIZED VIEW LOG ON mv1 WITH PRIMARY KEY (name, age) INCLUDING NEW VALUES;Create a materialized view (nested materialized view)
mv2based on themv1materialized view.CREATE MATERIALIZED VIEW mv2 REFRESH FAST AS SELECT COUNT(*) cnt, COUNT(AGE) age_cnt, SUM(AGE) age_sum FROM mv1;Query the data of the
mv1materialized view.SELECT * FROM mv1;The returned result is as follows:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | +------+------+------+------+ 1 row in setQuery the data of the
mv2materialized view.SELECT * FROM mv2;The returned result is as follows:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 1 | 1 | 21 | +------+---------+---------+ 1 row in setInsert a row of data into the
tbl1andtbl2tables.INSERT INTO tbl1 VALUES (2, 'rose');INSERT INTO tbl2 VALUES (2, 19);Incrementally refresh the
mv1materialized view.CALL dbms_mview.refresh('mv1', 'f');Query the data of the
mv1materialized view.SELECT * FROM mv1;The returned result is as follows:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | | 2 | 2 | rose | 19 | +------+------+------+------+ 2 rows in setIncrementally refresh the
mv2materialized view.CALL dbms_mview.refresh('mv2', 'f');Query the data of the
mv2materialized view.SELECT * FROM mv2;The returned result is as follows:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 2 | 2 | 40 | +------+---------+---------+ 1 row in setInsert a row of data into the
tbl1andtbl2tables.INSERT INTO tbl1 VALUES (3, 'mary');INSERT INTO tbl2 VALUES (3, 25);Fully refresh the
mv1materialized view.CALL dbms_mview.refresh('mv1', 'c');Query the data of the
mv1materialized view.SELECT * FROM mv1;The returned result is as follows:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | | 2 | 2 | rose | 19 | | 3 | 3 | mary | 25 | +------+------+------+------+ 3 rows in setIncrementally refresh the
mv2materialized view.CALL dbms_mview.refresh('mv2', 'f');The returned result is as follows:
OBE-12052: cannot fast refresh materialized view at package body oceanbase.DBMS_MVIEW.DO_REFRESH , line : 54, col : 1 at oceanbase.DBMS_MVIEW.REFRESH , line : 72, col : 1Notice
Since
mv1has been fully refreshed, directly incrementally refreshingmv2will result in an error. A full refresh is required before incremental refresh.Query the data of the
mv2materialized view.SELECT * FROM mv2;The returned result is as follows:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 2 | 2 | 40 | +------+---------+---------+ 1 row in setFully refresh the
mv2materialized view.CALL dbms_mview.refresh('mv2', 'c');Query the data of the
mv2materialized view.SELECT * FROM mv2;The returned result is as follows:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 3 | 3 | 65 | +------+---------+---------+ 1 row in set
Refresh statistics of materialized views
OceanBase Database can collect and store statistics of materialized view refresh operations. These statistics can be queried through specific views. The statistics of current and historical materialized view refresh operations are stored in the database. By analyzing the historical statistics of materialized view refreshes, you can understand and analyze the performance of materialized view refreshes in the database.
The statistics of materialized view refreshes serve the following purposes:
Reporting: Provides an overview of current and historical statistics of materialized view refresh operations, including the actual time required for each refresh, to help you track and monitor refresh performance.
Diagnostics: Allows you to analyze the performance of materialized view refreshes based on detailed current and historical statistics. For example, if a materialized view refresh takes a long time, the statistics can help you identify whether the performance degradation is due to increased system load or a larger volume of data changes.
Collect statistics of materialized views
You can collect statistics of materialized views by using the analyze table or call dbms_stats.gather_table_stats('database_name', 'table_name') statement.
For more information about how to collect statistics of tables and columns, see GATHER_TABLE_STATS.
For more information about how to manage the collection and retention of statistics of materialized view refresh operations, see DBMS_MVIEW_STATS Overview.
Show materialized view refresh information
| View Name | Description |
|---|---|
| ALL_MVIEWS | Displays materialized view information. |
| DBA_MVREF_STATS_SYS_DEFAULTS | System-wide default values for materialized view refresh statistics. |
| DBA_MVREF_STATS_PARAMS | Displays refresh statistics attributes associated with each materialized view. |
| DBA_MVREF_RUN_STATS | Displays information about each materialized view refresh run, identified by REFRESH_ID. |
| DBA_MVREF_STATS | Displays basic timing statistics for materialized view refreshes. |
| DBA_MVREF_CHANGE_STATS | Displays statistics related to materialized view refreshes. |
| DBA_MVREF_STMT_STATS | Displays information associated with refresh statements. |
| DBA_SCHEDULER_JOBS | Displays information about all scheduler jobs in the database. |