🐘

効率的なデータ参照の選択肢:マテリアライズドビューとビューのトレードオフ

2024/11/11に公開

本記事の内容

項目 ビュー マテリアライズドビュー
パフォーマンス △ リアルタイム計算 ◎ 事前計算で高速
データの最新性 ◎ 常に最新 △ 更新頻度に依存
ストレージ使用 ◎ 消費なし △ 結果を保存し消費あり

前情報

データベース設計において、パフォーマンス向上にはさまざまなアプローチがあります。
インデックスを活用して検索速度を向上させる方法や、クエリの最適化、キャッシュ戦略を導入することでレスポンスを改善する手段が考えられます。
しかし、これらの方法だけでは、複雑なデータ構造の効率的な参照や、頻繁に実行される集計・結合クエリのパフォーマンス改善には限界があることもあります。

マテリアライズドビュービューは、こうした問題を解決するために有効な手段であり、複雑なデータ構造を簡素化し、データ取得の効率化だけでなく、コードの可読性や保守性も向上させることができます。

ビューView)とは

データベースにおける仮想的なテーブルです。
ビューは実際のデータを持っているわけではなく、ベースとなるテーブルのデータに対するクエリの結果を「仮想的に」表示するものです。
ビューを使用することで、複雑なクエリを簡素化したり、特定のデータのサブセットを抽出したりできます。

-- postgreSQL
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

-- https://www.postgresql.jp/document/16/html/sql-createview.html

マテリアライズドビューMaterialized View)とは

ビューと似ていますが、重要な違いとして、データを物理的に保存する点があります。
通常のビューは仮想的なものに対して、マテリアライズドビューはクエリ結果をデータベース内に保存しておき、後でそのデータを直接参照することができます。(ある地点での物理的なコピー)

-- postgreSQL
CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    AS query
    [ WITH [ NO ] DATA ]
-- https://www.postgresql.jp/document/16/html/sql-creatematerializedview.html

それぞれ異なる特徴やトレードオフが存在します。
マテリアライズドビュービューには、それぞれの利点と制約があり、特定のユースケースに応じて選択する必要があります。

本題

1. パフォーマンス

マテリアライズドビュー:

  • データは事前に計算され、物理的に保存されるため、クエリの実行が高速
  • 複雑な集計や結合を含むクエリでのパフォーマンス改善に役立つ
  • データを更新する際に再計算が必要で、リフレッシュの頻度によっては追加のコストがかかる

ビュー:

  • データはリアルタイムで取得され、保存されないため、クエリごとにベーステーブルにアクセスして計算される
  • 単純なクエリには良いが、複雑なビューはパフォーマンスが低下することがある

2. データの最新性

マテリアライズドビュー:

  • リフレッシュ頻度に依存
  • デフォルトでは更新されないため、更新のタイミングを指定する必要がある
  • 更新が遅れると、最新のデータを反映されないことがある

ビュー:

  • 常に最新のデータを反映
  • ベーステーブルが更新されれば、ビューの結果も即座に反映される

3. ストレージの使用

マテリアライズドビュー:

  • データを物理的に保存するため、ストレージを消費する
  • 読み取りのパフォーマンスを向上させることができる

ビュー:

  • ストレージを消費しない(ベーステーブルを参照するだけ)

4. 用途

マテリアライズドビュー:

  • 大量のデータや複雑なクエリの結果を迅速に提供したい場合に有用
  • リアルタイム性が不要な分析やバッチ処理のシナリオに適する

ビュー:

  • 最新のデータを使用する必要がある場合

まとめ

マテリアライズドビューは、パフォーマンスを優先したいが、最新性やストレージの消費にはある程度の妥協が必要になります。
ビューは最新性を保ちたいが、複雑なクエリやパフォーマンスには妥協する場合に適しています。

補足

Q. 非正規化すればマテリアライズドビューは不要にならないか?
A. 場合により不要にはなる。一方で非正規化による複雑な更新やデータの整合性管理が難しくなる場合がある。マテリアライズドビューはこれらの問題を回避しつつ、事前計算によるパフォーマンス向上が狙えます。

参考資料

https://www.postgresql.jp/document/16/html/rules-views.html
https://www.postgresql.jp/document/16/html/rules-materializedviews.html
https://zenn.dev/chiki0320/articles/materiarized_view
https://qiita.com/Hiroto-Terai/items/d28e4541c495590fe96e

Discussion