この項の内容は次のとおりです。
マテリアライズド・ビューを作成するには、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;
マテリアライズド・ビューの作成時に、「主キー、外部キーおよび一意索引」の表の場合と同様の方法で、主キーおよびハッシュ表のサイズを指定できます。
マテリアライズド・ビューの内容の定義に使用する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を更新します。
ビュー・メンテナンスを高速化するには、ディテール表を更新する(書込み)処理の計画を調べ、適切であることを確認してください。この作業には時間がかかる場合があるため、次に、簡単な方法を示します。
* update T1 set A=A+1 WHERE K1=? AND K2=?
* delete from T2 WHERE K3=?
この場合、重要なキーは(K1、K2)およびK3です。
この方法では、ディテール表を更新すると、対応するビューの更新にWHERE句が使用されます。これによって、メンテナンスは1つのバッチで行われ、非常に高速になります。
ただし、前述の方法を使用できない場合があります。たとえば、アプリケーションが様々な方法でディテール表を更新する場合は、ビューで非常に多くの選択をしたり、非常に多くの索引を作成する必要があるため、予想以上の領域が使用されたり、高パフォーマンスが要求されることがあります。したがって、前述の方法を行うことが難しい場合は、次に示す別の方法を行います。
この方法では、バッチ単位ではなく、行単位でビュー・メンテナンスが行われますが、ビューとそのディテール表の間で行が非常に効率的に一致検索が行われるため、メンテナンスが高速化されます。通常、最初の方法ほど高速ではありませんが、有効な方法です。
マテリアライズド・ビューを破棄するには、SQL文DROP VIEWをコールします。
次の文では、マテリアライズド・ビューsampleMVが破棄されます。
DROP VIEW sampleMV;