58 読取り専用マテリアライズド・ビューの概要

読取り専用マテリアライズド・ビューに関連する概念を理解します。

58.1 レプリケーション・データベース

レプリケーションとは、分散データベース・システムを構成する複数のデータベースのデータベース・オブジェクト(表など)をコピーおよびメンテナンスするプロセスです。レプリケーションをサポートする1つの方法は、読取り専用マテリアライズド・ビューです。

レプリケーション環境では、マスター・データベースおよびマテリアライズド・ビュー・データベースの2つの基本的なデータベース・タイプがサポートされます。マテリアライズド・ビュー・データベースには、ある一時点における表データのイメージ、すなわちマテリアライズド・ビューが含まれています。マテリアライズド・ビューが定義されている表は、マテリアライズド・ビューのマスター表です。通常、マテリアライズド・ビューは、マスター表と同期するために定期的にリフレッシュされます。

マテリアライズド・ビューはリフレッシュ・グループに編成できます。リフレッシュ・グループ内のすべてのマテリアライズド・ビューのデータが同じ時点でのトランザクションの一貫性に対応できるように、リフレッシュ・グループ内のマテリアライズド・ビューは、同時にリフレッシュされます。

注意:

Oracle GoldenGateは、レプリケーションのためのフル機能を備えたOracleのソリューションです。詳細は、Oracle GoldenGateのドキュメントを参照してください。

58.2 読取り専用マテリアライズド・ビュー

読取り専用マテリアライズド・ビューには、ある一時点におけるターゲット・マスター表の全体または一部のコピーが含まれています。部分的コピーには、行のサブセット、列のサブセット、あるいはその両方が含まれる場合があります。

読取り専用マテリアライズド・ビューは、マスター表のデータへの読取り専用アクセスを提供します。ネットワークの可用性にかかわらず、アプリケーションは読取り専用マテリアライズド・ビューにデータを問い合せて、マスター・データベースへのネットワーク・アクセスを回避できます。ただし、アプリケーションでデータ操作言語(DML)による変更を実行する場合は、全システムのアプリケーションはマスター・データベースのデータにアクセスする必要があります。図58-1は、基本的な読取り専用レプリケーションを示しています。

図58-1 読取り専用マテリアライズド・ビュー

図58-1の説明が続きます
「図58-1 読取り専用マテリアライズド・ビュー」の説明

マテリアライズド・ビューには、次の利点があります。

  • ローカル・アクセスが可能なため、応答時間を短縮し、可用性を向上できます。

  • マテリアライズド・ビューがそのソースとは異なるデータベース内にある場合、ユーザーはローカルのマテリアライズド・ビューへの問合せができるので、マスター・データベースを問合せの負荷から開放します

  • ターゲット・マスターのデータ・セットのうち、選択したサブセットのみをレプリケート可能にすることにより、データ・セキュリティを高めることができます。

ユーザーは必要に応じて読取り専用マテリアライズド・ビューを同期(リフレッシュ)できます。ユーザーはマテリアライズド・ビューをリフレッシュするとき、最後のリフレッシュ以降にマスター表で発生した変更を受け取ります。

58.3 マテリアライズド・ビューの使用

マテリアライズド・ビューは、ネットワーク負荷の軽減、データのサブセット化やモバイル・コンピューティングなどの目標を達成するために使用できます。

58.3.1 ネットワーク負荷の軽減

ネットワーク負荷の軽減が目的の1つである場合は、マテリアライズド・ビューを使用することによって、地域のデータベースに企業データベースを分布させることができます。

会社全体で1つのデータベース・サーバーにアクセスするのではなく、ユーザーの負荷を複数のデータベース・サーバーに分散します。レプリケートするデータ量を減らすために、マテリアライズド・ビューをマスター表のサブセットにすることができます。

58.3.2 データ・サブセッティングを可能にする

マテリアライズド・ビューでは、列および行レベルのサブセッティングに基づいてデータをレプリケートできます。

データのサブセット化により、特定のデータベースに関する情報のみをレプリケートできるようになります。たとえば、各地の営業所ではその地域に必要なデータのみをレプリケートし、不要なネットワークの通信量を減らすことができます。

行および列の両方のサブセットによって、マスター表のデータの一部を含むマテリアライズド・ビューを作成できます。行のサブセットでは、WHERE句を使用して、マスター内の必要な行のみをマテリアライズド・ビューに含めることができます。列のサブセットでは、マスター内の必要な列のみをマテリアライズド・ビューに含めることができます。マテリアライズド・ビューを作成する際に、SELECT文で特定の列を指定してこれらを実行します。

58.3.3 モバイル・コンピューティングを可能にする

マテリアライズド・ビューは専用のネットワーク接続を必要としません。

ジョブをスケジュールしてリフレッシュ処理を自動化するオプションもありますが、必要に応じて手動でリフレッシュできるマテリアライズド・ビューは、ラップトップ・コンピュータ上で実行される問合せのための理想的なソリューションです。

58.4 使用可能なマテリアライズド・ビュー

使用可能なマテリアライズド・ビューには、主キーマテリアライズド・ビュー、オブジェクト・マテリアライズド・ビュー、ROWIDマテリアライズド・ビューおよび複合マテリアライズド・ビューがあります。

58.4.1 使用可能なマテリアライズド・ビューについて

Oracleでは、多数の異なるレプリケーション(および非レプリケーション)状況のニーズを満たすために、いくつかのタイプの読取り専用マテリアライズド・ビューを提供しています。

どのタイプのマテリアライズド・ビューを作成する場合でも、マテリアライズド・ビューの問合せで表所有者のスキーマ名を指定します。たとえば、次のCREATE MATERIALIZED VIEW文について考えます。

CREATE MATERIALIZED VIEW hr.employees
  AS SELECT * FROM hr.employees@orc1.example.com;

この文では、問合せにスキーマhrが指定されています。

58.4.2 主キー・マテリアライズド・ビュー

主キー・マテリアライズド・ビューがマテリアライズド・ビューのデフォルト・タイプです。

主キー・マテリアライズド・ビューを作成するためのSQL文の例を次に示します。

CREATE MATERIALIZED VIEW oe.customers WITH PRIMARY KEY 
  AS SELECT * FROM oe.customers@orc1.example.com;

主キー・マテリアライズド・ビューがデフォルトであるため、次の文の結果も主キー・マテリアライズド・ビューになります。

CREATE MATERIALIZED VIEW oe.customers 
  AS SELECT * FROM oe.customers@orc1.example.com;

リモート・マテリアライズド・ビュー・データベースで行のサブセットを作成できるように、主キー・マテリアライズド・ビューに副問合せを含めることができます。副問合せは主問合せに埋め込まれた問合せで、CREATE MATERIALIZED VIEW文に複数のSELECT文が使用されます。この副問合せには、基本的なWHERE句のように単純なものと、マルチレベルのWHERE EXISTS句のように複雑なものとがあります。参照される各マスターにマテリアライズド・ビュー・ログがある場合は、選択されたクラスの副問合せを含む主キー・マテリアライズド・ビュー・サイトに高速リフレッシュを実行できます。高速リフレッシュでは、マテリアライズド・ビュー・ログを使用して、最後のリフレッシュ以降に変更が加えられた行のみを更新します。

次のマテリアライズド・ビューは、副問合せを含むWHERE句を使用して作成されています。

CREATE MATERIALIZED VIEW oe.orders REFRESH FAST AS
 SELECT * FROM oe.orders@orc1.example.com o
 WHERE EXISTS
   (SELECT * FROM oe.customers@orc1.example.com c
    WHERE o.customer_id = c.customer_id AND c.credit_limit > 10000);

このタイプのマテリアライズド・ビューは、副問合せマテリアライズド・ビューと呼ばれます。

注意:

このoe.ordersマテリアライズド・ビューを作成するには、マスター表のマテリアライズド・ビュー・ログにcredit_limitがログされている必要があります。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

関連項目:

58.4.3 オブジェクト・マテリアライズド・ビュー

