マテリアライズド・ビューの理解

次の項では、マテリアライズド・ビューとその管理方法について説明します。

マテリアライズド・ビューの概要

マテリアライズド・ビューとは、1つ以上の通常のTimesTen表から選択したデータのサマリーを保持する読取り専用表です。マテリアライズド・ビューの結果セットを作成するために問い合される通常のTimesTen表は、ディテール表と呼ばれます。

ノート:

マテリアライズド・ビューは、キャッシュ・テーブルではサポートされません。

図8-1に、ディテール表から作成されたマテリアライズド・ビューを示します。アプリケーションで、ディテール表の更新およびマテリアライズド・ビューからのデータの選択を行うことができます。

図8-1 マテリアライズド・ビュー

図8-1の説明が続きます
「図8-1 マテリアライズド・ビュー」の説明

同期マテリアライズド・ビューでは、ディテール表のトランザクション時に、ディテール表の結果セット・データが更新されます。ディテール表でデータが更新されるたびに、結果セットが更新されます。このため、マテリアライズド・ビューとディテール表が非同期になることはありません。ただし、パフォーマンスに影響を与える可能性があります。1つのトランザクション(ユーザー・トランザクション)で、ディテール表とマテリアライズド・ビューの両方の更新が実行されます。

マテリアライズド・ビューの処理

この項の内容は次のとおりです。

マテリアライズド・ビューの作成

マテリアライズド・ビューを作成するには、SQL文CREATE MATERIALIZED VIEWを使用します。

ノート:

マテリアライズド・ビューを作成するには、適切な権限を持っている必要があります。権限の詳細は、Oracle TimesTen In-Memory Database SQLリファレンスSQL文の章で、すべてのSQL文の構文とともに説明されています。

所有者が、マテリアライズド・ビューが作成されるディテール表に対する権限を取り消すと、そのマテリアライズド・ビューは無効になります。『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』マテリアライズド・ビューのオブジェクト権限を参照してください。

マテリアライズド・ビューの作成時に、「主キー、外部キーおよび一意索引」での表の説明と同様の方法で、主キー、およびハッシュ表のサイズを指定できます。

マテリアライズド・ビューの内容を定義するために使用するSELECT問合せは、Oracle TimesTen In-Memory Database SQLリファレンスSQL文で説明するトップレベルのSQL SELECT文に似ていますが、いくつかの制限があります。制限の詳細は、Oracle TimesTen In-Memory Database SQLリファレンスCREATE MATERIALIZED VIEWを参照してください。

同期マテリアライズド・ビューは、CREATE MATERIALIZED VIEW文を使用して作成できます。同期マテリアライズド・ビューは、ディテール表が更新されるたびに自動的に更新されます。

次の例では、sample_mvという同期マテリアライズド・ビューを作成します。このマテリアライズド・ビューによって、前述のcustomerおよびbook_orderディテール表の選択した列から結果セットが生成されます。

Command> CREATE TABLE customer 
(cust_id INT NOT NULL, 
cus_name CHAR(100) NOT NULL, 
addr CHAR(100), 
zip INT, 
region CHAR(10), 
PRIMARY KEY (cust_id));

CREATE TABLE book_order 
(order_id INT NOT NULL, 
cust_id INT NOT NULL, 
book CHAR(100), 
PRIMARY KEY (order_id), 
FOREIGN KEY (cust_id) REFERENCES customer(cust_id));
Command> CREATE MATERIALIZED VIEW sample_mv AS 
SELECT customer.cust_id, cust_name, order_id, book 
FROM customer, book_order 
WHERE customer.cust_id=book_order.cust_id;

マテリアライズド・ビューの削除

マテリアライズド・ビューを削除するには、DROP VIEW文を発行します。

次の文では、sample_mvマテリアライズド・ビューが削除されます。

Command> DROP VIEW sample_mv;

『Oracle TimesTen In-Memory Database SQLリファレンス』SQL文の章を参照してください。

マテリアライズド・ビューおよびディテール表に関する制限事項

マテリアライズド・ビューは、読取り専用表であるため、直接には更新できません。つまり、マテリアライズド・ビューは、INSERT文、DELETE文またはUPDATE文で更新できず、レプリケーション、XLAまたはキャッシュ・エージェントでも更新できません。

たとえば、マテリアライズド・ビューの行を更新しようとすると、次のエラーが戻されます。

805: Update view table directly has not been implemented

