CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW文は、SelectQuery句で指定された表に対するビューを作成します。ビューを作成するために使用された元の表は、ディテール表と呼ばれます。ビューは、ディテール表の変更に関して、同期でリフレッシュされます。

必要な権限

文を実行するユーザーには、CREATE MATERIALIZED VIEW(所有者の場合)またはCREATE ANY MATERIALIZED VIEW (非所有者の場合)権限が必要です。

マテリアライズド・ビューの所有者に必要なものを次に示します。
  • ディテール表のSELECT権限。
  • CREATE TABLE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。DISTRIBUTE BY HASH句を指定し、分散キーを定義する必要があります。DISTRIBUTE BY REFERENCE句およびDUPLICATE句はサポートされていません。

SQL構文: TimesTen Scaleout

CREATE MATERIALIZED VIEW [Owner.]ViewName
DISTRIBUTE BY HASH (ColumnName [,...])
AS SelectQuery
[PRIMARY KEY (ColumnName [,...])] 
[UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages]

SQL構文: TimesTen Classic

CREATE MATERIALIZED VIEW [Owner.]ViewName
AS SelectQuery
[PRIMARY KEY (ColumnName [,...])] 
[UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages]

パラメータ

パラメータ 説明

[Owner.]ViewName

新しいビューに割り当てる名前。

DISTRIBUTE BY HASH (ColumnName [,...])

TimesTen Scaleoutのみです。DISTRIBUTE BY HASH句を指定する必要があり、(主キーを指定した場合でも)分散キーに対して1つ以上の列を指定する必要があります。

ハッシュによってディテール表を分散する必要があります。

DISTRIBUTE BY REFERENCE句またはDUPLICATE句はサポートされていません。

この句は、AS SelectQuery句の前に指定する必要があります。

SelectQuery

ビューで使用される、ディテール表の列を選択します。

ColumnName

作成されるビューの主キー列の名前を指定します。主キーには最大32列を指定できます。ビュー表の結果列の名前は、一意である必要があります。表または所有者の要素を列名の定義に含めることはできません。

UNIQUE HASH ON

表のハッシュ索引。一意のハッシュ索引のみが作成されます。このパラメータは、等価条件に使用します。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

ビューに定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。

CREATE MATERIALIZED VIEWの説明および制限: TimesTen Scaleout

説明および制限を次に示します。

  • マテリアライズド・ビューを使用すると問合せの実行時間が改善することが期待される場合、SQLオプティマイザは、ベース表に対する問合せをリライトして使用可能なマテリアライズド・ビューを使用することがあります。

  • DISTRIBUTE BY HASH句を指定する必要があり、これは、分散キーを使用して指定する必要があります(主キーを指定し、主キーを分散キーとして使用する場合であっても)。

  • AS SelectQuery句の前にDISTRIBUTE BY HASH句を指定する必要があります。

  • DISTRIBUTE BY HASH句のみ指定できます。DISTRIBUTE BY REFERENCE句およびDUPLICATE句はサポートされていません。

  • SelectQueryは単一表SELECT文に制限する必要があります。

  • SelectQueryではGROUP BYまたはWHERE句を指定できません。

  • SelectQueryではSQL関数を使用できません。

  • SelectQueryでは式を使用できません。

  • マテリアライズド・ビューのディテール表ではカスケード削除句を含む外部キーは使用できません。

  • 分散キー列は、SelectQueryの投影リストに含まれている必要があります。

  • DDLはリライトされません。たとえば、ディテール表に一意の索引を作成した場合、(一意列に分散されている)マテリアライズド・ビューに対応する索引は作成されません。

説明: TimesTen ScaleoutおよびTimesTen Classic

問合せの定義について、次の制限事項および要件があります。

  • SELECT構文のリストの各式には、一意の名前が必要です。

  • 非マテリアライズド・ビューを使用してマテリアライズド・ビューを定義しないでください。

  • マテリアライズド・ビュー問合せの選択リストの列にCLOBBLOB、またはNCLOBデータ型を定義しないでください。

  • ディテール表はキャッシュ・グループに属すことができず、ディテール表は圧縮を使用できません。

  • SELECT FOR UPDATE.は使用しないでください。

  • システム表またはシステム・ビューを参照しないでください。

  • マテリアライズド・ビューでネストされた定義を使用しないでください。

  • 動的パラメータを使用しないでください。

  • ROWNUMを使用しないでください。

  • 分析関数を使用しないでください。

  • GROUPING SETSROLLUP、またはCUBEを使用しないでください。

  • SYSDATEファンクションを使用しないでください。

  • SYSTEM_USERファンクション、USERファンクション、CURRENT_USERファンクション、またはSESSION_USERファンクションを使用しないでください。

  • NEXTVALまたはCURRVALを使用しないでください。

  • OUTER JOINは使用できますが、選択リストは、外部結合に指定した各内部表に1つ以上のNULL値可能でない列を投影する必要があります。

  • WITH subquery句は使用しないでください。