マテリアライズド・ビューがオブジェクト表に基づいてOF type句を使用して作成されている場合、このマテリアライズド・ビューはオブジェクト・マテリアライズド・ビューと呼ばれます。

オブジェクト・マテリアライズド・ビューは、オブジェクト表と同じ構造です。つまり、オブジェクト・マテリアライズド・ビューは行オブジェクトから構成され、各行オブジェクトはオブジェクト識別子(OID)列により識別されます。

関連項目:

58.4.4 ROWIDマテリアライズド・ビュー

ROWIDマテリアライズド・ビューは、マスター表の行の物理的な行ID(ROWID)に基づいています。

ROWIDマテリアライズド・ビューを使用するのは、主キーを持たないマスター表に基づくマテリアライズド・ビュー、またはマスター表の一部の主キー列を含むマテリアライズド・ビューの場合です。

ROWIDマテリアライズド・ビューを作成するCREATE MATERIALIZED VIEW文の例を次に示します。

CREATE MATERIALIZED VIEW oe.orders REFRESH WITH ROWID AS
 SELECT * FROM oe.orders@orc1.example.com;

関連項目:

58.4.5 複合マテリアライズド・ビュー

複合マテリアライズド・ビューは、高速リフレッシュできません。

58.4.5.1 複合マテリアライズド・ビューについて

高速リフレッシュを実行するには、マテリアライズド・ビューの定義問合せで一定の制限事項を守る必要があります。

マテリアライズド・ビューの定義問合せが汎用的なものであり、制限事項を守ることができない場合は、そのマテリアライズド・ビューは複合マテリアライズド・ビューであり、高速リフレッシュを実行できません。

具体的には、マテリアライズド・ビューの定義問合せに次のいずれかが含まれる場合、そのマテリアライズド・ビューは複合マテリアライズド・ビューとみなされます。

  • CONNECT BY

    たとえば、次の文では複合マテリアライズド・ビューが作成されます。

    CREATE MATERIALIZED VIEW hr.emp_hierarchy AS
      SELECT LPAD(' ', 4*(LEVEL-1))||email USERNAME 
        FROM hr.employees@orc1.example.com START WITH manager_id IS NULL 
        CONNECT BY PRIOR employee_id = manager_id;
    
  • INTERSECTMINUSまたはUNION ALL集合演算

    たとえば、次の文にはUNION ALL集合演算が含まれているため、複合マテリアライズド・ビューが作成されます。

    CREATE MATERIALIZED VIEW hr.mview_employees AS
      SELECT employees.employee_id, employees.email 
      FROM hr.employees@orc1.example.com
    UNION ALL
      SELECT new_employees.employee_id, new_employees.email 
      FROM hr.new_employees@orc1.example.com;
    
  • DISTINCTまたはUNIQUEキーワード

    たとえば、次の文では複合マテリアライズド・ビューが作成されます。

    CREATE MATERIALIZED VIEW hr.employee_depts AS
      SELECT DISTINCT department_id FROM hr.employees@orc1.example.com 
      ORDER BY department_id; 
    
  • 集計関数(場合による)。集計関数を定義問合せに指定して、単純マテリアライズド・ビューを作成することもできます。

    たとえば、次の文では複合マテリアライズド・ビューが作成されます。

    CREATE MATERIALIZED VIEW hr.average_sal AS
      SELECT AVG(salary) "Average" FROM hr.employees@orc1.example.com;
    
  • 副問合せ以外で指定される結合(場合による)。結合を定義問合せに指定して、単純マテリアライズド・ビューを作成することもできます。

    たとえば、次の文では複合マテリアライズド・ビューが作成されます。

    CREATE MATERIALIZED VIEW hr.emp_join_dep AS
      SELECT last_name 
      FROM hr.employees@orc1.example.com e, hr.departments@orc1.example.com d
      WHERE e.department_id = d.department_id; 
    
  • UNION演算子(場合による)。

    具体的には、次の条件のいずれかが満たされた場合に、UNION演算子を指定したマテリアライズド・ビューは複合マテリアライズド・ビューになります。

    • UNION内の問合せが複合問合せの場合。ここまでの箇条書きの項目は、問合せによりマテリアライズド・ビューが複合マテリアライズド・ビューになる場合を示します。

    • 最も外側のSELECTリスト列が、UNION内の問合せに一致しない場合。次の例で、最初の問合せの最も外側のSELECTリストにはorder_totalのみが含まれ、2番目の問合せの最も外側のSELECTリストにはcustomer_idが含まれています。したがって、マテリアライズド・ビューは複合マテリアライズド・ビューです。

      CREATE MATERIALIZED VIEW oe.orders AS
        SELECT order_total 
        FROM oe.orders@orc1.example.com o
        WHERE EXISTS
          (SELECT cust_first_name, cust_last_name
             FROM oe.customers@orc1.example.com c
             WHERE o.customer_id = c.customer_id 
             AND c.credit_limit > 50)
      UNION    
        SELECT customer_id 
        FROM oe.orders@orc1.example.com o
        WHERE EXISTS
          (SELECT cust_first_name, cust_last_name 
             FROM oe.customers@orc1.example.com c
             WHERE o.customer_id = c.customer_id 
             AND c.account_mgr_id = 30);  
      

      最も内側のSELECTリストは、マテリアライズド・ビューが複合マテリアライズド・ビューであるかどうかには関係しません。この例では、UNION内の両方の問合せで、最も内側のSELECTリストはcust_first_namecust_last_nameです。

  • 「副問合せを使用するマテリアライズド・ビューでの制限事項」で説明されている要件に適合しない句

注意:

複合マテリアライズド・ビューは高速リフレッシュできないので、パフォーマンスが低下する可能性があるため、可能な場合は、使用を避けてください。

関連項目:

58.4.5.2 単純マテリアライズド・ビューと複合マテリアライズド・ビューの比較

アプリケーションによっては、複合マテリアライズド・ビューの使用を考慮することが必要な場合があります。

図58-2とその後に続く本文では、考慮の必要な場合について説明します。

図58-2 単純マテリアライズド・ビューと複合マテリアライズド・ビューの比較

図58-2の説明が続きます
図58-2 単純マテリアライズド・ビューと複合マテリアライズド・ビューの比較の説明
  • 複合マテリアライズド・ビュー: 図58-2の方法Aは、複合マテリアライズド・ビューを示しています。データベースII内のマテリアライズド・ビューでは、マテリアライズド・ビューのリフレッシュ中に結合操作が完了しているので、非常に効率的に問合せが行われます。ただし、複合マテリアライズド・ビューであるため完全リフレッシュを実行する必要があり、多くの場合、完全リフレッシュは、高速リフレッシュに比べ実行速度が遅くなります。

  • 結合ビューを含む単純マテリアライズド・ビュー: 図58-2の方法Bは、データベースII内の2つの単純マテリアライズド・ビューと、マテリアライズド・ビューのデータベース内で結合を実行するビューを示しています。ビューに対する問合せのパフォーマンスは、方法Aの複合マテリアライズド・ビューに対する問合せのパフォーマンスに比べよくありません。ただし、単純マテリアライズド・ビューの方が、高速リフレッシュとマテリアライズド・ビュー・ログを使用してより高速にリフレッシュできます。

要約すると、使用する方法は次のようにして判断できます。

  • リフレッシュを実行する頻度が少なく、より高速な問合せのパフォーマンスを優先する場合は、方法A(複合マテリアライズド・ビュー)を使用します。

  • 頻繁にリフレッシュを実行し、問合せのパフォーマンスを優先する必要がない場合は、方法B(単純マテリアライズド・ビュー)を使用します。 

58.5 マテリアライズド・ビュー関連のユーザーおよび権限

マテリアライズド・ビューに関連するユーザーには、作成者、リフレッシャおよび所有者があります。マテリアライズド・ビューでの操作を実行するために必要な権限は、操作を実行するユーザーのタイプに応じて異なります。

58.5.1 マテリアライズド・ビューの操作に必要な権限

3つの異なるタイプのユーザーがマテリアライズド・ビューの操作を実行します。

