ベーステーブルのデータを更新すると、マテリアライズドビューのデータとベーステーブルのデータが一致しなくなる可能性があります。このため、OceanBaseデータベースはマテリアライズドビューのデータを維持するために、マテリアライズドビューをフラッシュすることで対応します。
OceanBaseデータベースがサポートするマテリアライズドビューのフラッシュ戦略には、完全フラッシュと増分フラッシュがあり、手動スケジュールと自動スケジュールもサポートされています。
説明
マテリアライズドビューをフラッシュすると、そのすべてのインデックスも自動的に更新されます。
フル更新
OceanBaseデータベースでは、リモート更新方式によるフル更新が行われます。具体的には、隠れたテーブルを作成し、その隠れたテーブルに対して更新ステートメントを実行した後、元のテーブルと隠れたテーブルを切り替えます。そのため、フル更新操作には追加のスペースが必要であり、インデックス(存在する場合)も完全に再構築されます。
フル更新の注意点
- フル更新は非常に時間のかかるプロセスになる可能性があります。特に大量のデータを読み取り処理する必要がある場合に顕著です。そのため、フル更新を実行する前に、フル更新に必要な時間を常に考慮する必要があります。
- 現在のベーステーブルの列とマテリアライズドビューに対応する列の型が一致している場合、フル更新の条件を満たします。一致しない場合は、フル更新を実行することができません。
- あるマテリアライズドビューがフル更新された場合、それに依存するマテリアライズドビュー(ネストされたマテリアライズドビュー)は、その後の増分更新を行う前に必ず一度フル更新を行わなければなりません。そうでない場合、エラーが報告されます。
増分更新
現在、増分更新がサポートされているマテリアライズドビューは、単一テーブルの非集計、単一テーブルの集計、複数テーブルの関連付け、複数テーブルの関連付け集計、および集合クエリ(UNION ALL)のSQL文です。これら5つのシナリオに該当しないSQL文については、現時点では増分更新がサポートされていません。増分更新を行うためのSQL文の要件については、以下の説明を参照してください。
注意
REFRESH FASTは、マテリアライズドビューログ内のレコード情報を使用して、増分更新が必要な内容を決定するため、増分更新でマテリアライズドビューを更新する場合は、マテリアライズドビューを作成する前に、ベーステーブルのマテリアライズドビューログ(mlog)を作成する必要があります。- mlogの作成方法については、マテリアライズドビューログを参照してください。V4.3.5バージョンについては、V4.3.5 BP4バージョンからマテリアライズドビューログの自動管理機能がサポートされています。mlogの自動管理を有効にすると、増分更新用マテリアライズドビューを作成する前に、ユーザーがベーステーブルのmlogを作成する必要はなくなります。OceanBaseデータベースは、対応するmlogを自動的に作成するか、既存のmlogテーブル定義を更新して、新しいマテリアライズドビューに依存する列を含めます。詳細については、マテリアライズドビューログの自動管理を参照してください。
- 増分更新で使用される列はすべてmlogに含まれていなければなりません。
単一テーブルの非集約型増分更新
説明
OceanBaseデータベースV4.3.5では、マテリアライズドビューの増分更新はV4.3.5 BP3バージョンから単一テーブルの非集約型シナリオをサポートしています。
単一テーブルの非集約型増分更新の例
テーブル
tbl1を作成します。CREATE TABLE tbl1 (col1 NUMBER PRIMARY KEY, col2 NUMBER, col3 NUMBER, col4 NUMBER);tbl1テーブルにマテリアライズドビューログを作成します。CREATE MATERIALIZED VIEW LOG ON tbl1 WITH SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;テーブル
tbl1に基づいて、増分更新用のマテリアライズドビューmv_tbl1を作成します。CREATE MATERIALIZED VIEW mv_tbl1 REFRESH FAST ON DEMAND AS SELECT col1, col2 FROM tbl1;
単一テーブルの集計増分更新
単一テーブルの集計増分更新には、基本的に以下の要件があります:
FROMテーブルは基準テーブルでなければならず、内部ビュー、通常のビューなどでは使用できません。説明
ネストされたマテリアライズドビューはリアルタイムマテリアライズドビューをサポートしていないため、
FROMテーブルがマテリアライズドビューの場合、リアルタイムマテリアライズドビューを使用することはできません。FROMテーブルには1つのテーブルしか存在しません。FROMテーブルにmlogが作成されており、ビューで使用される列はすべてmlogに存在します。ビュー定義にサブクエリは含まれません。
ウィンドウ関数はサポートされていません。
ビュー定義に
ROLLUP、HAVING、DISTINCT、ORDER BY、LIMIT、FETCHなどの句は含まれません。クエリに
DISTINCTが含まれている場合、増分更新可能なマテリアライズドビューの出力列は一意である必要があるため、このような場合はDISTINCTの使用を直接禁止するか、削除する必要があります。GROUP BYを伴わないステートメントはスカラーアグリゲーション(Scalar Aggregate)でなければなりません。GROUP BYシナリオのマテリアライズドビューでは、SUMおよびCOUNTなどの集計関数がサポートされており、集計関数では単純な列のみを使用できます。GROUP BYの要件は以下のとおりです:集計関数 SELECT句には必ず依存する列を含める必要があります COUNT( expr ) N/A SUM ( expr ) COUNT( expr ) または expr が 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 ) その他、SUMおよびCOUNTに分割可能な集計関数... (計算方法の変更により、精度に影響を与える可能性があります) SUM (col1),COUNT(col1) MAX(expr)/MIN(expr) 説明
V4.3.5バージョンでは、V4.3.5 BP4バージョンから
MAXとMINの集計増分更新がサポートされています。COUNT(expr) GROUP BY句は標準のGROUP BY構文でなければならず、ROLLUPおよびHAVINGはサポートされていません。SELECT句にはすべてのGROUP BY列が含まれていなければなりません。- 集計関数には
DISTINCTキーワードが含まれていません。 SELECT句には集計関数の列に加えて、対応する集計関数の依存列とCOUNT(*)列も含まれていなければなりません。例えば、集計関数SUM(expr)を使用する場合は、COUNT(*)およびCOUNT(expr)列も含める必要があります。
MIN/MAX集計増分更新条件:
注意
MIN/MAX 関数を使用するマテリアライズド・ビューは、リアルタイム・マテリアライズド・ビューをサポートしていません。
上記の単一テーブル集約増分更新の基本要件を満たす場合、MAX および MIN 集約関数を使用する際の要件:マテリアライズド・ビューのベーステーブル上に、GROUP BY 列をプレフィックスとするインデックスが存在すること。
説明
OceanBase データベース V4.3.5 バージョンについて、V4.3.5 BP5 以降では、MIN/MAX 集約関数の引数に非基本列を使用でき、GROUP BY 列でも非基本列を使用することが可能です。
単一テーブルの集計増分更新の例
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 (col1 NUMBER PRIMARY KEY, col2 NUMBER, col3 NUMBER, col4 NUMBER);test_tbl1テーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE (col2, col3, col4) INCLUDING NEW VALUES;更新方法が増分更新であるマテリアライズドビューを作成します。
mv1_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcol2列を選択し、count(*)、count(col3)、sum(col3)の集計結果を計算し、グループ化の基準はcol2列の値です。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;mv2_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcount(*)、count(col3)、sum(col3)の集計結果を計算します。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;mv3_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcount(col3)とsum(col3)の結果を計算します。CREATE MATERIALIZED VIEW mv3_test_tbl1 REFRESH FAST ON DEMAND AS SELECT count(col3) cnt_col3, sum(col3) sum_col3 FROM test_tbl1;mv4_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcol2とcol3列を選択し、count(*)、count(col3)、sum(col3)の集計結果を計算し、col2とcol3をグループ化の基準とします。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;mv5_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcol2列を選択し、count(*)、count(col3)、sum(col3)、avg(col3)などの集計結果を計算すると同時に、カスタム列calcol1とcalcol2も計算し、グループ化の基準はcol2列の値です。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;mv6_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcol2列を選択し、count(*)、count(col3)、sum(col3)、count(col3*col3)、sum(col3*col3)、STDDEV(col3)の集計結果を計算し、グループ化の基準はcol2列の値です。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;集計関数
MAXとMINを使用してマテリアライズドビューを作成します。テーブル
test_tbl1にcol1とcol2列に基づいてidx_test_tbl1という名前のインデックスを作成します。CREATE INDEX idx_test_tbl1 ON test_tbl1(col1, col2);mv7_test_tbl1という名前のマテリアライズドビューを作成します。マテリアライズドビューの更新方法を増分更新に指定し、必要に応じて手動で更新操作をトリガーできます。マテリアライズドビューのクエリ部分は、テーブルtest_tbl1からcol1とcol2列を選択し、count(*)、各グループ内のcol3の最小値とcol4の最大値の合計を計算し、col1とcol2の組み合わせに基づいてデータをグループ化します。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;
GROUP BYで非基本列を使用する場合。テーブル
m_tbl1を作成する。obclient> CREATE TABLE m_tbl1(col1 NUMBER PRIMARY KEY, col2 DATE, col3 NUMBER, col4 NUMBER, col5 NUMBER, col6 NUMBER);テーブル
m_tbl1上にマテリアライズド・ビュー・ログを作成する。obclient> CREATE MATERIALIZED VIEW LOG ON m_tbl1 WITH PRIMARY KEY, ROWID, SEQUENCE (col2, col3, col4, col5, col6) INCLUDING NEW VALUES;テーブル
m_tbl1上で、col3および(ROUND(col2))列に基づくidx1_m_tbl1という名前のインデックスを作成する。obclient> CREATE INDEX idx1_m_tbl1 ON m_tbl1(col3, (ROUND(col2)));単一テーブルの集約増分更新を行うマテリアライズド・ビュー
m_tbl1_mv1を作成する。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);
複数テーブル結合による増分更新
複数テーブル結合による増分更新の基本的な要件は以下のとおりです:
FROMテーブルは内部ビューであってはなりません。FROMテーブルには少なくとも2つのテーブルが含まれていなければなりません。説明
OceanBaseデータベースV4.3.5 BP3以降では、マテリアライズドビューの増分更新機能に、複数テーブル外部結合(
LEFT JOIN/RIGHT JOIN)のサポートが追加されました。外部結合の使用制限: 接続ツリーは、
INNER JOINが先でLEFT JOINが後の左深結合ツリーである必要があります。注意すべき点として、マテリアライズドビューの増分更新の
SELECT句にLEFT JOIN演算子が含まれている場合、作成時に主キー(PRIMARY KEY)または一意インデックス(UNIQUE INDEX)を指定することは禁止されています。これは、制約の競合による更新異常を防ぐためです。FROMテーブルにはmlogが作成され、ビューで使用される列はすべてmlogに存在していなければなりません。ビュー定義にサブクエリは存在しません。
ビュー定義に
ROLLUP、HAVING、WINDOW FUNCTION、DISTINCT、ORDER BY、LIMITおよびFETCHなどの句は存在しません。ビュー定義では、
ROWNUM、RANDおよびSYSDATEなどの不安定な出力値を持つ式を使用することはできません。
注意
OceanBase データベース V4.3.5 バージョンについて:
- V4.3.5 BP5 以前のバージョンでは、
FROMのテーブルには必ず主キーが存在し、かつ主キーがSELECTに出力される必要があります。 - V4.3.5 BP5 以降のバージョンでは、複数テーブルを結合した増分更新のマテリアライズド・ビューに対して、ベーステーブルに主キーが必要という要件が削除されました。
- 外部結合を含む集約マテリアライズド・ビューは、リアルタイム・マテリアライズド・ビューをサポートしていません。
複数テーブル結合による増分更新の例
ベーステーブル
t1とt2を作成します。CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT);CREATE TABLE t2(c1 INT PRIMARY KEY, c4 INT, c5 INT);テーブル
t1とテーブルt2にマテリアライズドビューのログを作成します。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;テーブル
t1とテーブルt2の結合による増分更新用のマテリアライズドビューmv1_t1_t2を作成します。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;
説明
- 単純結合マテリアライズドビューが増分更新およびリアルタイムマテリアライズドビューにおいて良好なパフォーマンスを得るため、マテリアライズドビューとその依存するベーステーブルに対して、以下の方法でインデックスを作成することを推奨します:
- 各テーブルの結合キーにインデックスを作成し、増分更新およびリアルタイムマテリアライズドビューにおけるテーブルの結合性能を向上させます。
- マテリアライズドビュー内の各ベーステーブルの主キー列にインデックスを作成します。
- マテリアライズドビュー内の
JOINテーブル数が増加するにつれて、マテリアライズドビューの増分更新性能およびリアルタイムマテリアライズドビューのクエリ性能は通常低下します。
マテリアライズドビューとその依存するベーステーブルにインデックスを作成する例:
(オプション) 以下のステートメントを使用して関連するテストデータを削除します。
以下のデータベースオブジェクトがない場合は、このステップをスキップできます。
DROP MATERIALIZED VIEW LOG ON t1; DROP TABLE t1; DROP MATERIALIZED VIEW LOG ON t2; DROP TABLE t2; DROP MATERIALIZED VIEW rt_mv1;以下のステートメントを使用して、テーブル
t1とインデックスidx_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);以下のステートメントを使用して、テーブル
t2とインデックスidx_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);以下のステートメントを使用して、
t1とt2テーブルにそれぞれマテリアライズドビューのログを作成します。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;以下のステートメントを使用して、リアルタイムマテリアライズドビュー
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;以下のステートメントを使用して、マテリアライズドビュー内の各ベーステーブルの主キー列にインデックスを作成します。
CREATE INDEX idx_mv_t1_c1 ON rt_mv1(t1_c1); CREATE INDEX idx_mv_t2_c1 ON rt_mv1(t2_c1);
複数テーブルの集計増分更新
複数テーブルの集計増分更新の基本的な要件は以下のとおりです:
複数テーブルの集計増分更新の基本的な要件は、上記の単一テーブルの集計増分更新および複数テーブル結合による増分更新の基本的な要件の和集合です。
外部結合を含む集約マテリアライズドビューの増分更新がサポートされています。外部結合に関する制限は非集約外部結合マテリアライズドビューと同じであり、集約部分に関する制限は内部結合を含むマテリアライズドビューと同じです。ただし、外部結合を含む集約マテリアライズドビューは
MIN/MAX集計関数やリアルタイムマテリアライズドビューをサポートしていません。説明
V4.3.5バージョンでは、V4.3.5 BP5バージョンから外部結合を含む集約マテリアライズドビューの増分更新がサポートされます。
複数テーブルの集計増分更新の例
ベーステーブル
t3とt4を作成します。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));テーブル
t3とテーブルt4にマテリアライズドビューログを作成します。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;テーブル
t3とテーブルt4の結合集計増分更新用のリアルタイムマテリアライズドビューmv1_t3_t4を作成します。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;
セットクエリによる増分更新
説明
OceanBaseデータベースV4.3.5では、マテリアライズドビューの増分更新はV4.3.5 BP3バージョンからセットクエリシナリオをサポートしています。
集合マテリアライズドビューは、UNION ALL セットクエリを使用した増分更新をサポートします。また、増分更新された集合マテリアライズドビューでは、結合されていないマテリアライズドビューを除き、すべての増分更新可能なマテリアライズドビューをセット内で使用できます。
セットクエリによる増分更新の基本的な要件は以下のとおりです:
セットクエリを含むマテリアライズドビューはリアルタイムマテリアライズドビューをサポートしません。
トップレベルのクエリは
UNION ALLであり、ビュー定義にはサブクエリが含まれず、ORDER BY/LIMIT/FETCHなどの句も存在しません。UNION ALLの各ブランチで同じ投影位置の出力列の型は同一でなければならず、サブブランチの列型をCASTによって強制的に統一することはサポートされていません。例えば、複数テーブル結合マテリアライズドビューでは、各結合テーブルの主キーが
SELECTに含まれている必要があり、これらのSELECT出力列にはUNION ALLによって追加のCASTが加えられてはなりません。UNION ALLの各ブランチで同じ投影位置に同じ型/値の異なる定数が存在する場合、定数は識別列として各ブランチを区別します。
セットクエリによる増分更新の例
ベーステーブル
ua_tbl1とua_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);テーブル
ua_tbl1とua_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;セットクエリによる増分更新を行うマテリアライズドビュー
mv_ua_tbl1_tbl2を作成します。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;
マテリアライズドビューの更新並列度制御メカニズム
OceanBaseデータベースは、マテリアライズドビューの更新並列度を制御する仕組みを提供しています。ユーザーが明示的に更新操作に並列度を指定した場合、その指定値が優先されます。並列度が明示的に指定されていない場合は、システム変数 mview_refresh_dop を設定することで、セッション上のシステム変数値に基づいてマテリアライズドビューを更新できます。
説明
OceanBaseデータベースV4.3.5では、変数 mview_refresh_dop はV4.3.5 BP1バージョンから導入されました。
mview_refresh_dopの設定
mview_refresh_dop は、OceanBaseデータベースにおけるシステム変数であり、マテリアライズドビューの更新操作におけるデフォルトの並列度を制御します。この値を適切に設定することで、更新効率を大幅に向上させ、データベースのパフォーマンスを最適化できます。
mview_refresh_dop を0または1に設定すると、並列更新機能を使用しないことを意味します。システム変数 mview_refresh_dop の詳細については、mview_refresh_dopを参照してください。
例:
現在のセッションの並列度を5に設定します。
SET mview_refresh_dop = 5;グローバルセッションの並列度を5に設定します。
SET GLOBAL mview_refresh_dop = 5;注意
グローバルレベルの変数の設定は現在のセッションには無効であり、再ログインして新しいセッションを確立した場合にのみ有効になります。
マテリアライズドビューの並列度情報を確認する
ビューDBA_MVIEWSを使用して、マテリアライズドビューに設定されたバックグラウンド更新の並列度を照会します。
説明
ビュー
DBA_MVIEWSでは、マテリアライズドビューに指定された並列度のみを確認できます。- フィールド
REFRESH_DOPが0以外の場合、マテリアライズドビューのバックグラウンド更新タスクはREFRESH_DOPに対応する並列度を使用します。 REFRESH_DOPが0の場合、グローバル(Global)レベルで設定されたmview_refresh_dopの値が使用されます。
例:
マテリアライズドビュー
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;マテリアライズドビュー
mv0_t1に設定されたバックグラウンド更新の並列度を確認します。SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM SYS.DBA_MVIEWS WHERE OWNER = 'SYS' AND MVIEW_NAME = 'MV0_T1';実行結果は次のとおりです:
+-------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +-------+------------+-------------+ | SYS | MV0_T1 | 0 | +-------+------------+-------------+ 1 row in setマテリアライズドビュー
mv0_t1の並列度を8に変更します。ALTER MATERIALIZED VIEW mv0_t1 PARALLEL 8;マテリアライズドビューに設定されたバックグラウンド更新の並列度を確認します。
SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM SYS.DBA_MVIEWS WHERE OWNER = 'SYS' AND MVIEW_NAME = 'MV0_T1';実行結果は次のとおりです:
+-------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +-------+------------+-------------+ | SYS | MV0_T1 | 8 | +-------+------------+-------------+ 1 row in set
- フィールド
ビューDBA_MVREF_RUN_STATSを使用して、マテリアライズドビューの履歴更新並列度を照会します。
例:
SELECT REFRESH_ID, MVIEWS, PARALLELISM FROM SYS.DBA_MVREF_RUN_STATS WHERE MVIEWS = 'SYS.MV0_T1' ORDER BY REFRESH_ID;実行結果は次のとおりです:
+------------+------------+-------------+ | 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
マテリアライズドビューの手動更新
マテリアライズドビューの更新モードが ON DEMAND の場合、DBMS_MVIEW パッケージを使用して手動で更新できます。増分更新として定義されたマテリアライズドビューについては、手動更新時にフル更新を指定することも可能です。
説明
マテリアライズドビューの所有者およびテナント管理者ユーザーのみが更新操作を実行できます。
REFRESHを使用したマテリアライズドビューの更新
DBMS_MVIEW.REFRESH (
list IN VARCHAR2, -- マテリアライズドビュー名。現在は複数のマテリアライズドビューには対応していません
method IN VARCHAR2 := NULL, -- 更新オプション
-- f:クイック更新
-- ?:強制更新
-- C|c:完全更新
-- A|a:常に更新。Cと同じです
----------- 以下のパラメータはサポートされておらず、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); -- マテリアライズドビューの更新並列度。OB独自のパラメータ
例:
テーブル
test_tbl1に3件のデータを挿入します。INSERT INTO test_tbl1 VALUES (1, 1, 1, 1),(2, 2, 2, 2),(3, 3, 3, 3);マテリアライズドビュー
mv1_test_tbl1の情報を確認します。SELECT * FROM mv1_test_tbl1;実行結果は次のとおりです:
Empty setDBMS_MVIEW.REFRESHを使用して、マテリアライズドビューmv1_test_tbl1を手動で更新します。マテリアライズドビュー設定の更新オプションを使用してマテリアライズドビューを更新します:
CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1');更新オプションを指定してマテリアライズドビューを更新します:
CALL DBMS_MVIEW.REFRESH('mv1_test_tbl1', 'c');
再びマテリアライズドビュー
mv1_test_tbl1の情報を確認します。SELECT * FROM mv1_test_tbl1;実行結果は次のとおりです:
+------+------+----------+----------+ | COL2 | CNT | CNT_COL3 | SUM_COL3 | +------+------+----------+----------+ | 3 | 1 | 1 | 3 | | 2 | 1 | 1 | 2 | | 1 | 1 | 1 | 1 | +------+------+----------+----------+ 3 rows in set
マテリアライズドビューの手動更新並列度
マテリアライズドビューを手動で更新する場合、システム変数mview_refresh_dopを設定して、マテリアライズドビューの更新操作に対するデフォルトの並列度を設定できます。
また、DBMS_MVIEW.REFRESH関数を呼び出す際に、refresh_parallelを指定して、今回の更新の並列度を明示的に設定することもできます。
注意
並列度が明示的に指定されておらず、mview_refresh_dop変数が0または1の場合、並列更新は有効になりません。
例:
現在のセッションの並列度を5に設定します。
SET mview_refresh_dop = 5;マテリアライズドビューを手動で更新します:
更新の並列度を8に明示的に指定します。今回の更新の並列度は8です。
CALL DBMS_MVIEW.REFRESH('mv1', 'c', 8);更新の並列度が明示的に指定されていない場合、セッション変数の値に基づき、今回の更新の並列度は5です。
CALL DBMS_MVIEW.REFRESH('mv1', 'c');
マテリアライズドビューの自動更新
マテリアライズドビューを作成する際に、START WITH datetime_expr および NEXT datetime_expr 句を指定した場合、条件が満たされると、システムはマテリアライズドビューに対してバックグラウンドで自動更新タスクを作成します。
マテリアライズドビューの自動更新の並列度
バックグラウンドでマテリアライズドビューを自動更新する際、以下の2つの方法で並列度を指定できます:
説明
以下の並列度の優先順位は、順に低くなります。
マテリアライズドビュー作成時に並列度(テーブルDOP)を指定します。
例:
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;グローバルSession変数
mview_refresh_dopを更新の並列度として設定します。自動更新操作は内部Sessionを通じて実行されるため、バックグラウンドSessionに有効にするには、Global(グローバル)レベルの mview_refresh_dop を設定する必要があります。
注意
マテリアライズドビュー作成時に明示的に並列度が指定されておらず、かつ
mview_refresh_dop変数が0または1の場合、バックグラウンド更新タスクでは並列更新は有効になりません。例:
グローバルSessionの並列度を5に設定します。
SET GLOBAL mview_refresh_dop = 5;マテリアライズドビューを作成します:
マテリアライズドビュー作成時に並列度を8に指定した場合、バックグラウンド更新タスクは8を更新の並列度として使用します。
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;マテリアライズドビュー作成時に並列度が指定されていない場合、バックグラウンド更新タスクは変数
mview_refresh_dopの値である5を更新の並列度として使用します。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;
ネストされたマテリアライズドビューの更新
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP5バージョンから、主キーのないマテリアライズドビューに基づいてネストされたマテリアライズドビューを作成できるようになりました。
注意
ネストされたマテリアライズド・ビューはリアルタイム・マテリアライズド・ビューとして作成できません。つまり、ネストされたマテリアライズド・ビューを作成する際に ENABLE ON QUERY COMPUTATION 句を指定することはサポートされていません。
ネストされたマテリアライズドビューの更新ルール
ネストされたマテリアライズドビューがサポートする更新方式は、非ネストされたマテリアライズドビューと同様に、フル更新と増分更新が含まれます。ネストされたマテリアライズドビューを更新する場合、直接依存するユーザーテーブルとマテリアライズドビュー(およびそれらのmlog)のみを使用しますが、ネストされたマテリアライズドビューは他のマテリアライズドビューに基づいて構築されているため、そのデータの一貫性は他のマテリアライズドビューに依存します。これは、あるネストされたマテリアライズドビューのデータを最新に保つためには、まずその依存する他のマテリアライズドビューのデータを最新にする必要があり、つまりそれらを先に更新する必要があることを意味します。
例えば、以下の図のように、マテリアライズドビューmv1はテーブルtbl1とテーブルtbl2に基づいて構築され、マテリアライズドビューmv2はマテリアライズドビューmv1とテーブルtbl3に基づいて構築され、マテリアライズドビューmv3はマテリアライズドビューmv1とマテリアライズドビューmv2に基づいて構築されています。マテリアライズドビューmv1、マテリアライズドビューmv2、マテリアライズドビューmv3の順序で更新を行う場合、ネストされたマテリアライズドビュー全体のデータの一貫性を保証できます。逆に、まずマテリアライズドビューmv2を更新し、次にマテリアライズドビューmv1を更新すると、マテリアライズドビューmv2のデータは最新ではなく(マテリアライズドビューmv1に遅れる)、同様に、まずマテリアライズドビューmv3を更新し、次にマテリアライズドビューmv2を更新すると、マテリアライズドビューmv3のデータも最新ではなく(マテリアライズドビューmv2に遅れる)ことになります。