次の制限事項(問合せの定義を除く)があります。

  • マテリアライズド・ビューの列の集計がある、ハッシュ・ベースの主キーを使用しないでください。

  • マテリアライズド・ビューは、TimesTenレプリケーションを使用して直接レプリケートできません。ディテール表はレプリケートできます。レプリケートの両側で同じマテリアライズド・ビューを定義する必要があります。TimesTenでは、該当するマテリアライズド・ビューが自動的に更新されます。

  • 参照元または参照先の表がマテリアライズド・ビューの場合は、外部キーを定義できません。

問合せの定義に関する次の制限事項および要件があります。

  • ビューの定義には、選択リストのGROUP BYリストのすべての列が含まれる必要があります。

  • 集約ビューには、選択リストのCOUNT (*)またはCOUNT(NULL値不可の列)が含まれる必要があります。

  • 導出表またはJOIN表を使用しないでください。

  • SELECT DISTINCTファンクションまたは集計DISTINCTファンクションを使用しないでください。

  • 集合演算子UNIONINTERSECTまたはMINUSを使用しないでください。

  • NULL値可能な式のSUMを使用しないでください。

  • 単純な列のみをGROUP BY列として使用してください。

  • GROUP BY列は自己結合表に属することができません。

  • 次の句を使用しないでください。

    • HAVING

    • ORDER BY

    • DISTINCT

    • FIRST

    • JOIN

  • TT_HASHファンクションを使用しないでください。

  • SUMおよびCOUNTを使用できますが、SUMおよびCOUNTを含む式は使用しないでください。SUM/COUNTとして処理されるAVGを使用しないでください。

  • 選択リストでMINファンクションまたはMAXファンクションを指定しないでください。

  • 結合の場合:

    • 結合述語にORを使用できません。

    • デカルト積の結合(結合述語のない結合)を指定しないでください。

    • 外部結合では、各内部表を1つ以上の表に外部結合します。

その他の考慮事項は、次のとおりです:

  • マテリアライズド・ビューは読取り専用であり、直接更新できません。マテリアライズド・ビューの更新は、関連付けられたディテール表が変更された場合にのみ実行されます。このため、マテリアライズド・ビューに対してDELETEUPDATEまたはINSERT文を実行することはできません。

  • デフォルトでは、マテリアライズド・ビューで主キーを使用するために範囲索引が作成されます。かわりにUNIQUE HASH句を使用して、主キーに対してハッシュ索引を指定できます。

    • アプリケーションでマテリアライズド・ビューの主キーに対して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、マテリアライズド・ビューに対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。UNIQUE HASH句の詳細は、「CREATE TABLE」を参照してください。

  • 主キーで使用する索引の変更、またはハッシュ索引のサイズ変更を行うには、ALTER TABLEを使用できます。

  • ALTER TABLE文でマテリアライズド・ビューの列の追加または削除を行うことはできません。マテリアライズド・ビューの構造を変更するには、ビューを削除してから再度作成します。

  • マテリアライズド・ビューの索引は、CREATE INDEX SQL文を使用して作成できます。

マテリアライズド・ビューの所有者には、ディテール表に対するSELECT権限が必要です。SELECT権限は、SELECT ANY TABLEおよびADMINシステム権限によって暗黙的に指定されます。ディテール表に対するSELECT権限またはそれ以上のレベルのシステム権限がマテリアライズド・ビューの所有者から削除されると、マテリアライズド・ビューは無効になります。

無効なマテリアライズド・ビューから選択すると、エラーを伴って失敗します。無効なマテリアライズド・ビューのディテール表を更新しても、そのマテリアライズド・ビューは更新されません。

無効なマテリアライズド・ビューを識別するには、ttIsql describeコマンドを使用し、SYS.DBA_OBJECTSSYS.ALL_OBJECTSまたはSYS.USER_OBJECTSシステム表のSTATUS列を調べます。『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』を参照してください。

削除された権限が回復されると、マテリアライズド・ビューを削除して再作成することで、無効なマテリアライズド・ビューを再度有効にすることができます。

詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』「マテリアライズド・ビューのオブジェクト権限」を参照してください。

CREATE MATERIALIZED VIEWの例: TimesTen Scaleout

構文の例:

Command> CREATE MATERIALIZED VIEW mv
             DISTRIBUTE BY HASH (phone)
             AS SELECT phone FROM accounts;
1010 rows materialized.

例: TimesTen Classic

customer表とbookorder表の列からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW custorder AS
  SELECT custno, custname, ordno, book
  FROM customer, bookorder
  WHERE customer.custno=bookorder.custno;

t1表のx1およびy1列からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW v1 AS SELECT x1, y1 FROM t1
  PRIMARY KEY (x1) UNIQUE HASH ON (x1) PAGES=100;

t1表とt2表のx1およびy1列の外部結合からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW v2 AS SELECT x1, y1 FROM t1, t2
  WHERE x1=x2(+);

次の例では、表employeesから選択された列employee_idおよびemailに基づいて、マテリアライズド・ビューempmatview2を作成します。マテリアライズド・ビューの作成後、マテリアライズド・ビューempmatview2の列mvemp_idに索引を作成します。

CREATE MATERIALIZED VIEW empmatview2
   AS SELECT employee_id mvemp_id, email mvemail 
         FROM employees;
107 rows materialized. 

CREATE INDEX empmvindex ON empmatview2 (mvemp_id);