これらのユーザーは、次のとおりです。

  • 作成者: マテリアライズド・ビューを作成するユーザー。

  • リフレッシャ: マテリアライズド・ビューをリフレッシュするユーザー。

  • 所有者: マテリアライズド・ビューを所有するユーザー。マテリアライズド・ビューはこのユーザーのスキーマに常駐します。

1人のユーザーが特定のマテリアライズド・ビューに対してこのすべての操作を実行できます。ただし、レプリケーション環境によっては、特定のマテリアライズド・ビューに対して別々のユーザーがこの操作を実行します。これらの操作の実行に必要な権限は、1人のユーザーが操作を実行するか別々のユーザーが実行するかにより異なります。

マテリアライズド・ビュー・データベースのマテリアライズド・ビューの所有者にマスター・データベースへのプライベート・データベース・リンクがある場合、データベース・リンクはマスター・データベースのマスター表の所有者に接続します。それ以外の場合は、データベース・リンク経由の接続に関する通常の規則が適用されます。

注意:

以降の項では、クエリー・リライトが使用可能なマテリアライズド・ビューの作成に必要な要件については説明されていません。詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。

関連項目:

以降の項ではデータベース・リンクについて説明しています。データベース・リンクの使用の詳細は、「分散データベースの概念」を参照してください。

58.5.2 作成者が所有者である場合

マテリアライズド・ビューの作成者がそのマテリアライズド・ビューを所有している場合、このユーザーはマテリアライズド・ビューを作成するために必要な権限を持つ必要があります。

次の権限は、ロールを介してではなく、明示的に付与する必要があります。

  • CREATE MATERIALIZED VIEWまたはCREATE ANY MATERIALIZED VIEW

  • CREATE TABLEまたはCREATE ANY TABLE

  • マスター表およびマスター表のマテリアライズド・ビュー・ログに対するREADまたはSELECTオブジェクト権限、またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限

    マスター・データベースがリモートの場合は、マテリアライズド・ビュー・データベースのユーザーがデータベース・リンクを介して接続するマスター・データベースのユーザーに、READまたはSELECTオブジェクト権限を付与する必要があります。

58.5.3 作成者が所有者でない場合

マテリアライズド・ビューの作成者が所有者でない場合は、マテリアライズド・ビューを作成するために作成者と所有者に特定の権限を付与する必要があります。

作成者の権限と所有者の権限は、いずれもロールを介してではなく、明示的に付与する必要があります。

表58-1は、マテリアライズド・ビューの作成者が所有者でない場合に必要な権限を示します。

表58-1 マテリアライズド・ビューの作成に必要な権限(作成者が所有者でない場合)

作成者 所有者

CREATE ANY MATERIALIZED VIEW

CREATE TABLEまたはCREATE ANY TABLE

マスター表およびマスター表のマテリアライズド・ビュー・ログに対するREADまたはSELECTオブジェクト権限、またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限

マスター・データベースがリモートの場合は、マテリアライズド・ビュー・データベースのユーザーがデータベース・リンクを介して接続するマスター・データベースのユーザーに、READまたはSELECTオブジェクト権限を付与する必要があります。

58.5.4 リフレッシャが所有者である場合

マテリアライズド・ビューのリフレッシャがマテリアライズド・ビューを所有している場合、このユーザーはマテリアライズド・ビューを作成するために必要な権限を持つ必要があります。

具体的には、このユーザーは、マスター表およびマスター表のマテリアライズド・ビュー・ログに対するREADまたはSELECTオブジェクト権限、またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限を持つ必要があります。マスター・データベースがリモートの場合は、マテリアライズド・ビュー・データベースのユーザーがデータベース・リンクを介して接続するマスター・データベースのユーザーに、READまたはSELECTオブジェクト権限を付与する必要があります。この権限は、明示的にまたはロールを介して付与できます。

58.5.5 リフレッシャが所有者でない場合

マテリアライズド・ビューのリフレッシャが所有者でない場合は、リフレッシャと所有者に権限を付与する必要があります。

これらの権限は、明示的にまたはロールを介して付与できます。

表58-2は、マテリアライズド・ビューのリフレッシャが所有者でない場合に必要な権限を示します。

表58-2 マテリアライズド・ビューのリフレッシュに必要な権限(リフレッシャが所有者でない場合)

リフレッシャ 所有者

ALTER ANY MATERIALIZED VIEW

マスター・データベースがローカルの場合、マスター表およびマスター表のマテリアライズド・ビュー・ログに対するREADまたはSELECTオブジェクト権限、またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限を付与する必要があります。

マスター・データベースがリモートの場合は、マテリアライズド・ビュー・データベースのユーザーがデータベース・リンクを介して接続するマスター・データベースのユーザーに、READまたはSELECTオブジェクト権限を付与する必要があります。

58.6 マテリアライズド・ビューを使用したデータのサブセット化

マスター表内のデータのサブセットを反映するマテリアライズド・ビューを構成するために、行のサブセットおよび列のサブセットを使用できます。

58.6.1 マテリアライズド・ビューを使用したデータのサブセット化について

特定の状況では、マスター表のデータのサブセットをマテリアライズド・ビューに反映することができます。

行のサブセット化では、WHERE句を使用して、マスター表の必要な行のみをマテリアライズド・ビューに含めることができます。列のサブセット化では、マスター表の必要な列のみをマテリアライズド・ビューに含めることができます。これを行うには、マテリアライズド・ビューの作成中にSELECT文でいくつかのSELECT列を指定します。

データのサブセット化の使用目的には、次のようなものがあります。

  • ネットワークの通信量の軽減: 列のサブセットを含むマテリアライズド・ビューでは、マテリアライズド・ビューの定義問合せのWHERE句を満たす変更のみがマテリアライズド・ビュー・データベースに適用されるため、転送データ量が減少し、ネットワーク通信量が軽減されます。

  • 機密データの保護: マテリアライズド・ビューの定義問合せを満たすデータ以外は表示できません。

  • リソース要件の削減: マテリアライズド・ビューがラップトップに格納される場合は、一般にハード・ディスクは会社のサーバーよりもはるかに小さくなります。サブセット化したマテリアライズド・ビューにより、使用する記憶領域をかなり小さくすることができます。

  • リフレッシュ時間の改善: マテリアライズド・ビューに適用されるデータが少量であるため、リフレッシュ処理が高速になり、これはラップトップからネットワーク接続を使用してマテリアライズド・ビューをリフレッシュする必要のあるユーザーにとって重要なことです。

たとえば、次の文では、oe.orders@orc1.example.comマスター表に基づいたマテリアライズド・ビューが作成され、sales_rep_id番号が173の営業担当員の行のみが含まれます。

CREATE MATERIALIZED VIEW oe.orders REFRESH FAST AS
 SELECT * FROM oe.orders@orc1.example.com
 WHERE sales_rep_id = 173;

受注表でsales_rep_id番号が173以外の行は、このマテリアライズド・ビューからは除外されます。

58.6.2 副問合せを使用するマテリアライズド・ビュー

複数の表の情報に基づいてデータをレプリケートする場合、それらのマテリアライズド・ビューのメンテナンスおよび定義は困難である可能性があります。

58.6.2.1 多対1副問合せ

多対1の関係を持つ副問合せを含むマテリアライズド・ビューを作成できます。

oeスキーマにcustomers表とorders表が含まれている場合に、orders表とcustomers表の両方のデータに基づいたorders表のマテリアライズド・ビューを作成するとします。たとえば、営業担当員が、信用限度額が$10,000を超える顧客の注文をすべて調べる必要があるとします。この場合、ordersマテリアライズド・ビューを作成するCREATE MATERIALIZED VIEW文には、多対1関係の副問合せが含まれますが、これは、それぞれの顧客が多数の注文をしている可能性があるためです。

図58-3では、customers表とorders表はcustomer_id列を介して関係していることが示されています。営業担当員の目的は、次の文で達成されます。つまり、次の文では、信用限度額が$10,000より大きい顧客の注文が含まれたマテリアライズド・ビューが作成されます。

