マテリアライズド・ビューの理解
次の項では、マテリアライズド・ビューとその管理方法について説明します。
マテリアライズド・ビューの概要
マテリアライズド・ビューとは、1つ以上の通常のTimesTen表から選択したデータのサマリーを保持する読取り専用表です。マテリアライズド・ビューの結果セットを作成するために問い合される通常のTimesTen表は、ディテール表と呼ばれます。
ノート:
マテリアライズド・ビューは、キャッシュ・テーブルではサポートされません。
図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を参照してください。
マテリアライズド・ビューによるパフォーマンスへの影響
更新される表をマテリアライズド・ビューで参照していると、UPDATE
、INSERT
およびDELETE
操作のパフォーマンスに影響することがあります。
パフォーマンスへの影響は、次のような多数の要因に応じて異なります。
-
マテリアライズド・ビューの性質: ディテール表の数、外部結合または集計の使用の有無。
-
ディテール表およびマテリアライズド・ビューに存在する索引のタイプ。
-
変更の影響を受けるマテリアライズド・ビュー行の数。
マテリアライズド・ビューは、問合せ結果の最新の永続コピーです。マテリアライズド・ビューを最新の状態に保つには、マテリアライズド・ビューのディテール表の変更時に、TimesTenでマテリアライズド・ビュー・メンテナンスを実行する必要があります。たとえば、表T1
、T2
およびT3
から選択するV
という名前のマテリアライズド・ビューがあり、常にT1
に挿入するか、T2
を更新するか、T3
から削除する場合、TimesTenはマテリアライズド・ビュー・メンテナンスを実行します。
マテリアライズド・ビュー・メンテナンスの実行には、通常のデータベース処理と同様に適切な索引が必要です。索引がない場合、マテリアライズド・ビュー・メンテナンスのパフォーマンスは低くなります。
ディテール表に対する更新文、挿入文、削除文のすべての処理には実行計画が存在します(TimesTen問合せオプティマイザを参照)。たとえば、T1
の行を更新すると、実行計画の第1段階が開始されます。マテリアライズド・ビューV
が更新された後、第2段階でT1が更新されます。
マテリアライズド・ビュー・メンテナンスを高速に行うには、次の手順を実行して、ディテール表を更新するすべての処理の計画を評価する必要があります。
-
ディテール表に対して頻繁に実行される更新文や削除文でのすべての
WHERE
句を調べます。索引キーを使用する句に注目してください。たとえば、次の処理が、アプリケーションの処理時間の95%を占めているとします。UPDATE T1 set A=A+1 WHERE K1=? AND K2=? DELETE FROMT2 WHERE K3=?
この場合、注目するキーは(
K1
、K2
)およびK3
です。 -
ビューでこれらのすべてのキー列が選択されていることを確認します。この例では、
K1
、K2
およびK3
がマテリアライズド・ビューで選択されている必要があります。 -
これらの各キーに対して、マテリアライズド・ビューの索引を作成します。この例では、(
V.K1
、V.K2
)に対する索引およびV.K3
に対する索引の2つの索引がビューに必要です。これらの索引が一意である必要はありません。この例では、ビューの列の名前は表の列の名前と同じですが、別の名前を指定することもできます。
この方法では、ディテール表を更新すると、対応するビューの更新にWHERE
句が使用されます。これによって、メンテナンスは1つのバッチで行われ、パフォーマンスが向上します。
ただし、前述の方法を使用できない場合があります。たとえば、アプリケーションにディテール表を更新するメソッドが多数存在することがあります。その場合、アプリケーションがビューで非常に多数の項目を選択したり、マテリアライズド・ビューに対して非常に多数の索引を作成することになり、予想以上の領域または処理能力が使用される可能性があります。次に示す別の方法を行います。
-
マテリアライズド・ビューの
FROM
句に指定されている各表(ディテール表)で、UPDATE
文、INSERT
文およびCREATE VIEW
文によって頻繁に変更されている表を確認します。たとえば、マテリアライズド・ビューのFROM
句に表T1
、T2
、T3
、T4
およびT5
があり、その中でT2
とT3
のみが頻繁に変更されているとします。 -
マテリアライズド・ビューでこれらの表のrowidが選択されることを確認してください。この例では、マテリアライズド・ビューで
T2
.rowidおよびT3
.rowidが選択されている必要があります。 -
これらの各rowid列に対してマテリアライズド・ビューの索引を作成します。この例では、列の名前は
T2rowid
およびT3rowid
で、索引はV.T2rowid
およびV.T3rowid
に対して作成されます。
この方法では、バッチ単位ではなく、行単位でマテリアライズド・ビュー・メンテナンスが行われます。ただし、マテリアライズド・ビューとそのディテール表の間では行が非常に効率的に照合されるため、高速でメンテナンスされます。通常、最初の方法ほど高速ではありませんが、有効な方法です。