ビューとマテリアライズド・ビューの違いを理解する

 2020.10.19  株式会社システムインテグレータ

皆さんは「ビュー」と「マテリアライズド・ビュー(以下、マテビュー)の違いを正しく理解できているでしょうか。

どちらも複雑な集計結果をテーブルとして表現する仕組みですが、それぞれ情報の持ち方が異なります。

今回はそんなビューとマテビューを、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

 

■想定ケース

顧客の商品購入情報に関する統計が欲しいというケースを想定します。

想定ケースER図

今回行う集計処理は下記の通りです。

副問い合わせで返ってくる結合結果に対してグループ化を行うことで、

商品ごとに購入顧客の性別・年齢層別の売上を集計します。

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",

    "製品名",

    "年齢層",

    "性別",

    "売上個数",

    "製品価格"

新規CTA

■ビューを作る

オブジェクトリストより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

 

まとめ

いかがだったでしょうか。ビューもマテビューも同じような仕組みではありますが、

それぞれで情報の持ち方に大きな違いがあります。

特にマテビューでは、集計処理の高速化を生かして様々な活用方法が見いだせます。

皆さんもビューとマテビューを正しく理解して、より良い活用をしましょう。

CTA

RELATED POST関連記事


RECENT POST「OBをトコトン極める」の最新記事


OBをトコトン極める

Oracle テーブルやビュー名のコピー&ペースト

OBをトコトン極める

Oracle マテリアライズド・ビューはどのくらい早いのか?

OBをトコトン極める

ビューとは?使い方を解説

OBをトコトン極める

マテリアライズドビューとは?作成やリフレッシュ方法も解説

ビューとマテリアライズド・ビューの違いを理解する