CREATE MATERIALIZED VIEW oe.orders REFRESH FAST AS
  SELECT * FROM oe.orders@orc1.example.com o
  WHERE EXISTS
    (SELECT * FROM oe.customers@orc1.example.com c
     WHERE o.customer_id = c.customer_id AND c.credit_limit > 10000);

注意:

このoe.ordersマテリアライズド・ビューを作成するには、マスター表のマテリアライズド・ビュー・ログにcredit_limitがログされている必要があります。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

図58-3 多対1副問合せを使用した行のサブセット化

図58-3の説明が続きます
「図58-3 多対1副問合せを使用した行のサブセット化」の説明

この文により作成されるマテリアライズド・ビューは、高速リフレッシュが可能です。信用限度額が10,000ドルを超える新規顧客が発生した場合は、後続のリフレッシュ処理中に新規データがこのマテリアライズド・ビュー・データベースに伝播されます。同様に、顧客の信用限度額が$10,000以下になった場合は、後続のリフレッシュ処理中に、その顧客のデータがこのマテリアライズド・ビューから削除されます。

58.6.2.2 1対多副問合せ

1対多の関係を持つ副問合せを含むマテリアライズド・ビューを作成できます。

oeスキーマにcustomers表とorders表が含まれている場合に、customers表とorders表の両方のデータに基づいたcustomers表のマテリアライズド・ビューを作成するとします。たとえば、営業担当員が、注文合計額が20,000ドルを超える注文を持つすべての顧客を調べる必要があるとします。この場合は、マテリアライズド・ビューの定義問合せに1対多の副問合せを含むマテリアライズド・ビューを作成するのが最も効率的な方法です。

customers表に対するCREATE MATERIALIZED VIEW文の定義問合せには、1対多関係を持つ副問合せが含まれます。つまり、それぞれの顧客が多数の注文をしている可能性があります。

図58-4では、orders表とcustomers表はcustomer_id列を介して関係していることが示されています。営業担当員の目的は、次の文で達成されます。つまり、次の文では、受注合計額が$20,000より大きい全顧客が含まれたマテリアライズド・ビューが作成されます。

CREATE MATERIALIZED VIEW oe.customers REFRESH FAST AS
  SELECT * FROM oe.customers@orc1.example.com c
  WHERE EXISTS
    (SELECT * FROM oe.orders@orc1.example.com o
     WHERE c.customer_id = o.customer_id AND o.order_total > 20000);

注意:

このoe.customersマテリアライズド・ビューを作成するには、ordersマスター表のマテリアライズド・ビュー・ログにcustomer_idorder_totalをロギングする必要があります。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

図58-4 1対多副問合せを使用した行のサブセット化

図58-4の説明が続きます
図58-4 1対多副問合せを使用した行のサブセット化の説明

この文により作成されるマテリアライズド・ビューは、高速リフレッシュが可能です。受注合計額が20,000ドルを超える新規顧客が発生した場合は、後続のリフレッシュ処理中に新規データがこのマテリアライズド・ビュー・データベースに伝播されます。同様に、$20,000を超える受注合計額に含まれている注文を顧客が取り消して、受注合計額が$20,000より低くなった場合は、後続のリフレッシュ処理中に、その顧客のデータがこのマテリアライズド・ビューから削除されます。

58.6.2.3 多対多副問合せ

多対多の関係を持つ副問合せを含むマテリアライズド・ビューを作成できます。

oeスキーマにorder_items表とinventories表が含まれている場合に、inventories表とorder_items表の両方のデータに基づいたinventories表のマテリアライズド・ビューを作成するとします。たとえば、営業担当員が、現在のインベントリ数が1以上の各製品で、製品のproduct_idorder_items表に含まれている全製品のインベントリを調べる必要があるとします。つまり、営業担当員は、顧客が注文した全製品について、インベントリが1以上の製品を調べる必要があります。この場合、インベントリとは、特定の倉庫にある製品の数です。このため、特定の製品は多数の受注項目と多数のインベントリに含まれる可能性があります。

この営業担当員の目的を達成するには、order_items表とinventories表との間の多対多関係に対する副問合せを使用したマテリアライズド・ビューを作成します。

inventoriesマテリアライズド・ビューを作成する場合は、order_items表に含まれている製品に関して、現在の数量が1以上のインベントリを取り出します。図58-5では、inventories表とorder_items表はproduct_id列を介して関係していることが示されています。次の文によりこのマテリアライズド・ビューが作成されます。

CREATE MATERIALIZED VIEW oe.inventories REFRESH FAST AS
  SELECT * FROM oe.inventories@orc1.example.com i
  WHERE i.quantity_on_hand > 0 AND EXISTS
    (SELECT * FROM oe.order_items@orc1.example.com o
     WHERE i.product_id = o.product_id);

注意:

このoe.inventoriesマテリアライズド・ビューを作成するには、マスター表のマテリアライズド・ビュー・ログにorder_itemsマスター表のproduct_id列がログされている必要があります。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

図58-5 多対多副問合せを使用した行のサブセット化

図58-5の説明が続きます
図58-5 多対多副問合せを使用した行のサブセット化の説明

この文により作成されるマテリアライズド・ビューは、高速リフレッシュが可能です。製品に対して1以上のインベントリがorder_items表で見つかった場合は、後続のリフレッシュ処理中に新規データがこのマテリアライズド・ビュー・データベースに伝播されます。同様に、顧客が製品の注文を取り消して、その製品に対する他の注文がorder_items表にない場合は、後続のリフレッシュ処理中に、その製品のインベントリがこのマテリアライズド・ビューから削除されます。

58.6.2.4 副問合せおよびUNIONを使用するマテリアライズド・ビュー

副問合せおよびUNIONを含むマテリアライズド・ビューを作成できます。

1つのマテリアライズド・ビューに、複数の問合せの結果に完全に一致するデータを含める場合は、UNION演算子を使用できます。UNION演算子を使用してマテリアライズド・ビューを作成する場合は、UNION演算子の前後に1つずつSELECT文を使用します。結果のマテリアライズド・ビューには、いずれかの問合せにより選択された行が含まれます。

UNION演算子は、副問合せのWHERE句にOR式を使用せずに「OR」条件を満たす高速リフレッシュ可能なマテリアライズド・ビューを作成する方法として使用できます。副問合せのWHERE句にOR式を使用すると、場合によっては結果のマテリアライズド・ビューが複合マテリアライズド・ビューになり、高速リフレッシュができなくなることがあります。

たとえば、営業担当員が、特定のcategory_idの製品で、カリフォルニアの倉庫にある製品、または翻訳された製品説明(フランス語翻訳用)に「Rouge」という単語が含まれている製品の製品情報を求めているとします。次の文では、UNION演算子と副問合せを使用して、category_id 29の製品について、マテリアライズド・ビューにこのデータを取り出します。

CREATE MATERIALIZED VIEW oe.product_information REFRESH FAST AS
 SELECT * FROM oe.product_information@orc1.example.com pi
 WHERE pi.category_id = 29 AND EXISTS
  (SELECT * FROM oe.product_descriptions@orc1.example.com pd
  WHERE pi.product_id = pd.product_id AND 
        pd.translated_description LIKE '%Rouge%')  
UNION
 SELECT * FROM oe.product_information@orc1.example.com pi
 WHERE pi.category_id = 29 AND EXISTS
  (SELECT * FROM oe.inventories@orc1.example.com i
  WHERE pi.product_id = i.product_id AND EXISTS
    (SELECT * FROM oe.warehouses@orc1.example.com w
    WHERE i.warehouse_id = w.warehouse_id AND EXISTS
      (SELECT * FROM hr.locations@orc1.example.com l
       WHERE w.location_id = l.location_id 
       AND l.state_province = 'California')));   
  

注意:

oe.product_informationマテリアライズド・ビューを作成するには、各マスターのマテリアライズド・ビュー・ログに、oe.product_descriptionsマスター表のtranslated_descriptionhr.locationsマスター表のstate_provinceおよびoe.warehousesマスター表のlocation_id列をロギングする必要があります。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

図58-6に、この文に含まれているマスター表の関係を示します。

