皆さんは「ビュー」と「マテリアライズド・ビュー(以下、マテビュー)」の違いを正しく理解できているでしょうか。
どちらも複雑な集計結果をテーブルとして表現する仕組みですが、それぞれ情報の持ち方が異なります。
今回はそんなビューとマテビューを、SI Object Browser for Oracleを利用しながら実例とともに理解していきます。
ビューとマテビューの違い
初めに基礎事項のおさらいです。
■ビュー
ビューとは複数のテーブルに対する検索・集計・結合処理をテーブルみたいに表現する仕組みです。
使用頻度の高い結合処理や、複雑な検索処理に対してビューを作成することで、
何度も同じ問い合わせを書く必要がなくなります。
■マテビュー
マテビューとは、ビューと同様に問い合わせ結果をテーブルとして表現し、必要に応じて最新の状態に更新することができる仕組みです。“スナップショット”という言葉がしっくりくるかと思います。
■二つの違い
ビューとマテビューの大きな違いは情報の持ち方にあります。
まず、ビューは実体を持ちません。そのため参照がある度に検索・集計処理(SQL)が走ります。
一方、マテビューの実体はテーブルです。そのため、複雑な検索・集計処理でも高速に結果を得ることができます。
ただしマテビューは“スナップショット”という言葉で表現した通り、常に最新の検索・集計結果を保持しているわけではなく、更新処理(リフレッシュ)が必要となります。
■マテビューのリフレッシュ方法・リフレッシュのタイミング
リフレッシュ方法には、下記の二つの方法があります。
・高速リフレッシュ:元テーブルで変更のあった部分のみを更新する。
(更新差分が必要になるので、先にマテリアライズド・ビュー ログの作成が必要になる)
・完全リフレッシュ:すべて更新しなおす。マテビュー自体の作り直しがされる。
またリフレッシュのタイミングには、
・更新がコミットされる度に行う(「on commit」オプションで指定)
・一定の間隔を指定する(「start with/next」オプションで指定)
・手動リフレッシュ(「on demand」オプションで指定)
の三種類があります。
Oracleで作ってみる
次に、実際にビューとマテビューをOracleで作成しながら違いを見ていきましょう。
■環境
SI Object Browser for Oracle v.19
Windows10
Oracle v19.0.3
■想定ケース
顧客の商品購入情報に関する統計が欲しいというケースを想定します。
今回行う集計処理は下記の通りです。
副問い合わせで返ってくる結合結果に対してグループ化を行うことで、
商品ごとに購入顧客の性別・年齢層別の売上を集計します。
SELECT "製品ID", "製品名", "性別", "年齢層", SUM("売上個数")*"製品価格" "売上" FROM -- 各製品の売上情報一覧を取得 (SELECT PRH.PR_ID "製品ID", PR.PR_NAME "製品名", CU.C_SEX "性別", CASE WHEN CU.C_AGE <= 20 THEN '10代' WHEN CU.C_AGE <= 30 THEN '20代' WHEN CU.C_AGE <= 40 THEN '30代' WHEN CU.C_AGE <= 50 THEN '50代' ELSE '60代以上' END "年齢層", PR.PR_COST "製品価格", PRH.C_COUNT "売上個数" FROM TEST.PR_HISTORYS PRH LEFT OUTER JOIN TEST.PRODUCTIONS PR ON PRH.PR_ID = PR.PR_ID LEFT OUTER JOIN TEST.CUSTOMERS CU ON PRH.C_ID = CU.C_ID ) -- 集計したい項目でグループ化 GROUP BY "製品ID", "製品名", "年齢層", "性別", "売上個数", "製品価格" |
■ビューを作る
オブジェクトリストよりVIEWを選択し、新規作成します。
作成したビューを見てみましょう。
ビューを参照すると、下記の図の通りでテーブル同様の操作が可能となります。
検索条件を変えて、必要な情報のみを抽出することも可能です。
■マテビューを作る
次はマテビューです。
基本的な作成手順はビューと変わりありませんが、マテビューでは更新に関する設定が必要となります。
今回は更新方法を“完全(COMPLETE)”、更新属性(更新タイミング)を”手動(on demand)”にしてマテビューを作成します。
作成されたマテビューは「定義情報」>「更新(F)」ボタンから、最新の情報に更新することができます。
集計結果はビューと同様に「データ」タブから確認ができ、条件指定による再集計も可能です。
■集計速度の差
実際に集計速度の比較を行うために、500件、1,000件、5,000件、10,000件、20,000件の商品購入履歴の集計を行いました。結果は以下の表になります。
冒頭でも説明した通り、ビューは参照時に集計用のDDL文が実行されるのに対して、マテビューは集計結果をテーブルとして保持します。
そのため、結合・集計元テーブルのデータが少ない場合は双方でそこまでの差は出ませんが、件数が増えるごとに結合・集計のコストが増すために、マテビューの実行時間のほうが小さいことが確認できました。
件数 | 実行時間(ms) | |
ビュー | マテビュー | |
500 | 0.004 | 0.003 |
1,000 | 0.21 | 0.14 |
5,000 | 0.23 | 0.16 |
10,000 | 0.38 | 0.3 |
20,000 | 0.55 | 0.33 |
まとめ
いかがだったでしょうか。ビューもマテビューも同じような仕組みではありますが、
それぞれで情報の持ち方に大きな違いがあります。
特にマテビューでは、集計処理の高速化を生かして様々な活用方法が見いだせます。
皆さんもビューとマテビューを正しく理解して、より良い活用をしましょう。
- カテゴリ:
- キーワード: