※当サイトの記事には、広告・プロモーションが含まれます。

ビュー(VIEW)とマテリアライズド・ビュー(MATERIALIZED VIEW)の違いとか

nazology.net

⇧ 結局、ハッキリしてないような...

ビュー(VIEW)とは?

Oracle databaseのドキュメントによりますと、

docs.oracle.com

Views are customized presentations of data in one or more tables or other views. You can think of them as stored queries. Views do not actually contain data, but instead derive their data from the tables upon which they are based. These tables are referred to as the base tables of the view.

https://docs.oracle.com/database/121/ADMQS/GUID-2840B1D6-201A-4E75-8BDB-E49E2600018F.htm#ADMQS0841

⇧ テーブル、または、ビューのデータで構成されるものであると、まぁ、テーブルからデータを取得してきてるってことみたいですね。

マテリアライズド・ビュー(MATERIALIZED VIEW)

Oracle databaseのドキュメントによりますと、

docs.oracle.com

Oracle uses materialized views (also known as snapshots in prior releases) to replicate data to nonmaster sites in a replication environment and to cache expensive queries in a data warehouse environment. 

https://docs.oracle.com/database/121/REPLN/repmview.htm#REPLN265

A materialized view is a replica of a target master from a single point in time. The master can be either a master table at a master site or a master materialized view at a materialized view site.

https://docs.oracle.com/database/121/REPLN/repmview.htm#REPLN265

⇧ マスターのレプリカと謳っていますが、サッパリ分からん...

ビュー(VIEW)とマテリアライズド・ビュー(MATERIALIZED VIEW)の違いとか

ネット上の情報によりますと、

www.dba-oracle.com

View:  Unike a materialized view, a view is always constructed at runtime, and the tables and joined and aggregations made every time the view is invoked.  A view is also useful for hiding "senisitive" data columns.

Materialized View:  Unlike a view, a materialized view has a concrete existance, in the sence that the tables are pre-joined and aggreations made and the results of the query are stored on disk.  Materialized views also differ from views because they are "redundant", being copied from the base tables. and hence, they need a refresh mechanism.

http://www.dba-oracle.com/t_difference_between_view_and_materialized_view.htm

⇧ という違いがあるそうな。

なるほど、Materialized Viewは、キャッシュされてるようなイメージなんかな、そのため、データの更新とかを明示的に実施してあげないと更新されないようです。

一方、Viewは呼び出される度に都度、データは更新されるので、明示的に更新の必要はないと、ただ、View自体の構成が変わる場合は、Viewにおいても作り直しが必要とは思いますが。

RDBMS(Relational DataBase Management System)以外でも、Materialized Viewの利点として、

docs.aws.amazon.com

  • Faster response times – A materialized view responds faster in comparison to a view. This is because the materialized view is precomputed and therefore doesn’t waste time resolving the query or joins in the query that create the materialized view.

https://docs.aws.amazon.com/prescriptive-guidance/latest/materialized-views-redshift/advantages-materialized-views.html

⇧ 兎に角、Viewよりもレスポンスが早いんだと言ってますな。

整理すると、

  • VIEW
    →データの更新が頻繁に行われるような用途向け
  • MATERIALIZED VIEW
    →データの更新がほぼ無い用途向け

って感じになるのかな。

で、MATERIALIZED VIEWの更新方法はと言うと、

docs.oracle.com

データベースでは、実表の変更後にマテリアライズド・ビューをリフレッシュして、マテリアライズド・ビューのデータを管理します。

マテリアライズド・ビューのリフレッシュ

リフレッシュ方法は、増分または完全リフレッシュです。ログベースのリフレッシュおよびパーティション・チェンジ・トラッキング(PCT)リフレッシュと呼ばれる、2つの増分リフレッシュ方法があります。増分リフレッシュは一般にFASTリフレッシュと呼ばれ、通常は、完全リフレッシュよりも高速に実行されます。

マテリアライズド・ビューのリフレッシュ

⇧ 3種類あるってことなのかな?

注意点としては、

Oracle Database 12cリリース1より、マテリアライズド・ビューのリフレッシュ・パフォーマンスおよび可用性を向上させる新しいリフレッシュ・オプションが利用可能となります。このリフレッシュ・オプションはホーム外リフレッシュと呼ばれます。

マテリアライズド・ビューのリフレッシュ

⇧ バージョンによって利用できるオプションが異なるらしい。

あと、stackoverflowによると、

stackoverflow.com

You can refresh a materialized view completely as follows:

EXECUTE  
DBMS_SNAPSHOT.REFRESH('Materialized_VIEW_OWNER_NAME.Materialized_VIEW_NAME','COMPLETE');

https://stackoverflow.com/questions/11554886/how-to-refresh-materialized-view-in-oracle

Best option is to use the '?' argument for the method. This way DBMS_MVIEW will choose the best way to refresh, so it'll do the fastest refresh it can for you. , and won't fail if you try something like method=>'f' when you actually need a complete refresh. :-)

from the SQL*Plus prompt:

EXEC DBMS_MVIEW.REFRESH('my_schema.my_mview', method => '?');

https://stackoverflow.com/questions/11554886/how-to-refresh-materialized-view-in-oracle

スキーマの指定とかもできるって言ってますな。

と言うか、複数のスキーマに同じ名前のMATERIALIZED VIEWが存在するような環境の場合、スキーマ指定しなかった場合は、全てのスキーマのMATERIALIZED VIEWを更新してくれるんですかね?それともエラーになるんかな?

このあたりの話がOracleのドキュメントで見つけられず...

兎にも角にも、

  1. MATERIALIZED VIEWの元になっているテーブルを更新する
  2. MATERIALIZED VIEWを更新する

という手順で、MATERIALIZED VIEWは更新されるということですかね。

MATERIALIZED VIEWの更新する機会がほぼ無いケースだと、「1.MATERIALIZED VIEWの元になっているテーブルを更新する」でどんなデータをINSERTするかが忘れられやすい気がする。

毎度モヤモヤ感が半端ない...

今回はこのへんで。