ヘッダーをスキップ
Oracle TimesTen In-Memory Databaseオペレーション・ガイド
リリース7.0
E05167-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

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

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

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

マテリアライズド・ビューを作成するには、SQL文CREATE MATERIALIZED VIEWを使用します。SQL文の構文については、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』を参照してください。

次の2つの表を作成したとします。

CREATE TABLE customer(custId int not null,

       custName char(100) not null,

       Addr char(100),

       Zip int,

       Region char(10),

       PRIMARY KEY (custId));

CREATE TABLE bookOrder(orderId int not null,

       custId int not null,

       ordNo int not null,

       book char(100),

       PRIMARY KEY (orderId),

       FOREIGN KEY (custId) REFERENCES Customer(custId));

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

CREATE MATERIALIZED VIEW SampleMV AS

    SELECT customer.custId, custName, ordNo, book

    FROM customer, bookOrder

    WHERE customer.custId=bookOrder.custId;

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

CREATE MATERIALIZED VIEW文でのSELECT問合せ

マテリアライズド・ビューの内容の定義に使用するSELECT問合せは、トップ・レベルのSQL SELECT文(『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照)に類似していますが、次の制限があります。

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

マテリアライズド・ビューの作成後にディテール表のデータを変更すると、その変更はマテリアライズド・ビューに即時に反映されます。マテリアライズド・ビューを更新する方法は、ディテール表内の参照データを変更する方法のみです。マテリアライズド・ビューは、読取り専用表であるため、直接には更新できません。つまり、レプリケーション、XLAまたはキャッシュ・エージェント(キャッシュ・グループの一部にはできません)によるINSERT文、DELETE文またはUPDATE文でマテリアライズド・ビューを更新することはできません。

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

805: Update view table directly has not been implemented

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

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

UPDATEおよびINSERTで更新処理を行う場合、更新する表をマテリアライズド・ビューで参照していると、パフォーマンスに影響することがあります。パフォーマンスへの影響は、ビューの性質(使用するディテール表の数、外部結合または集計が使用されているかどうかなど)、ディテール表およびビューに存在する索引、変更によって影響を受けるビューの行数などの多くの要因によって異なります。

ビューは、問合せ結果の最新の永続コピーです。ビューを最新の状態に維持するには、ビューのディテール表の変更時に、TimesTenでビュー・メンテナンスを実行する必要があります。たとえば、表T1、T2、T3から選択するVというビューがある場合、T1への挿入、T2の更新またはT3からの削除を行うと、常にTimesTenでビュー・メンテナンスが実行されます。

ビュー・メンテナンスの実行には、通常のデータベース処理と同様に適切な索引が必要です。索引がない場合は、ビュー・メンテナンスに非常に時間がかかります。

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

ビュー・メンテナンスを高速化するには、ディテール表を更新する(書込み)処理の計画を調べ、適切であることを確認してください。この作業には時間がかかる場合があるため、次に、簡単な方法を示します。

  1. ディテール表に対して頻繁に実行される更新/削除でのすべてのWHERE句を調べます。多くの場合、これらの句は索引キーを使用します。これらの各キーをメモします。たとえば、次の処理が、アプリケーションの処理時間の95%を占めているとします。
  2. * update T1 set A=A+1 WHERE K1=? AND K2=?

    * delete from T2 WHERE K3=?

    この場合、重要なキーは(K1、K2)およびK3です。

  3. ビューでこれらのすべてのキー列を選択します。この例では、K1、K2およびK3がビューで選択されている必要があります。
  4. これらの各キーに対して、ビューの索引を作成します。この例では、(V.K1、V.K2)に対する索引およびV.K3に対する索引の2つの索引がビューに必要です。これらの索引は一意にできますが、一意にする必要はありません(また、この例では、ビューの列の名前は表の列の名前と同じですが、別の名前を指定することもできます)。

この方法では、ディテール表を更新すると、対応するビューの更新にWHERE句が使用されます。これによって、メンテナンスは1つのバッチで行われ、非常に高速になります。

ただし、前述の方法を使用できない場合があります。たとえば、アプリケーションが様々な方法でディテール表を更新する場合は、ビューで非常に多くの選択をしたり、非常に多くの索引を作成する必要があるため、予想以上の領域が使用されたり、高パフォーマンスが要求されることがあります。したがって、前述の方法を行うことが難しい場合は、次に示す別の方法を行います。

  1. ビューのFROM句に指定されている各表(ディテール表)で、UPDATE文、INSERT文およびCREATE VIEW文によって頻繁に変更されている表を確認します。たとえば、ビューのFROM句に表T1、T2、T3、T4、T5があり、その中でT2とT3のみが頻繁に変更されているとします。
  2. ビューでこれらの表のrowidが選択されることを確認してください。この例では、ビューでT2.rowidおよびT3.rowidが選択される必要があります。
  3. これらの各rowid列に対してビューの索引を作成します。この例では、列の名前はT2rowidおよびT3rowidで、索引はV.T2rowidおよびV.T3rowidに対して作成されます。

この方法では、バッチ単位ではなく、行単位でビュー・メンテナンスが行われますが、ビューとそのディテール表の間で行が非常に効率的に一致検索が行われるため、メンテナンスが高速化されます。通常、最初の方法ほど高速ではありませんが、有効な方法です。

マテリアライズド・ビューの破棄

マテリアライズド・ビューを破棄するには、SQL文DROP VIEWを実行します。

例6.4

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

DROP VIEW sampleMV;