Updating data in the base table can cause the data of the materialized view to be inconsistent with that of the base table. To maintain the consistency of the data of the materialized view, OceanBase Database automatically refreshes the materialized view. Refreshing a materialized view also updates all its indexes automatically.
Refresh mode (specifies when to refresh)
You can use the ON DEMAND clause to specify that a materialized view be refreshed when data is needed.
You can manually refresh a materialized view by using the DBMS_MVIEW package, or you can specify the START WITH ... NEXT ... clause when you create a materialized view to have it automatically refreshed on a scheduled basis.
For more information about the DBMS_MVIEW package, see Overview of DBMS_MVIEW.
Full refresh
Refresh conditions
The base table columns and the corresponding mlog columns of the materialized view must have the same type. If they do not have the same type, the materialized view cannot be fully refreshed.
Refresh methods
OceanBase Database uses remote refreshes to refresh all data. A hidden table is created, and the refresh statements are executed on the hidden table. Then, the original table is switched with the hidden table. Therefore, full refreshes require additional space and fully rebuild the indexes (if any) on the table.
Note
Full refreshes can be time-consuming. Especially when a large amount of data is read and processed. Therefore, before you perform a full refresh, you should always consider the time required for the full refresh.
Incremental refreshes
Notice
- The
REFRESH FASTmethod uses records in mlogs to determine the data that needs to be incrementally refreshed. Therefore, to incrementally refresh a materialized view, you must create mlogs for the base table before creating the materialized view. - All columns used in an incremental refresh of a materialized view must be in the mlog.
At present, incremental refreshes support SQL statements that aggregate data in a single table, join multiple tables, and aggregate data in multiple joined tables. Incremental refreshes are not supported for other SQL statements. For more information, see the requirements for incremental refresh SQL statements.
Basic requirements for incremental refreshes of single-table aggregates
The incremental refresh does not support the
MAXandMINaggregate functions.The incremental refresh does not support complex scenarios such as inline views,
UNION, and subqueries.The incremental refresh does not support expressions with unstable output values, such as
ROWNUMandRAND.The incremental refresh does not support
ROLLUPorHAVING.The incremental refresh does not support
ORDER BY.The incremental refresh does not support window functions.
If the query contains the
DISTINCTkeyword, the output column of the materialized view that supports incremental refreshes must be unique. In this case, you can either disable theDISTINCTkeyword or remove it.A statement without the
GROUP BYclause must be a scalar aggregate (SA) statement.For materialized views in
GROUP BYscenarios, only aggregate functions such asSUMandCOUNTare supported, and only simple columns can be used in these aggregate functions. The requirements for theGROUP BYclause are as follows:- The
GROUP BYclause must be in the standardGROUP BYsyntax and cannot containROLLUPorHAVING. - The
SELECTclause must contain all theGROUP BYcolumns. - The aggregate functions cannot contain the
DISTINCTkeyword, and the parameters of the aggregate functions must be basic columns. - The
SELECTclause must containCOUNT(*). Other aggregate functions supported and other requirements are as follows. At present, theMINandMAXfunctions are not supported.
Aggregate functionSELECT clause must contain the following dependent columnCOUNT( expr ) N/A SUM ( expr ) COUNT( expr ) or an expr that 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 divided into SUM and COUNT... (The calculation method may change, which may result in a loss of precision.) SUM (col1),COUNT(col1) - The
Single-table aggregate incremental refreshes
Create a table named
test_tbl1.CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT, col4 INT);Create an mlog on the
test_tbl1table.CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE (col2, col3) INCLUDING NEW VALUES;Create materialized views with incremental refreshes.
Create a materialized view named
mv1_test_tbl1. Set the refresh method of the materialized view to incremental refresh. You can manually trigger a refresh when needed. The query part of the materialized view returns thecol2column from thetest_tbl1table and calculates the aggregate results ofcount(*),count(col3), andsum(col3)based on 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 of the materialized view to incremental refresh. You can manually trigger a refresh when needed. The query part of the materialized view calculates the aggregate results ofcount(*),count(col3), andsum(col3)based on the data in 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 of the materialized view to incremental refresh. You can manually trigger a refresh when needed. The query part of the materialized view calculates the results ofcount(col3)andsum(col3)based on the data in 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 of the materialized view to incremental refresh. You can manually trigger a refresh when needed. The query part of the materialized view selects thecol2andcol3columns from thetest_tbl1table, and calculates the aggregate results ofcount(*),count(col3), andsum(col3)based on 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 of the materialized view to incremental refresh. You can manually trigger a refresh when 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). It also calculates some custom columnscalcol1andcalcol2based on the data 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 of the materialized view to incremental refresh. You can manually trigger a refresh when 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)based on the data 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;
Basic requirements for incremental refreshes of multi-table joins
- The
FROMtable must be a base table and cannot be an inline view, a view, or a materialized view. - The
FROMtable must contain at least two tables connected by inner joins. - The
FROMtable must have a primary key, and the primary key must be output in theSELECTclause. - An mlog must be created for the
FROMtable, and the columns used in the view must be included in the mlog. - 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 use unstable output values such as
ROWNUM,RAND, andSYSDATE.
Perform incremental refreshes on a materialized view that contains multiple tables
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 mlogs 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 that performs incremental refreshes on the join result of tables
t1andt2.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 ensure the performance of simple join materialized views during incremental refreshes and real-time materialization, we recommend that you create indexes on the following tables:
- Each table, especially the join key, to improve the performance of table joins during incremental updates and in real-time materialized views.
- The primary key columns of the base tables in the materialized view.
- The incremental refresh performance of a materialized view and the query performance of real-time materialization usually deteriorate as the number of
JOINtables in the materialized view increases.
Here is an example of creating indexes on the tables that a materialized view depends on:
(Optional) Execute the following statements to drop the related test data.
If the following database objects do not exist, skip this step.
DROP MATERIALIZED VIEW LOG ON t1; DROP TABLE IF EXISTS t1; DROP MATERIALIZED VIEW LOG ON t2; DROP TABLE IF EXISTS t2; DROP MATERIALIZED VIEW rt_mv1;Execute the following statement to create a table named
t1and an index namedidx_t1_c2.CREATE TABLE t1(c1 INT PRIMARY KEY AUTO_INCREMENT, c2 INT, c3 INT, c4 INT, c5 INT); CREATE INDEX idx_t1_c2 ON t1(c2);Execute the following statement to create a table named
t2and an index namedidx_t2_c3.CREATE TABLE t2(c1 INT PRIMARY KEY AUTO_INCREMENT, c2 INT, c3 INT, c4 INT, c5 INT); CREATE INDEX idx_t2_c3 ON t2(c3);Execute the following statements to create mlogs on the
t1andt2tables.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 named
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);
Basic requirements
The basic requirements for aggregate incremental refreshes of multiple tables are the union of the [basic requirements for aggregate incremental refreshes of single tables](#Single-table aggregate incremental refreshes) and the [basic requirements for join-based incremental refreshes](#Multi-table join-based incremental refreshes).
Example of aggregate incremental refreshes of multiple tables
Create base tables named
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 mlogs for 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 named
mv1_t3_t4for aggregate incremental refreshes of 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;
Manually refresh a materialized view
When the refresh mode of a materialized view is ON DEMAND, you can use the DBMS_MVIEW package to manually refresh the materialized view.
Note
Only the owner of the materialized view and the tenant administrator have the privilege to perform refresh operations.
Refresh a materialized view using the REFRESH procedure
DBMS_MVIEW.REFRESH (
IN mv_name VARCHAR(65535), -- The name of the materialized view.
IN method VARCHAR(65535) DEFAULT NULL, -- The refresh options.
-- f specifies to perform fast refreshes.
-- ? specifies to perform forcible refreshes.
-- C|c specifies to perform complete refreshes.
-- A|a specifies to always perform refreshes, which is equivalent to C.
IN refresh_parallel INT DEFAULT 1); -- The degree of parallelism of the refresh.
Here is an example:
Insert three records into the
test_tbl1table.INSERT INTO test_tbl1 VALUES (1, 1, 1, 1),(2, 2, 2, 2),(3, 3, 3, 3);Query the
mv1_test_tbl1materialized view.SELECT * FROM mv1_test_tbl1;The return result is as follows:
Empty setManually refresh the
mv1_test_tbl1materialized view using theDBMS_MVIEW.REFRESHprocedure.CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1');Query the
mv1_test_tbl1materialized view again.SELECT * FROM mv1_test_tbl1;The return result is as follows:
+------+------+----------+----------+ | col2 | cnt | cnt_col3 | sum_col3 | +------+------+----------+----------+ | 1 | 1 | 1 | 1 | | 2 | 1 | 1 | 2 | | 3 | 1 | 1 | 3 | +------+------+----------+----------+ 3 rows in set
Degree of parallelism
You can set the refresh_parallel parameter to specify the degree of parallelism of this refresh. Currently, this parameter applies only to complete refreshes and has no effect on incremental refreshes.
Here is an example:
Refresh a materialized view in parallel.
CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1', refresh_parallel => 8);
Automatically refresh materialized views
If you specify the START WITH datetime_expr and NEXT datetime_expr clauses when you create a materialized view, an automatic refresh task is created for the materialized view in the background.
Degree of parallelism
When the system automatically refreshes a materialized view in the background, you can specify the degree of parallelism in the following three ways:
Note
- The specified degree of parallelism takes effect for full refreshes only. Incremental refreshes are not affected.
- The following examples of SQL statements are provided for reference only. They cannot be executed.
Specify the degree of parallelism in the hint.
Here is an example:
CREATE /*+ parallel(8) */ MATERIALIZED VIEW ...Specify the degree of parallelism in the session variables of the DDL statement.
Here is an example:
Enable parallel DDL.
At the system level:
SET _ENABLE_PARALLEL_DDL = 1;At the session level:
SET SESSION _ENABLE_PARALLEL_DDL = 1;Set the value of the degree of parallelism.
At the system level:
SET _FORCE_PARALLEL_DDL_DOP = 8;At the session level:
SET SESSION _FORCE_PARALLEL_DDL_DOP = 8;
Specify the degree of parallelism when you create a materialized view (table DOP).
Here is an example:
CREATE MATERIALIZED VIEW xxx PARALLEL 8 ...
Statistics on materialized view refreshes
OceanBase Database can collect and store statistics on materialized view refresh operations. These statistics can be queried through specific views. Current and historical statistics on materialized view refresh operations are stored in the database. You can analyze the historical statistics on materialized view refreshes to understand the refresh performance in the database.
The statistics on materialized view refreshes serve the following purposes:
Reporting: provides a summary of the actual execution time of refreshes, both current and historical, to help you track and monitor refresh performance.
Diagnosis: through current and historical statistics, you can analyze and optimize refresh performance. For example, if a refresh takes a long time, statistics can help you determine whether the performance degradation is caused by increased system load or data change volume.
Statistics collection for materialized views
Statistics are collected for materialized views. You can execute the analyze table statement or the call dbms_stats.gather_table_stats('database_name', 'table_name') procedure to collect statistics.
For more information about how to collect statistics on tables and columns, see GATHER_TABLE_STATS.
For more information about how to collect statistics on materialized view refreshes, see DBMS_MVIEW_STATS overview.
Views displaying materialized view refresh information
View name |
Description |
|---|---|
| DBA_MVIEWS | Displays information about materialized views. |
| DBA_MVREF_STATS_SYS_DEFAULTS | System-level default values of statistics attributes for materialized view refreshes. |
| DBA_MVREF_STATS_PARAMS | Displays the refresh statistics attributes associated with each materialized view. |
| DBA_MVREF_RUN_STATS | Displays information about each refresh of materialized views. Each refresh is identified by the REFRESH_ID attribute. |
| DBA_MVREF_STATS | Displays basic timing statistics of materialized view refreshes. |
| DBA_MVREF_CHANGE_STATS | Displays statistics related to materialized view refreshes. |
| DBA_MVREF_STMT_STATS | Displays information about refresh statements. |