図58-6 副問合せおよびUNIONを使用した行のサブセット化

図58-6の説明が続きます
図58-6 副問合せおよびUNIONを使用した行のサブセット化の説明

この文には、UNION演算子の他に次の副問合せが含まれています。

  • product_information表とproduct_descriptions表を参照する副問合せ。1つの製品には複数の製品説明(異なる言語用)があるため、これは1対多副問合せです。

  • product_information表とinventories表を参照する副問合せ。1つの製品は多数のインベントリに含まれることがあるため、これは1対多副問合せです。

  • inventories表とwarehouses表を参照する副問合せ。多数のインベントリを1つの倉庫に格納できるため、これは多対1副問合せです。

  • warehouses表とlocations表を参照する副問合せ。多数の倉庫を1つの場所に配置できるため、これは多対1副問合せです。

この文により作成されるマテリアライズド・ビューは、高速リフレッシュが可能です。カリフォルニアの倉庫に格納されているか、翻訳された製品説明に文字列「Rouge」を含む新製品が追加されると、後続のリフレッシュ処理中に新規データがproduct_informationマテリアライズド・ビューに伝播されます。

58.6.3 副問合せを使用するマテリアライズド・ビューでの制限事項

副問合せを使用するマテリアライズド・ビューの定義問合せには、マテリアライズド・ビューの高速リフレッシュ機能を保つためのいくつかの制限事項があります。

副問合せを使用する高速リフレッシュ・マテリアライズド・ビューの制限事項は、次のとおりです。

  • マテリアライズド・ビューは、主キー・マテリアライズド・ビューである必要があります。

  • マスター表のマテリアライズド・ビュー・ログに、副問合せで参照されている特定の列が含まれている必要があります。含める列の詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

  • 副問合せが多対多または1対多の場合は、主キーの一部ではない結合列をマスター表のマテリアライズド・ビュー・ログに含める必要があります。この制限は、多対1の副問合せには適用されません。

  • 副問合せは、肯定副問合せであることが必要です。たとえば、EXISTS条件は使用できますが、NOT EXISTS条件は使用できません。

  • 副問合せは、EXISTSを使用して各ネスト・レベルを接続する必要があります(INは使用できません)。

  • 各表は1つのEXISTS式にのみ含められます。

  • 結合式では、完全一致または等価比較(等価結合)を使用する必要があります。

  • 各表は副問合せ内で1回のみ結合できます。

  • 各ネスト・レベルの各表に、主キーが存在している必要があります。

  • 各ネスト・レベルでは、上位のレベルの表のみを参照できます。

  • 副問合せにはAND条件を含められますが、各OR条件は1行に含まれている列のみを参照できます。1つの副問合せ内の複数のOR条件は、AND条件を使用して接続できます。

  • 副問合せ内で参照されるすべての表は、同じマスター・データベース内に存在する必要があります。

注意:

CREATE MATERIALIZED VIEW文にON PREBUILT TABLE句および副問合せが含まれている場合、この副問合せは多対多として扱われます。したがって、この場合は、結合列をマテリアライズド・ビュー・ログに記録する必要があります。CREATE MATERIALIZED VIEW文のON PREBUILT TABLE句の詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。

58.6.4 副問合せを含むUNIONを使用するマテリアライズド・ビューでの制限事項

副問合せを含むUNIONを使用する高速リフレッシュのマテリアライズド・ビューには、制限事項があります。

副問合せを含むUNIONを使用する高速リフレッシュ・マテリアライズド・ビューには、次の制限事項があります。

58.6.4.1 副問合せを含むUNIONを使用するマテリアライズド・ビューの例

副問合せを含むUNIONを使用するマテリアライズド・ビューを作成する例を示します。

次の文は、oe.ordersマテリアライズド・ビューを作成します。各UNIONブロック内の副問合せが、「副問合せを使用するマテリアライズド・ビューでの制限事項」で説明した副問合せに関する制限事項を満たしているため、このマテリアライズド・ビューは高速リフレッシュができます。

CREATE MATERIALIZED VIEW oe.orders REFRESH FAST AS
  SELECT * FROM oe.orders@orc1.example.com o
  WHERE EXISTS
    (SELECT * FROM oe.customers@orc1.example.com c
     WHERE o.customer_id = c.customer_id 
     AND c.credit_limit > 50)
UNION    
  SELECT * 
  FROM oe.orders@orc1.example.com o
  WHERE EXISTS
    (SELECT * FROM oe.customers@orc1.example.com c
     WHERE o.customer_id = c.customer_id 
     AND c.account_mgr_id = 30);  

副問合せには、各表は1つのEXISTS式にしか含められないという制限事項があります。ここでは、customers表が2つのEXISTS式で使用されていますが、これらのEXISTS式は別々のUNIONブロックにあります。「副問合せを使用するマテリアライズド・ビューでの制限事項」で説明した制限事項は、各UNIONブロックに対してのみ適用されるもので、CREATE MATERIALIZED VIEW文全体に適用されるものではないため、このマテリアライズド・ビューは高速リフレッシュが可能です。

これに対して、次の文で作成されたマテリアライズド・ビューは高速リフレッシュができません。これは、orders表が同一UNIONブロック内の2つのEXISTS式で参照されているためです。

CREATE MATERIALIZED VIEW oe.orders AS
  SELECT * FROM oe.orders@orc1.example.com o
  WHERE EXISTS
    (SELECT * FROM oe.customers@orc1.example.com c
     WHERE o.customer_id = c.customer_id  -- first reference to orders table
     AND c.credit_limit > 50
     AND EXISTS
        (SELECT * FROM oe.orders@orc1.example.com o
         WHERE order_total > 5000 
         AND o.customer_id = c.customer_id)) -- second reference to orders table
UNION    
  SELECT * 
  FROM oe.orders@orc1.example.com o
  WHERE EXISTS
    (SELECT * FROM oe.customers@orc1.example.com c
     WHERE o.customer_id = c.customer_id 
     AND c.account_mgr_id = 30);  

58.7 マテリアライズド・ビューのリフレッシュ

マテリアライズド・ビューとマスター表との一貫性を確保するには、マテリアライズド・ビューを定期的にリフレッシュする必要があります。

マテリアライズド・ビューをリフレッシュするには、次の3つの方法があります。

  • マテリアライズド・ビュー・ログを使用して、最後のリフレッシュ以降に変更されている行のみを更新する高速リフレッシュ

  • マテリアライズド・ビュー全体を更新する完全リフレッシュ

  • 可能なときに高速リフレッシュを実行する強制リフレッシュ。高速リフレッシュが実行できない場合は、完全リフレッシュが実行されます。

58.8 リフレッシュ・グループ

マテリアライズド・ビュー間のトランザクションの一貫性を保つことが重要なときは、マテリアライズド・ビューをリフレッシュ・グループに編成できます。

リフレッシュ・グループをリフレッシュすることで、リフレッシュ・グループ内のすべてのマテリアライズド・ビューのデータが、トランザクションの一貫性を保つ特定の時点のデータと確実に一致します。リフレッシュ・グループ内のマテリアライズド・ビューを個別にリフレッシュすることも可能ですが、リフレッシュ・グループ内のその他のマテリアライズド・ビューはリフレッシュされないため、リフレッシュ・グループを編成する意味がなくなります。

58.9 マテリアライズド・ビュー・ログ

マテリアライズド・ビュー・ログは、マテリアライズド・ビューのマスター表が含まれているデータベースの表です。マスター表へのすべてのDML変更が記録されます。

マテリアライズド・ビュー・ログは単一のマスター表に関連付けられ、マスター表からリフレッシュされるマテリアライズド・ビューの数とは無関係に、各マスター表のマテリアライズド・ビュー・ログは1つのみです。マテリアライズド・ビューの高速リフレッシュは、マテリアライズド・ビューのマスター表にマテリアライズド・ビュー・ログが存在する場合のみ可能です。マテリアライズド・ビューを高速リフレッシュすると、マテリアライズド・ビューと対応付けられたマテリアライズド・ビュー・ログのエントリで、最後のリフレッシュ以降に追加されたエントリがマテリアライズド・ビューに適用されます。

