ベーステーブルのデータを更新すると、マテリアライズドビューのデータがベーステーブルのデータと一致しなくなる可能性があります。マテリアライズドビューのデータを維持するために、OceanBaseデータベースはマテリアライズドビューのリフレッシュを実行します。
OceanBaseデータベースでサポートされているマテリアライズドビューのリフレッシュ戦略は、フルリフレッシュと増分リフレッシュをサポートしており、手動スケジュールのリフレッシュと自動スケジュールのリフレッシュもサポートしています。
説明
マテリアライズドビューをリフレッシュすると、そのすべてのインデックスも自動的に更新されます。
フル更新
OceanBaseデータベースでは、異所更新を用いてフル更新を実行します。具体的には、隠れたテーブルを作成し、そのテーブルに対して更新ステートメントを実行した後、元のテーブルと隠れたテーブルを切り替えます。そのため、フル更新操作には追加のストレージが必要であり、インデックス(存在する場合)も完全に再構築されます。
フル更新の注意点
- フル更新は非常に時間のかかるプロセスになる可能性があります。特に、大量のデータを読み取り処理する必要がある場合はそうです。そのため、フル更新を実行する前に、更新に要する時間を常に考慮する必要があります。
- 現在のベーステーブルの列とマテリアライズドビューの対応する列の型が一致している場合、フル更新の条件を満たしています。一致しない場合は、フル更新を実行できません。
- あるマテリアライズドビューがフル更新された場合、それに依存するマテリアライズドビュー(ネストされたマテリアライズドビュー)は、その後の増分更新を行う前に必ず一度フル更新を行わなければなりません。そうでない場合、エラーが発生します。
増分更新
増分更新をサポートするマテリアライズドビューは、現在、単一テーブルの非集計、単一テーブルの集計、複数テーブルの関連付け、複数テーブルの関連付けと集計、および集合クエリ(UNION ALL)のSQL文を対象としています。これら5つのシナリオに該当しないSQL文については、現在増分更新はサポートされていません。増分更新をサポートするSQL文の要件については、以下に詳述します。
注意
REFRESH FASTメソッドは、マテリアライズドビューのログに記録された情報を用いて、増分更新が必要な内容を特定します。そのため、マテリアライズドビューを増分更新する際には、マテリアライズドビューを作成する前に、ベーステーブルのマテリアライズドビューのログ(mlog)を作成しておく必要があります。- マテリアライズドビューのログの作成方法については、マテリアライズドビューのログを参照してください。
- OceanBaseデータベースは、マテリアライズドビューのログの自動管理機能をサポートしています。自動管理mlogを有効にすると、増分更新をサポートするマテリアライズドビューを作成する前に、ユーザーがベーステーブルのmlogを作成する必要はありません。OceanBaseデータベースが自動的に対応するmlogを作成するか、既存のmlogテーブル定義を更新し、新しく作成されたマテリアライズドビューが依存する列を含めるようにします。詳細については、マテリアライズドビューのログの自動管理を参照してください。
- マテリアライズドビューで使用されるすべての列は、mlogに含まれている必要があります。
単一テーブルの非集約増分更新
単一テーブルの非集約増分更新例
テーブル
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) 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データベースでは、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列と(DATE(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データベースのマテリアライズドビューの増分更新機能は、複数テーブルの外部結合(
LEFT JOIN/RIGHT JOIN)をサポートしています。 - 外部結合の制限事項:結合ツリーは、
INNER JOINが先に来て、LEFT JOINが後に来る左深い結合ツリーでなければなりません。 - 増分更新されるマテリアライズドビューの
SELECT句にLEFT JOIN演算子が含まれる場合、制約の競合による更新異常を防ぐため、作成時に主キー(PRIMARY KEY)または一意インデックス(UNIQUE INDEX)を指定することは禁止されています。 - 外部結合を含むポリマリアライズドビューは、リアルタイムマテリアライズドビューをサポートしていません。
- OceanBaseデータベースのマテリアライズドビューの増分更新機能は、複数テーブルの外部結合(
すべての
FROMテーブルにmlogが作成され、ビューで使用される列はすべてmlogに存在している必要があります。ビュー定義にサブクエリは存在しません。
ビュー定義に
ROLLUP、HAVING、WINDOW FUNCTION、DISTINCT、ORDER BY、LIMIT、FETCHなどの句は存在しません。ビュー定義では、
ROWNUM、RAND、SYSDATEなどの不安定な出力値を持つ式を使用できません。
複数テーブル結合による増分リフレッシュの例
ベーステーブル
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集計関数やリアルタイムマテリアライズドビューをサポートしません。
複数テーブルの集計増分更新の例
ベーステーブル
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;
セットクエリによる増分更新
集合マテリアライズドビューは、マテリアライズドビューで 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 を設定することで、セッション上のシステム変数値に基づいてマテリアライズドビューを更新できます。
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の場合、グローバルレベルで設定された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;グローバルセッション変数
mview_refresh_dopを更新並列度として設定する。自動更新操作は内部セッションで実行されるため、バックグラウンドセッションに有効にするには、グローバルレベルの mview_refresh_dop を設定する必要があります。
注意
マテリアライズドビュー作成時に並列度が明示的に指定されておらず、かつ
mview_refresh_dop変数が0または1の場合、バックグラウンド更新タスクでは並列更新は有効になりません。例:
グローバルセッションの並列度を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データベースは、主キーのないマテリアライズドビューに基づいてネストマテリアライズドビューを作成できます。
注意
ネストマテリアライズドビューはリアルタイムマテリアライズドビューとして作成することはできません。つまり、ネストマテリアライズドビュー作成時に 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データベースのネストマテリアライズドビューは、カスケードリフレッシュをサポートしています。カスケードリフレッシュは、カスケード非一貫性リフレッシュとカスケード一貫性リフレッシュに分けられます:
カスケード非一貫性リフレッシュ:ネストマテリアライズドビューが依存するすべてのマテリアライズドビューをボトムアップでリフレッシュします。各マテリアライズドビューのリフレッシュではデータ一貫性は保証されず、依存するベーステーブルから読み取るデータの時点が一致しません。カスケード非一貫性リフレッシュは、バッチ同期の方法に適しています。例えば、業務部門が定期的に上流からデータを同期し、データ同期完了後にカスケード非一貫性リフレッシュを実行することで、マテリアライズドビューの最終的な一貫性を保つことができます。
カスケード一貫性リフレッシュ:スナップショット一貫性のカスケードリフレッシュであり、カスケードリフレッシュ全体が完了した後、上位レベルで参照する依存するすべてのベーステーブルのデータ時点が一致することを保証します。カスケード一貫性リフレッシュは、リアルタイムデータ同期のシナリオに適しています。これにより、毎回のカスケードリフレッシュ完了後、マテリアライズドビュー内のデータスナップショットが同一の時点にあることが保証されます。
ネストマテリアライズドビューの更新例
あるマテリアライズドビューがフル更新された場合、それに依存するマテリアライズドビューは、その後増分更新を行う前に必ず一度フル更新を実行する必要があります。そうでない場合、エラーが発生します。
例:
テーブル
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に対して直接増分更新を行うとエラーが発生します。まずフル更新を1回実行する必要があります。再度、マテリアライズドビュー
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 | データベース内のすべてのスケジューラージョブの情報を表示します。 |