ベーステーブルのデータを更新すると、マテリアライズドビューのデータとベーステーブルのデータが一致しなくなる可能性があります。マテリアライズドビューのデータを維持するために、OceanBaseデータベースはマテリアライズドビューのリフレッシュを実行します。
OceanBaseデータベースでサポートされているマテリアライズドビューのリフレッシュ戦略は、フルリフレッシュと増分リフレッシュをサポートしており、手動スケジュールと自動スケジュールの両方をサポートしています。
説明
マテリアライズドビューをリフレッシュすると、そのすべてのインデックスも自動的に更新されます。
フル更新
OceanBaseデータベースは、非同期的な更新を用いてフル更新を実行します。具体的には、隠れたテーブルを作成し、その隠れたテーブルに対して更新ステートメントを実行した後、元のテーブルと隠れたテーブルを切り替えます。そのため、フル更新操作には追加のストレージが必要であり、インデックス(存在する場合)も完全に再構築されます。
フル更新の注意点
- フル更新は非常に時間のかかるプロセスになる可能性があります。特に、大量のデータの読み取りや処理が必要な場合はそうです。そのため、フル更新を実行する前に、更新に要する時間を常に考慮する必要があります。
- 現在のベーステーブルの列とマテリアライズドビューの対応する列の型が一致している場合、フル更新の条件を満たしています。一致しない場合は、フル更新を実行できません。
- あるマテリアライズドビューがフル更新された場合、それに依存するマテリアライズドビュー(ネストされたマテリアライズドビュー)は、その後の増分更新を行う前に必ず一度フル更新を行わなければなりません。そうでない場合、エラーが発生します。
増分更新
増分更新をサポートするマテリアライズドビューは、現在、単一テーブルの非集計、単一テーブルの集計、複数テーブルの関連付け、複数テーブルの関連付けと集計、および集合クエリ(UNION ALL)のSQL文を対象としています。これら5つのシナリオに該当しないSQL文については、現在増分更新はサポートされていません。増分更新をサポートするSQL文の要件については、以下に詳述します。
注意
- 増分更新(
REFRESH FAST)は、マテリアライズドビューのログに記録された情報を利用して、増分更新が必要な内容を特定します。OceanBaseデータベースはマテリアライズドビューのログの自動管理機能をサポートしており、システムはデフォルトで対応するmlogを自動作成するか、既存のmlogテーブル定義を更新して、新規作成されたマテリアライズドビューが依存する列を含めます。詳細については、マテリアライズドビューのログ の「マテリアライズドビューのログの自動管理」セクションを参照してください。 - 本記事の例はすべてマテリアライズドビューのログの自動管理機能を使用しています。マテリアライズドビューのログを手動で作成する必要がある場合は、マテリアライズドビューのログ の「マテリアライズドビューのログの手動管理」セクションを参照してください。
- V4.4.2バージョンでは、V4.4.2 BP2バージョン以降、増分更新をサポートするマテリアライズドビューを作成する際、マテリアライズドビューの定義に集計関数または
UNION ALL演算子が含まれる場合、対応する依存列を手動で指定する必要がありません。
単一テーブルの非集約増分更新
単一テーブルの非集約増分更新例
テーブル
tbl1を作成します。CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT, col4 INT);テーブル
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などの集約関数をサポートしており、集約関数では単純な列のみを使用できます。V4.4.2バージョンでは、V4.4.2 BP2バージョン以降、増分更新マテリアライズドビューの定義に対応する集約関数が含まれているため、
SELECT句に依存列を含める必要はありません。V4.4.2 BP2以前のバージョンでは、
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 関数を使用するマテリアライズドビューは、リアルタイムマテリアライズドビューをサポートしていません。
V4.4.2 BP2 より前のバージョンでは、上記の単一テーブル集計増分更新の基本要件を満たす場合、集計関数 MAX および MIN の使用には、さらに以下の要件があります:マテリアライズドビューのベーステーブルに GROUP BY 列をプレフィックスとするインデックスが存在する必要があります。
説明
OceanBase データベースの MIN/MAX 集計関数のパラメータは非基本列をサポートし、GROUP BY 列にも非基本列を使用できます。
単一テーブル集計増分更新の例
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT, col4 INT);更新方法を増分更新とするマテリアライズドビューを作成します。
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;V4.4.2 バージョンでは、V4.4.2 BP2 バージョンから、
mv1_test_tbl1の作成方法は以下のようになります:CREATE MATERIALIZED VIEW mv1_test_tbl1 REFRESH FAST ON DEMAND AS SELECT col2, 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 INT PRIMARY KEY, col2 DATETIME, col3 INT, col4 INT, col5 INT, col6 INT);テーブル
m_tbl1に対して、col3列と(DATE(col2))列に基づいて、idx1_m_tbl1という名前のインデックスを作成します。obclient> CREATE INDEX idx1_m_tbl1 ON m_tbl1(col3, (DATE(col2)));単一テーブルの集計増分リフレッシュを行うマテリアライズドビュー
m_tbl1_mv1を作成します。obclient> CREATE MATERIALIZED VIEW m_tbl1_mv1 REFRESH FAST ON DEMAND AS SELECT col3, DATE(col2) gby_2, COUNT(*) cnt, MAX(col4) max_c4, MIN(col5 + col6) min_c5_c6 FROM m_tbl1 GROUP BY col3, DATE(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の結合による増分リフレッシュのマテリアライズドビュー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 IF EXISTS t1; DROP MATERIALIZED VIEW LOG ON t2; DROP TABLE IF EXISTS t2; DROP MATERIALIZED VIEW rt_mv1;以下のステートメントを使用して、テーブル
t1とインデックスidx_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);以下のステートメントを使用して、テーブル
t2とインデックスidx_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);以下のステートメントを使用して、リアルタイムマテリアライズドビュー
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の結合集計増分更新のリアルタイムマテリアライズドビュー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);集合クエリの増分更新をサポートするマテリアライズドビュー
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データベースは、マテリアライズドビューのリフレッシュ操作の並列度を制御することをサポートしています:
リフレッシュ並列度:
- リフレッシュ並列度の明示的指定:マテリアライズドビュー定義で
REFRESH ... PARALLEL nを用いてリフレッシュ並列度が指定されている場合、リフレッシュ操作実行時には、明示的に指定された値が優先されます。 - リフレッシュ並列度の暗黙的指定:リフレッシュ並列度が明示的に指定されていない場合、システムは現在のセッションで設定されている
mview_refresh_dopシステム変数の値をデフォルトの並列度として使用し、リフレッシュ操作の同時実行レベルを制御します。
- リフレッシュ並列度の明示的指定:マテリアライズドビュー定義で
マテリアライズドビューの並列度情報の確認
ビューDBA_MVIEWSを使用して、マテリアライズドビューに設定されたバックグラウンドリフレッシュの並列度を照会します。
説明
ビュー
DBA_MVIEWSでマテリアライズドビューの並列度を確認する場合、マテリアライズドビューに対して指定された並列度のみを確認できます。- フィールド
REFRESH_DOPが0以外の場合、マテリアライズドビューのバックグラウンドリフレッシュタスクはREFRESH_DOPに対応する並列度を使用します。 REFRESH_DOPが0の場合、グローバル(Global)レベルで設定されたmview_refresh_dopの値を使用します。
- フィールド
ビューDBA_MVREF_RUN_STATSを使用して、マテリアライズドビューの履歴リフレッシュ並列度を照会します。
例:
マテリアライズドビュー
mv0_t1を作成します。obclient> CREATE MATERIALIZED VIEW mv0_t1 REFRESH COMPLETE ON DEMAND START WITH sysdate() NEXT sysdate() + INTERVAL 10 SECOND AS SELECT c1, c2 FROM t1; ```マテリアライズドビュー
mv0_t1に設定されたバックグラウンドリフレッシュの並列度を確認します。obclient> SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM oceanbase.DBA_MVIEWS WHERE OWNER = 'db_test' AND MVIEW_NAME = 'mv0_t1';実行結果は次のとおりです:
+---------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +---------+------------+-------------+ | db_test | mv0_t1 | 0 | +---------+------------+-------------+ 1 row in setマテリアライズドビュー
mv0_t1のリフレッシュ並列度を8に変更します。obclient> ALTER MATERIALIZED VIEW mv0_t1 REFRESH PARALLEL 8;マテリアライズドビュー
mv0_t1に設定されたバックグラウンドリフレッシュの並列度を確認します。obclient> SELECT OWNER, MVIEW_NAME,REFRESH_DOP FROM oceanbase.DBA_MVIEWS WHERE OWNER = 'db_test' AND MVIEW_NAME = 'mv0_t1';実行結果は次のとおりです:
+---------+------------+-------------+ | OWNER | MVIEW_NAME | REFRESH_DOP | +---------+------------+-------------+ | db_test | mv0_t1 | 8 | +---------+------------+-------------+ 1 row in set
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;注意
グローバルレベルの変数設定は現在のセッションには無効です。有効にするには、再ログインして新しいセッションを確立する必要があります。
マテリアライズドビューの手動更新
マテリアライズドビューの更新モードが ON DEMAND の場合、DBMS_MVIEW.REFRESH を使用して手動で更新できます。増分更新として定義されたマテリアライズドビューを手動で更新する場合は、フル更新を指定することもできます。
説明
マテリアライズドビューの所有者またはテナント管理者ユーザーのみが更新操作を実行できます。
構文は以下のとおりです:
DBMS_MVIEW.REFRESH (
mv_name IN VARCHAR(65535)
[, method IN VARCHAR(65535) DEFAULT NULL]
[, refresh_parallel IN INT DEFAULT 0]
[, nested IN BOOLEAN DEFAULT FALSE]
[, async IN BOOLEAN DEFAULT FALSE]
パラメータの説明は以下のとおりです:
パラメータ |
説明 |
|---|---|
| mv_name | 更新対象のマテリアライズドビュー名。 |
| method | マテリアライズドビューの更新戦略を定義します。作成時にデフォルトの戦略を指定できます。選択可能な方法は以下のとおりです:
|
| refresh_parallel | 更新操作の並列度、つまり同時に実行するスレッド数。 |
| nested | ネストされたマテリアライズドビューの更新モードを指定します。値は以下のとおりです:
|
| async | 非同期更新を行うかどうかを指定します。値は以下のとおりです:
説明V4.4.2バージョンでは、このパラメータはV4.4.2 BP2バージョンから導入されました。 |
DBMS_MVIEW.REFRESH の詳細については、DBMS_MVIEW.REFRESHを参照してください。
例:
テーブル
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 | +------+------+----------+----------+ | 1 | 1 | 1 | 1 | | 2 | 1 | 1 | 2 | | 3 | 1 | 1 | 3 | +------+------+----------+----------+ 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 句を指定した場合、条件が満たされると、システムはマテリアライズドビューのためのバックグラウンドでの自動更新タスクを作成します。
説明
ビュー DBA_SCHEDULER_JOBS を参照して、マテリアライズドビューのバックグラウンド更新タスクの状況を確認できます。マテリアライズドビューの詳細情報については、マテリアライズドビューのクエリを参照してください。
マテリアライズドビューの自動更新の並列度
バックグラウンドでマテリアライズドビューを自動更新する際、以下の2つの方法で並列度を指定できます:
説明
以下の並列度の優先順位は、この順に低くなります。
マテリアライズドビュー作成時に更新並列度を指定する。
例:
CREATE MATERIALIZED VIEW mv_t1 REFRESH COMPLETE PARALLEL 8 ON DEMAND START WITH sysdate() NEXT sysdate() + 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 REFRESH COMPLETE PARALLEL 8 ON DEMAND START WITH sysdate() NEXT sysdate() + INTERVAL 10 SECOND AS SELECT c1, c2 FROM t1;マテリアライズドビュー作成時に更新並列度が指定されていない場合、バックグラウンド更新タスクは変数
mview_refresh_dopの値である5を更新並列度として使用します。CREATE MATERIALIZED VIEW mv2_t1 REFRESH COMPLETE ON DEMAND START WITH sysdate() NEXT sysdate() + 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 VARCHAR(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に基づいてマテリアライズドビュー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に基づいて、マテリアライズドビュー(ネストマテリアライズドビュー)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');実行結果は次のとおりです:
ERROR 9760 (HY000): cannot fast refresh materialized view注意
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データベースは、マテリアライズドビューのリフレッシュ操作を監視し、現在および過去のリフレッシュタスクの実行状態とパフォーマンスデータを提供します。これらの監視情報は、リフレッシュ効率の評価、潜在的なパフォーマンスボトルネックの特定、および今後のチューニングの根拠として役立ちます。
監視機能の説明:
- レポート機能:マテリアライズドビューのリフレッシュ操作に関する現在および過去の概要を提供し、各リフレッシュの実際の所要時間などの主要指標を含み、リフレッシュパフォーマンスの追跡と監視を容易にします。
- 診断機能:詳細なリフレッシュ履歴とパフォーマンスデータにより、マテリアライズドビューのリフレッシュ遅延やパフォーマンス低下の原因を深く分析できます。例えば、システム負荷の増加が原因なのか、データ変更量の増大によりリフレッシュ時間が長くなったのかを判断できます。
分層診断レポート(REFRESH_REPORT)
V4.4.2バージョンでは、V4.4.2 BP2バージョンから、システムはDBMS_MVIEW.REFRESH_REPORTサブプログラムを導入しました。これは、単一のマテリアライズドビューのリフレッシュタスクに関する分層診断レポートを生成し、ユーザーのパフォーマンスチューニングと問題の調査に役立ちます。
このレポートはXML/JSON形式で出力されます。分層診断レポートの詳細については、REFRESH_REPORTを参照してください。
例:
refresh_idを使用してXML形式の診断レポートを取得します。
obclient> SELECT DBMS_MVIEW.REFRESH_REPORT(refresh_id=> 100023);
統計情報の収集
クエリ性能の向上と実行計画の最適化のため、OceanBaseはテーブルおよびインデックスのデータ分布に関する統計情報の収集をサポートしています。マテリアライズドビューについても、同様のメカニズムを用いてそのデータ分布を収集し、データベースのクエリ最適化を支援することができます。
マテリアライズドビューの統計情報を収集する方法は以下のとおりです:
ANALYZE TABLEステートメントを使用します。詳細については、ANALYZEを参照してください。DBMS_STATS.GATHER_TABLE_STATS('database_name', 'table_name')システムプロシージャを呼び出して統計情報を収集します。詳細については、GATHER_TABLE_STATSを参照してください。
例:
マテリアライズドビュー mv2 の統計情報を収集します。
obclient> ANALYZE TABLE mv2 UPDATE HISTOGRAM ON cnt,age_cnt,age_sum WITH 15 BUCKETS;
マテリアライズドビュー関連ビュー
ビュー名 |
機能の説明 |
|---|---|
| DBA_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 | データベース内のすべてのスケジューラージョブ情報を表示します。 |