58.10 マテリアライズド・ビューおよびユーザー定義のデータ型

ユーザー定義データ型を含むマテリアライズド・ビューには、特別な考慮事項があります。

58.10.1 オブジェクト型およびコレクションでのマテリアライズド・ビューの動作方法

レプリケーション環境で、マスター・データベースとマテリアライズド・ビュー・データベース間でオブジェクト型およびオブジェクトをレプリケートできます。

Oracleのオブジェクトはユーザー定義データ型で、これを使用すると現実の複雑なエンティティ(顧客や注文など)をデータベース内に単一エンティティ(オブジェクト)としてモデル化できます。オブジェクト型は、CREATE TYPE ... AS OBJECT文を使用して作成します。

表の1列を占有するOracleオブジェクトを、列オブジェクトと呼びます。一般に、列オブジェクトが含まれている表にはその他の列も含まれており、このような列のデータ型は組込みデータ型(VARCHAR2NUMBERなど)の場合があります。オブジェクト表は、すべての行がオブジェクトを表す特殊な表です。オブジェクト表の各行は行オブジェクトです。

コレクションをレプリケートすることもできます。コレクションとは、VARRAYデータ型およびネストした表のデータ型に基づいたユーザー定義データ型です。VARRAYはCREATE TYPE ... AS VARRAY文を、ネストした表はCREATE TYPE ... AS TABLE文を使用して作成します。

注意:

  • ユーザー定義型またはOracle提供の型を含むマスター表に基づいてコミット時にリフレッシュするマテリアライズド・ビューを作成することはできません。ON COMMITオプションが指定されたマテリアライズド・ビューとは、CREATE MATERIALIZED VIEW文でON COMMIT REFRESH句を使用して作成するマテリアライズド・ビューです。

  • タイプ継承およびNOT FINAL句で作成されたタイプはサポートされません。

関連項目:

58.10.2 レプリケーション・データベースでの型の一致

ユーザー定義型には、オブジェクト、ネストした表、VARRAY、索引タイプなど、CREATE TYPE文で作成された型がすべて含まれます。ユーザー定義型に基づいてスキーマ・オブジェクトをレプリケートするには、マスター・データベースおよびマテリアライズド・ビュー・データベースに、それらのユーザー定義型が存在し、それらが同一である必要があります。

ユーザー定義型とそれに基づいたスキーマ・オブジェクトをレプリケートする場合は、次の条件が適用されます。

  • マスター・データベースとマテリアライズド・ビュー・データベースでレプリケートされるユーザー定義型は、これらの型に依存するマテリアライズド・ビューを作成する前にマテリアライズド・ビュー・データベースで作成する必要があります。

  • ユーザー定義型を含むマテリアライズド・ビューを作成するには、マテリアライズド・ビューの基になるすべてのマスター表が同一のマスター・データベースに存在する必要があります。

  • ユーザー定義型は、すべてのデータベースで同一である必要があります。

    • レプリケートされる各ユーザー定義型について、オブジェクト識別子(OID)、スキーマ所有者および型の名前を全レプリケーション・データベースで同一にする必要があります。

    • ユーザー定義型がオブジェクト型の場合は、オブジェクト型の属性の順序とデータ型がすべてのデータベースで一致している必要があります。属性の順序とデータ型は、オブジェクト型を作成するときに設定します。たとえば、次のようなオブジェクト型の場合を考えます。

      CREATE TYPE cust_address_typ AS OBJECT
           (street_address     VARCHAR2(40), 
            postal_code        VARCHAR2(10), 
            city               VARCHAR2(30), 
            state_province     VARCHAR2(10), 
            country_id         CHAR(2));
      /
      

      すべてのデータベースで、street_addressはこの型の最初の属性でVARCHAR2(40)postal_codeは2番目の属性でVARCHAR2(10)cityは3番目の属性でVARCHAR2(30)、というようになっている必要があります。

    • すべてのデータベースで、ユーザー定義型のハッシュコードが一致している必要があります。Oracleでは、ユーザー定義型が検査され、ハッシュコードが割り当てられます。この検査では、型の属性、属性の順序および型の名前が調べられます。複数の型についてこれらの項目がすべて同じである場合、型のハッシュコードは同じです。型のハッシュコードは、DBA_TYPE_VERSIONSデータ・ディクショナリ・ビューを問い合せて表示できます。

型を作成するには、マテリアライズド・ビュー・データベースでCREATE TYPE文を使用できます。型を使用する読取り専用マテリアライズド・ビュー・を作成するには、これを行うことが必要な場合があります。

この方法を選択する場合は、次のことを確認する必要があります。

  • マテリアライズド・ビュー・データベースとマスター・データベースで型が同一スキーマ内にあること。

  • マテリアライズド・ビュー・データベースとマスター・データベースで型の属性および順序が同一であること。

  • マテリアライズド・ビュー・データベースとマスター・データベースで型の各属性のデータ型が同一であること。

  • マテリアライズド・ビュー・データベースとマスター・でたべで型のオブジェクト識別子が同一であること。

型のオブジェクト識別子は、DBA_TYPESデータ・ディクショナリ・ビューを問い合せると検出できます。たとえば、cust_address_typのオブジェクト識別子(OID)を検出するには、次の問合せを入力します。

SELECT TYPE_OID FROM DBA_TYPES WHERE TYPE_NAME = 'CUST_ADDRESS_TYP';

TYPE_OID
--------------------------------
6F9BC33653681B7CE03400400B40A607

たとえば、マスター・データベースでの型のOIDを知ることができたら、次のステップを実行して、マテリアライズド・ビュー・サイトでこの型を作成できます。

  1. マスター・データベースでこの型を所有するユーザーとして、マテリアライズド・ビュー・データベースにログインします。このユーザーがマテリアライズド・ビュー・データベースに存在しない場合は、ユーザーを作成します。

  2. CREATE TYPE文を発行し、OIDを指定します。

    CREATE TYPE oe.cust_address_typ OID '6F9BC33653681B7CE03400400B40A607' 
         AS OBJECT (
         street_address     VARCHAR2(40), 
         postal_code        VARCHAR2(10), 
         city               VARCHAR2(30), 
         state_province     VARCHAR2(10), 
         country_id         CHAR(2));
    /
    

これで、マテリアライズド・ビュー・データベースでこの型を使用できるようになりました。

58.10.3 列オブジェクトを使用したマスターの列のサブセット化

読取り専用マテリアライズド・ビューでは、その他の属性はレプリケートせずに列オブジェクトの特定の属性のみをレプリケートできます。

たとえば、前述のcust_address_typユーザー定義データ型を使用して、customers_subマスター表がマスター・データベースorc1.example.comに作成されているとします。

CREATE TABLE oe.customers_sub (
      customer_id        NUMBER(6)  PRIMARY KEY, 
      cust_first_name    VARCHAR2(20), 
      cust_last_name     VARCHAR2(20),
      cust_address       oe.cust_address_typ);

次の読取り専用マテリアライズド・ビューをリモート・マテリアライズド・ビュー・データベースに作成できます。

CREATE MATERIALIZED VIEW oe.customers_mv1 AS
   SELECT customer_id, cust_last_name, c.cust_address.postal_code
   FROM oe.customers_sub@orc1.example.com c;

ここでは、postal_code属性がcust_address列オブジェクト内に指定されています。

58.10.4 オブジェクト表に基づいたマテリアライズド・ビュー

オブジェクト表に基づいてマテリアライズド・ビューを作成できます。

58.10.4.1 オブジェクト表に基づいたマテリアライズド・ビューについて

マテリアライズド・ビューがオブジェクト表に基づいてOF type句を使用して作成されている場合、このマテリアライズド・ビューはオブジェクト・マテリアライズド・ビューと呼ばれます。

オブジェクト・マテリアライズド・ビューは、オブジェクト表と同じ構造です。つまり、オブジェクト・マテリアライズド・ビューは行オブジェクトで構成されます。

