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

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

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

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

今回はそんなビューとマテビューを、SI Object Browser for Oracleを利用しながら実例とともに理解していきます。

いまさら聞けない Oracleの基本 [初級編]

ビューとマテビューの違い

初めに基礎事項のおさらいです。

■ビュー

ビューとは複数のテーブルに対する検索・集計・結合処理をテーブルみたいに表現する仕組みです。

使用頻度の高い結合処理や、複雑な検索処理に対してビューを作成することで、

何度も同じ問い合わせを書く必要がなくなります。

 

■マテビュー

マテビューとは、ビューと同様に問い合わせ結果をテーブルとして表現し、必要に応じて最新の状態に更新することができる仕組みです。“スナップショット”という言葉がしっくりくるかと思います。

 

いまさら聞けない Oracleの基本 [中級編]
新規CTA

■二つの違い

ビューとマテビューの大きな違いは情報の持ち方にあります。

まず、ビューは実体を持ちません。そのため参照がある度に検索・集計処理(SQL)が走ります。

一方、マテビューの実体はテーブルです。そのため、複雑な検索・集計処理でも高速に結果を得ることができます。

ただしマテビューは“スナップショット”という言葉で表現した通り、常に最新の検索・集計結果を保持しているわけではなく、更新処理(リフレッシュ)が必要となります。

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

■マテビューのリフレッシュ方法・リフレッシュのタイミング

リフレッシュ方法には、下記の二つの方法があります。

・高速リフレッシュ:元テーブルで変更のあった部分のみを更新する。

(更新差分が必要になるので、先にマテリアライズド・ビュー ログの作成が必要になる)

・完全リフレッシュ:すべて更新しなおす。マテビュー自体の作り直しがされる。

 

またリフレッシュのタイミングには、

・更新がコミットされる度に行う(「on commit」オプションで指定)

・一定の間隔を指定する(「start with/next」オプションで指定)

・手動リフレッシュ(「on demand」オプションで指定)

の三種類があります。

Oracleで作ってみる

次に、実際にビューとマテビューをOracleで作成しながら違いを見ていきましょう。

 

■環境

SI Object Browser for Oracle v.19

Windows10

Oracle v19.0.3

 

■想定ケース

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

ビューとマテリアライズド・ビューの違いを理解する 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を選択し、新規作成します。

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

作成したビューを見てみましょう。

ビューを参照すると、下記の図の通りでテーブル同様の操作が可能となります。

検索条件を変えて、必要な情報のみを抽出することも可能です。

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

■マテビューを作る

次はマテビューです。

基本的な作成手順はビューと変わりありませんが、マテビューでは更新に関する設定が必要となります。

今回は更新方法を“完全(COMPLETE)”、更新属性(更新タイミング)手動(on demand)”にしてマテビューを作成します。

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

作成されたマテビューは「定義情報」>「更新(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

 

まとめ

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

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

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

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

トライアル版ダウンロード

RELATED POST関連記事


RECENT POST「【OBトコ】DBの勉強」の最新記事


【OBトコ】DBの勉強

データベースのスキーマを理解する

【OBトコ】DBの勉強

データベース別インスタンスの関係性

【OBトコ】DBの勉強

Oracle 表領域を拡張してみよう

【OBトコ】DBの勉強

Oracle スケーラブルシーケンスの使い方を確認しよう

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