マテリアライズド・ビューのその他の実装についてよく理解している読者にとっては一般的ですが、TimesTenのマテリアライズド・ビューには、次の特性があります。

  • ディテール表はレプリケートできますが、マテリアライズド・ビューはレプリケートできません。

  • マテリアライズド・ビューおよびそのディテール表のいずれも、キャッシュ・グループの一部にはできません。

  • 表または別のマテリアライズド・ビューを参照する外部キーを作成できません。通常の表は、外部キーを使用して、マテリアライズド・ビューを参照できません。

  • マテリアライズド・ビューを破棄するには、DROP VIEW文を使用する必要があります。

  • マテリアライズド・ビューを変更することはできません。DROP VIEW 文で破棄してから、CREATE MATERIALIZED VIEW文で新しいマテリアライズド・ビューを作成する必要があります。

  • マテリアライズド・ビューは、アプリケーションで明示的に作成する必要があります。

  • TimesTenの問合せオプティマイザが、ディテール表に対する問合せをリライトしてマテリアライズド・ビューを参照することはありません。マテリアライズド・ビューを使用する場合は、アプリケーションの問合せでビューを直接参照する必要があります。

  • マテリアライズド・ビューの作成に使用するSQLにはいくつかの制限があります。Oracle TimesTen In-Memory Database SQLリファレンスCREATE MATERIALIZED VIEWを参照してください。

マテリアライズド・ビューによるパフォーマンスへの影響

更新される表をマテリアライズド・ビューで参照していると、UPDATEINSERTおよびDELETE操作のパフォーマンスに影響することがあります。

パフォーマンスへの影響は、次のような多数の要因に応じて異なります。

  • マテリアライズド・ビューの性質: ディテール表の数、外部結合または集計の使用の有無。

  • ディテール表およびマテリアライズド・ビューに存在する索引のタイプ。

  • 変更の影響を受けるマテリアライズド・ビュー行の数。

マテリアライズド・ビューは、問合せ結果の最新の永続コピーです。マテリアライズド・ビューを最新の状態に保つには、マテリアライズド・ビューのディテール表の変更時に、TimesTenでマテリアライズド・ビュー・メンテナンスを実行する必要があります。たとえば、表T1T2およびT3から選択するVという名前のマテリアライズド・ビューがあり、常にT1に挿入するか、T2を更新するか、T3から削除する場合、TimesTenはマテリアライズド・ビュー・メンテナンスを実行します。

マテリアライズド・ビュー・メンテナンスの実行には、通常のデータベース処理と同様に適切な索引が必要です。索引がない場合、マテリアライズド・ビュー・メンテナンスのパフォーマンスは低くなります。

ディテール表に対する更新文、挿入文、削除文のすべての処理には実行計画が存在します(TimesTen問合せオプティマイザを参照)。たとえば、T1の行を更新すると、実行計画の第1段階が開始されます。マテリアライズド・ビューVが更新された後、第2段階でT1が更新されます。

マテリアライズド・ビュー・メンテナンスを高速に行うには、次の手順を実行して、ディテール表を更新するすべての処理の計画を評価する必要があります。

  1. ディテール表に対して頻繁に実行される更新文や削除文でのすべてのWHERE句を調べます。索引キーを使用する句に注目してください。たとえば、次の処理が、アプリケーションの処理時間の95%を占めているとします。

    UPDATE T1 set A=A+1 WHERE K1=? AND K2=?
    DELETE FROMT2 WHERE K3=?

    この場合、注目するキーは(K1K2)およびK3です。

  2. ビューでこれらのすべてのキー列が選択されていることを確認します。この例では、K1K2およびK3がマテリアライズド・ビューで選択されている必要があります。

  3. これらの各キーに対して、マテリアライズド・ビューの索引を作成します。この例では、(V.K1V.K2)に対する索引およびV.K3に対する索引の2つの索引がビューに必要です。これらの索引が一意である必要はありません。この例では、ビューの列の名前は表の列の名前と同じですが、別の名前を指定することもできます。

この方法では、ディテール表を更新すると、対応するビューの更新にWHERE句が使用されます。これによって、メンテナンスは1つのバッチで行われ、パフォーマンスが向上します。

ただし、前述の方法を使用できない場合があります。たとえば、アプリケーションにディテール表を更新するメソッドが多数存在することがあります。その場合、アプリケーションがビューで非常に多数の項目を選択したり、マテリアライズド・ビューに対して非常に多数の索引を作成することになり、予想以上の領域または処理能力が使用される可能性があります。次に示す別の方法を行います。

  1. マテリアライズド・ビューのFROM句に指定されている各表(ディテール表)で、UPDATE文、INSERT文およびCREATE VIEW文によって頻繁に変更されている表を確認します。たとえば、マテリアライズド・ビューのFROM句に表T1T2T3T4およびT5があり、その中でT2T3のみが頻繁に変更されているとします。

  2. マテリアライズド・ビューでこれらの表のrowidが選択されることを確認してください。この例では、マテリアライズド・ビューでT2.rowidおよびT3.rowidが選択されている必要があります。

  3. これらの各rowid列に対してマテリアライズド・ビューの索引を作成します。この例では、列の名前はT2rowidおよびT3rowidで、索引はV.T2rowidおよびV.T3rowidに対して作成されます。

この方法では、バッチ単位ではなく、行単位でマテリアライズド・ビュー・メンテナンスが行われます。ただし、マテリアライズド・ビューとそのディテール表の間では行が非常に効率的に照合されるため、高速でメンテナンスされます。通常、最初の方法ほど高速ではありませんが、有効な方法です。