OceanBaseデータベースV4.3.5バージョンでは、ネストされたマテリアライズドビューはV4.3.5 BP3バージョンからカスケード更新をサポートしています。カスケード更新には、カスケード非整合性更新とカスケード整合性更新があります。
カスケード非整合性更新:ネストされたマテリアライズドビューが依存するすべてのマテリアライズドビューをボトムアップで更新します。各マテリアライズドビューの更新ではデータの一貫性は保証されず、依存するベーステーブルから読み取るデータの時点が異なります。カスケード非整合性更新は、業務部門が定期的に上流からデータを同期するような一括同期方式に適しており、データ同期完了後にカスケード非整合性更新を行うことで、マテリアライズドビューの最終的な一貫性を維持できます。
カスケード整合性更新:スナップショット整合性のカスケード更新であり、カスケード更新全体が完了した後、上位層が参照する依存するすべてのベーステーブルのデータ時点が一致することを保証します。カスケード整合性更新は、リアルタイムでデータを同期するシナリオに適しており、毎回のカスケード更新完了後、マテリアライズドビュー内のデータスナップショットが同一の時点になることを保証します。
ネストされたマテリアライズドビューの更新例
マテリアライズドビューがフル更新された場合、それに依存するマテリアライズドビューは、その後の増分更新を行う前に必ず一度フル更新を行わなければなりません。そうでないとエラーが発生します。
例:
テーブル
tbl1を作成し、データを1件挿入します。CREATE TABLE tbl1(id INT, name VARCHAR2(30), PRIMARY KEY(id));INSERT INTO tbl1 VALUES (1, 'jack');テーブル
tbl2を作成し、データを1件挿入します。CREATE TABLE tbl2(id INT, age INT, PRIMARY KEY(id));INSERT INTO tbl2 VALUES (1, 21);テーブル
tbl1とテーブルtbl2にマテリアライズドビューログを作成します。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;tbl1とtbl2を基にマテリアライズドビューmv1を作成します。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;マテリアライズドビュー
mv1にマテリアライズドビューログを作成します。CREATE MATERIALIZED VIEW LOG ON mv1 WITH PRIMARY KEY (name, age) INCLUDING NEW VALUES;マテリアライズドビュー
mv1を基にマテリアライズドビュー(ネストされたマテリアライズドビュー)mv2を作成します。CREATE MATERIALIZED VIEW mv2 REFRESH FAST AS SELECT COUNT(*) cnt, COUNT(AGE) age_cnt, SUM(AGE) age_sum FROM mv1;マテリアライズドビュー
mv1のデータを確認します。SELECT * FROM mv1;実行結果は次のとおりです:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | +------+------+------+------+ 1 row in setマテリアライズドビュー
mv2のデータを確認します。SELECT * FROM mv2;実行結果は次のとおりです:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 1 | 1 | 21 | +------+---------+---------+ 1 row in setテーブル
tbl1とテーブルtbl2にそれぞれデータを1件ずつ挿入します。INSERT INTO tbl1 VALUES (2, 'rose');INSERT INTO tbl2 VALUES (2, 19);マテリアライズドビュー
mv1を増分更新します。CALL dbms_mview.refresh('mv1', 'f');マテリアライズドビュー
mv1のデータを確認します。SELECT * FROM mv1;実行結果は次のとおりです:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | | 2 | 2 | rose | 19 | +------+------+------+------+ 2 rows in setマテリアライズドビュー
mv2を増分更新します。CALL dbms_mview.refresh('mv2', 'f');マテリアライズドビュー
mv2のデータを確認します。SELECT * FROM mv2;実行結果は次のとおりです:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 2 | 2 | 40 | +------+---------+---------+ 1 row in set再びテーブル
tbl1とテーブルtbl2にそれぞれデータを1件ずつ挿入します。INSERT INTO tbl1 VALUES (3, 'mary');INSERT INTO tbl2 VALUES (3, 25);マテリアライズドビュー
mv1をフル更新します。CALL dbms_mview.refresh('mv1', 'c');再びマテリアライズドビュー
mv1のデータを確認します。SELECT * FROM mv1;実行結果は次のとおりです:
+------+------+------+------+ | ID1 | ID2 | NAME | AGE | +------+------+------+------+ | 1 | 1 | jack | 21 | | 2 | 2 | rose | 19 | | 3 | 3 | mary | 25 | +------+------+------+------+ 3 rows in set再びマテリアライズドビュー
mv2を増分更新します。CALL dbms_mview.refresh('mv2', 'f');実行結果は次のとおりです:
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 : 1注意
mv1はフル更新を経験しているため、mv2に対して直接増分更新を行うとエラーが発生します。まず一度フル更新を行う必要があります。再びマテリアライズドビュー
mv2のデータを確認します。SELECT * FROM mv2;実行結果は次のとおりです:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 2 | 2 | 40 | +------+---------+---------+ 1 row in setマテリアライズドビュー
mv2をフル更新します。CALL dbms_mview.refresh('mv2', 'c');再びマテリアライズドビュー
mv2のデータを確認します。SELECT * FROM mv2;実行結果は次のとおりです:
+------+---------+---------+ | CNT | AGE_CNT | AGE_SUM | +------+---------+---------+ | 3 | 3 | 65 | +------+---------+---------+ 1 row in set
マテリアライズドビューの更新統計情報
OceanBaseシステムは、マテリアライズドビューの更新操作に関する統計情報を収集・保存でき、これらの情報は特定のビューを通じて照会可能です。現在および過去のマテリアライズドビューの更新操作に関する統計情報はデータベース内に格納されます。過去のマテリアライズドビューの更新統計情報を通じて、データベース内のマテリアライズドビューの更新パフォーマンスを把握し分析することができます。
マテリアライズドビューの更新に関する統計情報の役割は以下のとおりです:
報告機能:マテリアライズドビューの更新操作に関する現在および過去の統計概要を提供します。これには、更新実行に必要な実際の時間も含まれており、更新パフォーマンスの追跡とモニタリングに役立ちます。
診断機能:詳細な現在および過去の統計データを通じて、マテリアライズドビューの更新パフォーマンスを効果的に分析できます。例えば、マテリアライズドビューの更新に時間がかかる場合、統計データはシステム負荷の増加によるものか、それともデータ変更量の増大によるパフォーマンス低下によるものかを特定するのに役立ちます。
マテリアライズドビューによる統計情報の収集
マテリアライズドビューは統計情報を収集します。analyze table または call dbms_stats.gather_table_stats('database_name', 'table_name') を使用して統計情報を収集できます。
テーブルおよび列の統計情報の収集に関する詳細は、GATHER_TABLE_STATSを参照してください。
マテリアライズドビューの更新操作に関する統計情報の収集および保持の管理に関する詳細は、DBMS_MVIEW_STATSの概要を参照してください。
マテリアライズドビューの更新情報を表示する
| ビュー名 | 機能の説明 |
|---|---|
| ALL_MVIEWS | マテリアライズドビューの情報を表示します。 |
| DBA_MVREF_STATS_SYS_DEFAULTS | マテリアライズドビューの更新履歴統計プロパティのシステム範囲デフォルト値。 |
| DBA_MVREF_STATS_PARAMS | 各マテリアライズドビューに関連付けられた更新統計情報プロパティを表示します。 |
| DBA_MVREF_RUN_STATS | マテリアライズドビューの各更新実行の情報を表示します。各実行はREFRESH_IDで識別されます。 |
| DBA_MVREF_STATS | マテリアライズドビューの更新に関する基本的なタイミング統計情報を表示します。 |
| DBA_MVREF_CHANGE_STATS | マテリアライズドビューの更新に関連する統計情報を表示します。 |
| DBA_MVREF_STMT_STATS | 更新ステートメントに関連する情報を表示します。 |
| DBA_SCHEDULER_JOBS | データベース内のすべてのスケジューラージョブの情報を表示します。 |