Updating data in base tables may result in data inconsistency between the base tables and the materialized views. To resolve this issue, OceanBase Database automatically refreshes the materialized views. Refreshing a materialized view also automatically updates all its indexes.
Refreshes of materialized views are performed serially while object locks are used to protect data consistency. OceanBase Database does not lock base tables during materialized view refreshes to enhance concurrency.
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.
Refresh methods
Complete refresh
Prerequisites
A complete refresh is possible if the data types of all columns in the source table are compatible with those in the materialized view. Otherwise, the complete refresh cannot be performed.
Refresh method
OceanBase Database performs a complete refresh through remote refresh. Specifically, it creates a hidden table, executes the refresh statement on the hidden table, and then switches the hidden table with the source table. Therefore, a complete refresh requires additional space and will fully rebuild the index (if any).
Note
Incremental refreshes
Notice
- The
REFRESH FASTmethod uses records in mlogs to determine the data that needs to be incrementally refreshed. Therefore, you must create mlogs (mlogs) for the base tables before you create the materialized views. - Columns used for incremental refreshing of materialized views must exist in the mlogs.
Basic requirements for incremental refreshes of single tables
The
MAXandMINaggregate functions are not supported.Complex scenarios such as inline views,
UNION, and subqueries are not supported.Expressions that generate unstable output values, such as
ROWNUMandRAND, are not supported.The
ROLLUPandHAVINGclauses are not supported.The
ORDER BYclause is not supported.Window functions are not supported.
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 (Scalar Aggregate) statement.For materialized views in the
GROUP BYscenario, only aggregate functions such asSUMandCOUNTare supported, and only simple columns can be used in the aggregate functions. TheGROUP BYclause must meet the following requirements:- 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 are supported, and the following aggregate functions are currently not supported:MINandMAX.
Aggregate function SELECT clause must contain a dependency column 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 method may change, which may result in precision loss.) SUM (col1),COUNT(col1) - The
Basic requirements for incremental refreshes of simple join queries across multiple tables
- The
FROMtable must be a base table and cannot be an inline view, view, or materialized view. - The
FROMtable must contain at least two tables connected by inner joins. The number of tables connected must be less than or equal to 5. - The
FROMtable must have a primary key, and the primary key must be output in theSELECTclause. - Mlogs must be created for the
FROMtable, and the columns used in the view must be included in the mlogs. - The view definition must not contain subqueries.
- The view definition must not contain the
GROUP BY,ROLLUP,HAVING,WINDOW FUNCTION,DISTINCT,ORDER BY,LIMIT, orFETCHclause. It must be a simple join query (SPJ query). - The view definition must not contain expressions that generate unstable output values, such as
ROWNUM,RAND, andSYSDATE.
Incremental refreshes
Create a table named
test_tbl1.CREATE TABLE test_tbl1 (col1 NUMBER PRIMARY KEY, col2 NUMBER, col3 NUMBER, col4 NUMBER);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 the incremental refresh method.
Create a materialized view named
mv1_test_tbl1. Set the refresh method of the materialized view to incremental and specify that an incremental refresh can be manually triggered 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 of 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 and specify that an incremental refresh can be manually triggered when needed; the query part of the materialized view calculates the aggregate results ofcount(*),count(col3), andsum(col3)based on all columns of 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 and specify that an incremental refresh can be manually triggered when needed; the query part of the materialized view calculates the results ofcount(col3)andsum(col3)based on all columns of 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 and specify that an incremental refresh can be manually triggered when needed; the query part of the materialized view returns thecol2andcol3columns from thetest_tbl1table, and calculates the aggregate results ofcount(*),count(col3), andsum(col3)based on the values of 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 and specify that an incremental refresh can be manually triggered when needed; the query part of the materialized view returns thecol2column from thetest_tbl1table, and calculates the aggregate results ofcount(*),count(col3),sum(col3), andavg(col3), as well as the values of some custom columnscalcol1andcalcol2, based on the values of 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 and specify that an incremental refresh can be manually triggered when needed; the query part of the materialized view returns 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 values of 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;
Incremental refreshes of multi-table materialized views
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 the
mv1_t1_t2materialized view that incrementally refreshes the join result 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;
Manually refresh a materialized view
If the refresh mode of the materialized view is ON DEMAND, you can manually refresh the materialized view by using the DBMS_MVIEW package.
Note
Only the owner of the materialized view and the tenant administrator have the privilege to perform a refresh operation.
Refresh a materialized view by using the REFRESH statement
DBMS_MVIEW.REFRESH (
list IN VARCHAR2, -- The name of the materialized view. Multiple materialized views are not supported.
method IN VARCHAR2 := 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.
----------- The following parameters are not supported. They are provided for Oracle compatibility. ----------------
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 := 1); -- The degree of parallelism for refreshing the materialized view. This parameter is specific to OceanBase Database.
Here is an example:
Insert
3records into thetest_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 by 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 | +------+------+----------+----------+ | 3 | 1 | 1 | 3 | | 2 | 1 | 1 | 2 | | 1 | 1 | 1 | 1 | +------+------+----------+----------+ 3 rows in set
Set the degree of parallelism
You can specify the refresh_parallel parameter to set the degree of parallelism for the refresh. Currently, this parameter applies only to complete refreshes and has no effect on incremental refreshes.
Here is an example:
Refresh the materialized view while specifying the degree of parallelism.
CALL DBMS_MVIEW.REFRESH('mv3', refresh_parallel => 8);
Automatic refresh of 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 generated 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 only for complete refreshes and not for incremental refreshes.
- The following examples of SQL statements are provided for reference only. They do not execute.
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 execution.
ALTER SESSION ENABLE PARALLEL DDL;Set the value of parallel DDL execution.
ALTER SESSION FORCE PARALLEL DDL PARALLEL 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 from 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 refresh operations, both current and historical, to help you track and monitor refresh performance.
Diagnosis: current and historical statistics are available for in-depth analysis of refresh performance. For example, if a materialized view 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') statement 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 |
|---|---|
| ALL_MVIEWS | Displays information about materialized views. |
| DBA_MVREF_STATS_SYS_DEFAULTS | System-level default values for historical statistics attributes of materialized view refreshes. |
| DBA_MVREF_STATS_PARAMS | Displays 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 about materialized view refreshes. |
| DBA_MVREF_CHANGE_STATS | Displays statistics about materialized view refreshes. |
| DBA_MVREF_STMT_STATS | Displays information about refresh statements. |