オブジェクト表に基づいたマテリアライズド・ビューをOF type句を使用せずに作成した場合、そのマテリアライズド・ビューはオブジェクト・マテリアライズド・ビューではありません。つまり、このようなマテリアライズド・ビューには、行オブジェクトではなく通常の行が含まれています。

オブジェクト表に基づいたマテリアライズド・ビューを作成するには、マテリアライズド・ビューが依存する型がマテリアライズド・ビュー・データベースに存在する必要があり、それぞれの型はマスター・データベースと同じオブジェクト識別子を持つ必要があります。

関連項目:

オブジェクト・マテリアライズド・ビューを作成する例は、「読取り専用マテリアライズド・ビューの作成」

58.10.4.2 オブジェクト表に基づいてOF type句を使用せずに作成したマテリアライズド・ビュー

OF type句を使用せずに、オブジェクト表に基づいてマテリアライズド・ビューを作成すると、マテリアライズド・ビューでは、基になるオブジェクト表のオブジェクト・プロパティが失われます。

つまり、作成された読取り専用マテリアライズド・ビューにはマスター表の列が1つ以上含まれますが、それぞれの行はリレーショナル表の行として機能します。行は行オブジェクトではありません。

たとえば、次のSQL文を使用して、categories_tabマスター表に基づいたマテリアライズド・ビューを作成できます。

CREATE MATERIALIZED VIEW oe.categories_relmv
   AS SELECT * FROM oe.categories_tab@orc1.example.com;

この場合、このマテリアライズド・ビューの行は、リレーショナル表の行と同様に機能します。

58.10.4.3 オブジェクト・マテリアライズド・ビューでのOIDの保持

オブジェクト・マテリアライズド・ビューは、マスターのオブジェクト識別子(OID)指定を継承します。

マスター表に主キー・ベースのOIDがある場合、マテリアライズド・ビューの行オブジェクトのOIDは主キー・ベースになります。マスター表にシステム生成されたOIDがある場合、マテリアライズド・ビューの行オブジェクトのOIDはシステム生成されたOIDです。また、オブジェクト・マテリアライズド・ビューの各行のOIDは、マスター表内の同じ行のOIDと一致し、マテリアライズド・ビューのリフレッシュ中、OIDは保持されます。その結果、オブジェクト表の行へのREFは、マテリアライズド・ビュー・データベースで有効なままです。

58.10.5 コレクション列を含むマテリアライズド・ビュー

コレクション列とは、VARRAYデータ型およびネストした表のデータ型に基づいた列です。Oracleではコレクション列を含むマテリアライズド・ビューの作成をサポートしています。

コレクション列がネストした表の場合は、マテリアライズド・ビューの作成中にオプションとしてnested_table_storage_clauseを指定できます。nested_table_storage_clauseを使用すると、ネストした表用の記憶表の名前をマテリアライズド・ビューに指定できます。

たとえば、マスター・データベースorc1.example.comにマスター表people_reltabを作成し、この表にネストした表phones_ntabが含まれているとします。

CREATE TYPE oe.phone_typ AS OBJECT (
   location    VARCHAR2(15),
   num         VARCHAR2(14));
/

CREATE TYPE oe.phone_ntabtyp AS TABLE OF oe.phone_typ;
/

CREATE TABLE oe.people_reltab (
   id               NUMBER(4) CONSTRAINT pk_people_reltab PRIMARY KEY,
   first_name       VARCHAR2(20),
   last_name        VARCHAR2(20),
   phones_ntab      oe.phone_ntabtyp)
   NESTED TABLE phones_ntab STORE AS phone_store_ntab
   ((PRIMARY KEY (NESTED_TABLE_ID, location)));

このSQL文の最後の行のPRIMARY KEY指定に注意してください。親表に基づいてマテリアライズド・ビューを作成する場合は、記憶表に主キーを指定する必要があります。この例では、記憶表はphone_store_ntabで、親表はpeople_reltabです。

高速リフレッシュ可能なマテリアライズド・ビューを作成する場合は、親表と記憶表の両方にマテリアライズド・ビュー・ログを作成し、ネストした表の列を親表のマテリアライズド・ビュー・ログのフィルタ列として指定します。

CREATE MATERIALIZED VIEW LOG ON oe.people_reltab;

ALTER MATERIALIZED VIEW LOG ON oe.people_reltab ADD(phones_ntab);

CREATE MATERIALIZED VIEW LOG ON oe.phone_store_ntab WITH PRIMARY KEY;

マテリアライズド・ビュー・データベースで、各型のオブジェクト識別子がマスター・データベースのオブジェクト識別子と同じになるように、必要な型を作成します。この後、people_reltabに基づいてマテリアライズド・ビューを作成し、次の文を使用してその記憶表を指定できます。

CREATE MATERIALIZED VIEW oe.people_reltab_mv
   NESTED TABLE phones_ntab STORE AS phone_store_ntab_mv 
   REFRESH FAST AS SELECT * FROM oe.people_reltab@orc1.example.com;

この場合、nested_table_storage_clauseは前述の例の「NESTED TABLE」で始まる行であり、これによって記憶表の名前がphone_store_ntab_mvであることを指定します。nested_table_storage_clauseはオプションです。この句を指定しない場合、Oracleデータベースにより自動的に記憶域表の名前が付けられます。記憶表の名前を表示するには、DBA_NESTED_TABLESデータ・ディクショナリ表を問い合せます。

記憶表には次の特性があります。

  • 個別のセカンダリ・マテリアライズド・ビューです。

  • ネストした表を含むマテリアライズド・ビューをリフレッシュすると、自動的にリフレッシュされます。

  • ネストした表を含むマテリアライズド・ビューを削除すると、自動的に削除されます。

  • マスターの記憶表の主キー制約を継承します。

記憶表はマスター表の記憶表の主キー制約を継承するため、STORE AS句にはPRIMARY KEYを指定しないでください。

マテリアライズド・ビュー内のネストした表の記憶表に対して次のアクションを直接実行することはできません。

  • 記憶表のリフレッシュ

  • 記憶表の変更

  • 記憶表の削除

  • 記憶表に対するレプリケーション・サポートの生成

これらのアクションは、ネストした表を含むマテリアライズド・ビューに対する実行時に間接的に発生します。さらに、記憶表内の列のサブセットはレプリケートできません。

関連項目:

nested_table_col_propertiesの詳細は、『Oracle Database SQL言語リファレンス』CREATE TABLE文に関する説明を参照してください。

58.10.5.1 コレクション列を含むマテリアライズド・ビューに関する制限事項

コレクション列を含むマテリアライズド・ビューに制限が適用されます。

次の制限があります。

  • コレクション列の行のサブセット化はできません。ただし、ネストした表の親表に対しては行のサブセット化を使用でき、その結果、マスター・マテリアライズド・ビューのネストした表がサブセット化されます。

  • コレクション列の列のサブセット化はできません。

  • ネストした表の記憶表には主キーが必要です。

  • ネストした表の親表で高速リフレッシュ可能にするには、親表とネストした表の両方の記憶表にマテリアライズド・ビュー・ログが必要です。

58.10.6 REF列を含むマテリアライズド・ビュー

マテリアライズド・ビューにREF列を含めることができます。

58.10.6.1 REF列を含むマテリアライズド・ビューについて

REF列を含むマテリアライズド・ビューを作成できます。REFとはOracleの組込みデータ型で、オブジェクト表内の行オブジェクトを指す論理的なポインタです。

有効範囲付きREFは、指定されたオブジェクト表のみへの参照を含めることができるREFで、有効範囲なしREFは、データベース内で対応するオブジェクト型に基づいたすべてのオブジェクト表に対する参照を含めることができます。有効範囲付き REFは、有効範囲なしREFと比べて必要とする記憶領域が少なく、より効率的なアクセスを提供します。

マテリアライズド・ビューの作成時に、マテリアライズド・ビュー・データベースのローカル・マテリアライズド・ビューまたは表にREF列の有効範囲を再指定できます。有効範囲を再指定しない場合、REF列はリモートのマスター表を指し続けます。有効範囲なしのREF列は、常にマスター表を指し続けます。マテリアライズド・ビュー・データベースのREF列がリモート・マスター表を指す場合、REFは参照先がないとみなされます。SQLでは、参照先がないREFを参照解除すると、NULLが返されます。また、PL/SQLではUTL_OBJECTパッケージを使用したREFの参照解除のみがサポートされ、参照先がないREFに対しては例外が発生します。

58.10.6.2 有効範囲付きREF列

有効範囲付きREF列を含むマスター表に基づいてマテリアライズド・ビューを作成する場合は、マテリアライズド・ビュー・データベースの別のオブジェクト表またはオブジェクト・マテリアライズド・ビューにREFの有効範囲を再指定できます。

通常、REF列の有効範囲は、元のリモート・オブジェクト表ではなくローカル・オブジェクト・マテリアライズド・ビューに変更します。マテリアライズド・ビューの有効範囲を変更するには、CREATE MATERIALIZED VIEW文にSCOPE FOR句を使用するか、マテリアライズド・ビューを作成した後でALTER MATERIALIZED VIEW文を使用します。REF列の有効範囲を変更しないと、マテリアライズド・ビューはマスター表のREF列をそのまま保持します。

たとえば、次の文を使用してorc1.example.comマスター・データベースにcustomers_with_refマスター表を作成するとします。

-- Create the user-defined data type cust_address_typ.
CREATE TYPE oe.cust_address_typ AS OBJECT
   (street_address     VARCHAR2(40),
    postal_code        VARCHAR2(10),
    city               VARCHAR2(30),
    state_province     VARCHAR2(10),
    country_id         CHAR(2));
/

-- Create the object table cust_address_objtab.
CREATE TABLE oe.cust_address_objtab OF oe.cust_address_typ;

-- Create table with REF to cust_address_typ.
CREATE TABLE oe.customers_with_ref (
    	 customer_id        NUMBER(6) PRIMARY KEY, 
     cust_first_name    VARCHAR2(20), 
     cust_last_name     VARCHAR2(20),
     cust_address       REF oe.cust_address_typ 
                          SCOPE IS oe.cust_address_objtab);

マスター・データベースの型と同じオブジェクト識別子を持つcust_address_typがマテリアライズド・ビュー・データベースにあると仮定した場合、次の文を使用するとcust_address_objtab_mvオブジェクト・マテリアライズド・ビューを作成できます。

CREATE MATERIALIZED VIEW oe.cust_address_objtab_mv OF oe.cust_address_typ AS 
   SELECT * FROM oe.cust_address_objtab@orc1.example.com;

これで、次の文を使用してcustomers_with_refマスター表のマテリアライズド・ビューを作成し、REFの有効範囲をcust_address_objtab_mvマテリアライズド・ビューに変更できます。

CREATE MATERIALIZED VIEW oe.customers_with_ref_mv
   (SCOPE FOR (cust_address) IS oe.cust_address_objtab_mv)
   AS SELECT * FROM oe.customers_with_ref@orc1.example.com;

マテリアライズド・ビューを作成するときにSCOPE FOR句を使用する場合は、SCOPE FOR句に指定するマテリアライズド・ビューまたは表を先に作成する必要があります。そうしないと、マテリアライズド・ビューの作成中にSCOPE FOR句を指定できません。たとえば、cust_address_objtab_mvマテリアライズド・ビューを作成する前に、customers_with_ref_mvマテリアライズド・ビューを作成すると、customers_with_ref_mvマテリアライズド・ビューを作成するときにSCOPE FOR句を使用できません。この場合、REFはリモート・マスター・データベースのオブジェクト表を指すため、参照先がないとみなされます。

ただし、マテリアライズド・ビューを作成するときにSCOPE FOR句を使用しない場合でも、SCOPE FOR句を指定するようにマテリアライズド・ビューを変更できます。たとえば、次の文でcustomers_with_ref_mvマテリアライズド・ビューを変更できます。

ALTER MATERIALIZED VIEW oe.customers_with_ref_mv
   MODIFY SCOPE FOR (cust_address) IS oe.cust_address_objtab_mv;
58.10.6.3 有効範囲なしのREF列

有効範囲なしのREF列を含むリモート・マスター表に基づいてマテリアライズド・ビューを作成した場合、マテリアライズド・ビューにREF列は作成されますが、REFはリモート・データベースを指すため参照先がないとみなされます。

58.10.6.4 マテリアライズド・ビュー・ログへのREF列のロギング

必要な場合、マテリアライズド・ビュー・ログにREF列を記録できます。

58.10.6.5 WITH ROWID句を使用して作成されたREF

REF列にWITH ROWID句が指定されている場合、Oracle DatabaseはREFで参照されているオブジェクトの行IDを維持します。

Oracleデータベースでは、REFに含まれている行IDを使用して、参照されているオブジェクトを直接検出できます(OID索引から行IDをフェッチする必要はありません)。したがって、WITH ROWID句は行IDヒントを指定するために使用します。WITH ROWID句は、有効範囲付きREFに対してはサポートされていません。

WITH ROWID句を使用して作成されたREFをレプリケートした場合、REFが最初に作成または変更されたデータベースを除き、各レプリケーション・データベースの行IDヒントは正しくありません。他のデータベースではREFROWID情報は無意味であり、Oracleデータベースでは行IDヒントは自動的に修正されません。無効な行IDヒントは、パフォーマンス上の問題の原因になります。この場合は、ANALYZE TABLE文のVALIDATE STRUCTUREオプションを使用して、各レプリケーション・データベースの正しくない行IDヒントを判断できます。

関連項目:

ANALYZE TABLE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

58.11 マスター・データベースでのマテリアライズド・ビューの登録

マスター・データベースでは、マスター表に基づいてマテリアライズド・ビューの情報がOracleデータベースにより自動的に登録されます。

58.11.1 登録されたマテリアライズド・ビューに関する情報の表示

マテリアライズド・ビューは、そのマスター・データベースに登録されます。

マスター・データベースのDBA_REGISTERED_MVIEWSデータ・ディクショナリ・ビューの問合せにより、リモート・マテリアライズド・ビューに関する次の情報が表示されます。

  • 所有者、名前およびマテリアライズド・ビューを含むデータベース

  • マテリアライズド・ビューの定義問合せ

  • マテリアライズド・ビューのその他の特性(リフレッシュ方式など)

また、マスター・データベースのDBA_MVIEW_REFRESH_TIMESビューの問合せにより、各マテリアライズド・ビューの最後のリフレッシュ時間を取得できます。管理者は、この情報を使用してマテリアライズド・ビューのアクティビティを監視し、マスター表またはマスター・マテリアライズド・ビューの削除、変更または再配置が必要な場合にマテリアライズド・ビュー・データベースへの変更を調整できます。

58.11.2 内部メカニズム

Oracleデータベースでは、マテリアライズド・ビューが作成されると自動的にマスター・データベースに登録され、マテリアライズド・ビューが削除されると登録解除されます。

注意:

Oracleデータベースでは、マテリアライズド・ビューの作成時または削除時に、マスター・データベースでマテリアライズド・ビューが登録または登録解除されることを保証できません。作成時にOracleデータベースがマテリアライズド・ビューを正常に登録できない場合は、DBMS_MVIEWパッケージ内のREGISTER_MVIEWプロシージャを使用して手動で登録を完了する必要があります。マテリアライズド・ビューの削除時に、Oracleデータベースがマテリアライズド・ビューを正常に登録解除できない場合は、手動で登録を解除するまで、マスター・データベースにマテリアライズド・ビューの登録情報が保持され続けます。複合マテリアライズド・ビューは登録されない場合があります。

58.11.3 マテリアライズド・ビューの手動による登録

必要な場合は、登録を手動でメンテナンスできます。

マテリアライズド・ビューの登録情報を追加、変更または削除するには、マスター・データベースのDBMS_MVIEWパッケージ内のREGISTER_MVIEWおよびUNREGISTER_MVIEWプロシージャを使用します。

関連項目:

REGISTER_MVIEWプロシージャおよびUNREGISTER_MVIEWプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。