10 Oracle RACでのIM列ストアのデプロイ

この章では、Oracle Real Application Clusters (Oracle RAC)環境でIM列ストアを使用可能にする方法、およびオブジェクトを移入のために構成する方法について説明します。

この項では、次の項目について説明します。

10.1 Database In-MemoryおよびOracle RACの概要

すべてのOracle RACノードには、独自のインメモリー(IM)列ストアがあります。デフォルトでは、移入されたオブジェクトは、クラスタ内のすべてのIM列ストアにわたり分散されます。

すべてのOracle RACノードでIM列ストアを同じサイズにすることをお薦めしますOracle RACノードがIM列ストアを必要としない場合、INMEMORY_SIZEパラメータを0に設定します。

完全に異なるオブジェクトを各ノードに移入させたり、より大きなオブジェクトをクラスタ内のすべてのIM列格納間で分散させることが可能です。Oracle Engineered Systemsでは、同じオブジェクトを各ノードのIM列ストアに表示させることも可能です。クラスタ内のIM列ストア間のオブジェクトの分散は、INMEMORY属性への追加の副句(DISTRIBUTEおよびDUPLICATE)により制御されます。

Oracle RAC環境では、指定されたINMEMORY属性のみを含むオブジェクトが、クラスタ内のIM列ストア間で自動的に分散されます。DISTRIBUTE句を使用して、クラスタ間でのオブジェクトの分散方法を指定できます。デフォルトで、使用されるパーティション化のタイプ(ある場合)によりオブジェクトの分散方法が決定されます。オブジェクトがパーティション化されないと、ROWID範囲に分散されます。あるいは、DISTRIBUTE句を指定して、デフォルトの動作をオーバーライドできます。

Oracle Engineered Systemでは、クラスタ内のIM列ストア間で移入されたオブジェクトを複製またはミラー化できます。この技法により最高レベルの冗長性が提供されます。DUPLICATE句は、オブジェクトの複製方法を制御します。DUPLICATEのみを指定すると、データのミラー化されたコピーが1つ、クラスタ内のIM列ストア間で分散されます。各IM列ストア内のすべてのオブジェクトを複製するには、DUPLICATE ALLを指定します。

ノート:

非エンジニアド・システムでOracle RACにデプロイする場合、DUPLICATE句はNO DUPLICATEとして扱われます。

10.1.1 複数のIM列ストア

Oracle RACでは、各データベース・インスタンスには固有のIM列ストアがあります。

概念上、Oracle RAC環境内のIM列ストアでは、シェアード・ナッシング・アーキテクチャが使用されます。各データベース・インスタンスで、別個にIM列ストアをサイズ設定および管理します。データベース・インスタンスで、キャッシュ・フュージョンを使用してIMCUがあちこちへ転送されることはありません

図10-1 Oracle RACデータベース内のIM列ストア

この図は、ノード2つのOracle RACクラスタを示しています。各インスタンスには、別々に構成されたIM列ストアがあります。

図10-1の説明が続きます
「図10-1 Oracle RACデータベース内のIM列ストア」の説明

すべてのOracle RACノードでIM列ストアのサイズを等しく設定することをお薦めします。たとえば、どのIM列ストアにも100 GBのメモリーを割り当てることができます。IM列ストアを必要としないノードの場合は、このノードに対してINMEMORY_SIZE初期化パラメータを0に設定します。

図10-2 2つのIM列ストアがある、ノード3つのOracle RACデータベース

この例では、インスタンス1およびインスタンス2にIM列ストアがあります。インスタンス3ではIM列ストアは必要ないため、このノードに対するINMEMORY_SIZE初期化パラメータは0に設定されています。

図10-2の説明が続きます
「図10-2 2つのIM列ストアがある、ノード3つのOracle RACデータベース」の説明

10.1.2 Oracle RACでの列データの分散および複製

INMEMORYが指定されると、DISTRIBUTEおよびDUPLICATEキーワードはオブジェクトの分散を制御します。

Oracle RACには、複数の分散オプションが用意されています。ノードごとに異なるオブジェクトを移入することや、大きなオブジェクトをOracle RACクラスタ内のすべてのIM列ストアにわたり分散することができます。同じオブジェクトを各ノード(Oracle Engineered Systems上のみ)のIM列ストアに移入することもできます。

ノート:

表が現在IM列ストアに移入されており、PRIORITY以外の表のINMEMORY属性を変更した場合は、データベースでその表がIM列ストアから除去されます。再移入の動作は、PRIORITY設定によって異なります。

この項では、次の項目について説明します。

10.1.2.1 Oracle RACでの列データの分散

INMEMORYDISTRIBUTE句は、IM列ストア内の表データを複数のOracle RACインスタンスにわたりどのように分散するかを制御します。

デフォルト・オプションAUTOが設定されている場合は、Oracle RACインスタンスにより、データが自動的に分散されます。セグメントの移入中に、領域管理スレーブ・プロセス(Wnnn)により、各インスタンスに同量のデータの配置が試みられます。分散は、アクセス・パターンおよびオブジェクト・サイズによって異なります。もう1つの方法として、データベースでパーティション、サブパーティションまたはROWID範囲をインスタンス間で分散するやり方を手動で指定することもできます。

パフォーマンスのためには、同量のデータ分散が重要となります。目的は、パラレル問合せプロセスで等しいデータ・セット・サイズを処理することで、それらすべてが最小限の時間で終了するようにすることです。データ分散が偏ると、実行時間の長いプロセスによって問合せの完了が遅くなります。

Oracle RACインスタンスに障害が発生すると、障害が発生したインスタンス上のIMCUが利用不可になります。その結果、アクセス不可のIMCUに格納されているデータを必要とする問合せでは、データベース・バッファ・キャッシュ、フラッシュ・ストレージ、ディスク、または他のIM列ストア内のミラー済IMCUなど、別の場所からそれを読み取ることが必要になります。

DBA_TABLES.INMEMORY_DISTRIBUTE列は、IMCUをどのように分散するかを示します。AUTOオプションが設定されている場合、この列値はAUTO-DISTRIBUTEとなります。

例10-1 デフォルトの分散

この例では、パーティションsales_2013_ptおよびsales_2014_ptのみを含むsales表を分散するデータベースを示します。データベースでは、自動的にsales_2013_ptパーティションがインスタンス1に、sales_2014_ptがインスタンス2に配置されます。

図10-3 Oracle RACでの自動的なインメモリー分散

図10-3の説明が続きます
「図10-3 Oracle RACでの自動的なインメモリー分散」の説明

この項では、次の項目について説明します。

関連項目:

10.1.2.1.1 パーティションによる分散

DISTRIBUTE BY PARTITION句を使用して、パーティション内のデータを様々なOracle RACインスタンスに分散できます。

この手法は、ハッシュ・パーティションに適しています。たとえば、orders表内のパーティションを等しく分散するには、order_id列でハッシュによって分配します。次の図に示すように、Oracle Databaseでは、order_id列でハッシュすることで4つのインスタンスにわたりパーティションが分散されます。

図10-4 ハッシュによるパーティションの分散

図10-4の説明が続きます
「図10-4 ハッシュによるパーティションの分散」の説明

この手法は、複数パーティションが均一にアクセスされる場合のその他のパーティション化スキームに適しています。DISTRIBUTE BY PARTITION句では、パーティション・ワイズ結合もサポートされています。

ノート:

パーティション化戦略によって大規模なデータ・スキューが生じる場合、つまり、あるパーティションが他のパーティションよりも非常に大きい場合は、DISTRIBUTE BY ROWID RANGEを手動で指定することでデフォルトの分散(BY PARTITION)をオーバーライドすることをお薦めします。

関連項目:

10.1.2.1.2 サブパーティションによる分散

コンポジット・パーティション化スキームを使用する表では、DISTRIBUTE BY SUBPARTITION句を使用して、サブパーティション内のデータを様々なインスタンスに分散できます。

この手法は、ハッシュ・サブパーティションに適しています。たとえば、orders表内のパーティションを等しく分散するには、order_date列で範囲によって、またはorder_id列でハッシュによって分配します。

図10-5 範囲によるパーティションの分散とハッシュによるサブパーティションの分散

図10-5の説明が続きます
「図10-5 範囲によるパーティションの分散とハッシュによるサブパーティションの分散」の説明

この手法は、複数サブパーティションが均一にアクセスされる場合のその他のパーティション化スキームに適しています。DISTRIBUTE BY PARTITION ... SUBPARTITION句では、パーティション・ワイズ結合もサポートされています。

関連項目:

10.1.2.1.3 ROWID範囲による分散

DISTRIBUTE BY ROWID RANGE句を使用して、特定のROWID範囲内のデータを様々なOracle RACインスタンスに分散できます。

この手法では、最初のROWIDに対する均一ハッシュによってIMCUが分散されます。たとえば、Oracle Databaseでorders表内の行1から105までをあるデータベース・インスタンスに分散し、行106から121までを別のインスタンスに分散するといったことができます。

図10-6 ROWID範囲による分散

図10-6の説明が続きます
「図10-6 ROWID範囲による分散」の説明

ROWIDの分散手法は、パーティション化されていない表に最も役立ちます。ただし、パーティション化戦略によって大規模なデータ・スキューが生じる場合、たとえば、あるパーティションが他のパーティションよりも非常に大きい場合は、DISTRIBUTE BY ROWID RANGEを手動で指定することでデフォルトの分散(BY PARTITION)をオーバーライドすることをお薦めします。

関連項目:

DISTRIBUTE BY ROWID RANGE副句についてさらに学習するには、Oracle Database SQL言語リファレンスを参照してください。

10.1.2.2 Oracle RACでの列データの複製

DUPLICATE句は、どのようにOracle RACデータベースによって複数のOracle RACインスタンスにわたり列データを複製するかを制御します。

ノート:

DUPLICATE句は、Oracle Engineered System上のOracle RACでのみ使用可能です。Oracle RACがOracle Engineered Systemで稼働しないとき、DUPLICATE句はNO DUPLICATEと機能的に同等になります。

IM列ストアのフォルト・トレランスを提供するため、IMCUのミラー化を選択できます。IMCUミラー化では、同じIMCUが複数のIM列ストアに存在します。この手法は、ストレージのミラー化に似ています。

図10-7 Oracle RACでのIMCUの複製

図10-7の説明が続きます
「図10-7 Oracle RACでのIMCUの複製」の説明

DUPLICATE句を使用して表領域またはオブジェクト(表、パーティションまたはサブパーティション)レベルでデータをミラー化すると、次のような利点があります。

  • あるノードで障害が発生した場合に、ミラー化した列データに異なるノードからアクセスできるため、フォルト・トレランスが提供されます。

  • 問合せでローカルでデータにアクセスでき、それによってバッファ・キャッシュまたはディスクへのアクセスが行われなくなるため、パフォーマンスが向上します。

    たとえば、スター・クエリーでは、ディメンション表がDUPLICATE ALLを使用するのに対して、ファクト表はパーティション化できます。このシナリオでは、すべての結合は、完全にローカル・ノードで行われます。

  • オブジェクトのサブセットを複製できるため、管理性が向上します。

    たとえば、今年のパーティションを複製し、同じ表の他のパーティションを複製しないでおくことができます。

IMCUのミラー化の短所は、オブジェクトがn回複製されると、そのメモリー要件がn倍増加することです。たとえば、500 MBの表が4つのインスタンスに分散されている場合は、合計で2000 MBのメモリーを使用します。

この項では、次の項目について説明します。

関連項目:

DUPLICATE句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。
10.1.2.2.1 Oracle RACでのDUPLICATE句

DUPLICATE句は、データベースですべてのIMCUのコピーを2つ目のデータベース・インスタンスに保持することを指定します。したがって、同じセグメントが正確に2つのOracle RACインスタンスに移入されます。

各オブジェクトで、1つのIMCUがプライマリとなります。セカンダリIMCUは、異なるデータベース・インスタンスに存在します。データベースでは、問合せの成立のためにどちらか一方のコピーを使用できます。IMCUのプライマリ・コピーがあるデータベース・インスタンスに障害が発生した場合、データベースでは、残存するIMCUを使用して問合せを成立させることができます。

たとえば、パーティションsales_q1_2014に対してDUPLICATEを指定するとします。インスタンス1内およびインスタンス2内のIM列ストアには、同一のデータ・コピーがあります。インスタンス1が終了した場合は、インスタンス2上のIM列ストアにより、sales_q1_2014に対するリクエストを成立させることができます。

関連項目:

10.1.2.2.2 Oracle RACでのDUPLICATE ALL句

DUPLICATE ALL句は、すべてのインメモリー・オブジェクトをすべてのデータベース・インスタンスにミラー化することを指定します。

この設定により、高いレベルの冗長性が提供され、問合せが単一ノード内で完全に実行できることから線形の拡張性も実現されます。たとえば、sales表のすべてのIMCUが、インスタンス1、インスタンス2およびインスタンス3内のIM列ストアに移入されます。したがって、どのデータベース・インスタンスでも、salesの問合せでリクエストされたデータを取得できます。

DUPLICATE ALL句の結果、オブジェクトのすべてのIMCUが分散されるため、DISTRIBUTE副句の有用性はなくなります。複製はオブジェクト・レベルで指定します。これは、IM列ストア内のすべてのオブジェクトでDUPLICATE ALL句が必要となるわけではないことを意味します。

DUPLICATE ALL手法の主な利点は、次のとおりです。

  • 高可用性

    すべてのインメモリー・オブジェクトに対してDUPLICATE ALL句を使用した場合、n個のインスタンスがあるOracle RACデータベースは、n-1個のOracle RACインスタンスの障害に耐えることができます。あるデータベース・インスタンスを保守のために稼働停止する必要がある場合に、重要なデータを少なくとも1つのIM列ストアで使用可能です。すべてのデータにアクセスできなくなる唯一のシナリオは、クラスタ内のすべてのデータベース・インスタンスの障害です。

  • スター・クエリーのパフォーマンス

    問合せによって小さいディメンション表をパーティション化された大きいファクト表に結合する場合は、DUPLICATE ALLを使用して、ディメンション表をすべてのOracle RACインスタンスにミラー化できます。そのファクト表は、パーティションまたはサブパーティションによって分散されます。この計画では、すべてのデータベース・インスタンス内のIM列ストアに、スター型結合に必要なデータが含まれています。この手法は、ディメンション表全体がすべてのIM列ストアに移入されるため、パーティション・ワイズ結合に似ています。

関連項目:

DUPLICATE ALL句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。

10.1.2.2.3 Oracle RACでのNO DUPLICATE句

デフォルトのNO DUPLICATE句は、データベースでオブジェクトの1つのコピーのみが保持されることを指定します。

たとえば、3つのノードを持つOracle RACデータベースは、インスタンス1にsales表の2012パーティションを格納し、インスタンス2に2013パーティションを格納し、インスタンス3に2014パーティションを格納できます。各表パーティションは、1つのデータベース・インスタンスにのみ存在します。

Oracle RACノードが列データを複製しない場合、障害発生ノード上の列データは、クラスタ上のIM列ストアで使用できません。不足しているデータに対して発行される問合せでは、エラーは発生しません。かわりに、データベース・バッファ・キャッシュまたは永続記憶域のいずれかのデータに問合せがアクセスするため、パフォーマンスが低下するおそれがあります。ノードがしばらく停止したままであり、残存するIM列ストア内に空き領域が存在する場合、Oracle RACでは、不足しているオブジェクトまたはオブジェクトの一部がクラスタ内の残りのノードに移入されます。

関連項目:

NO DUPLICATE句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。

10.1.3 Oracle RACでの並列処理

データベース・インスタンスは、それらが存在するIM列ストア内のIMCUにアクセスする必要があります。Oracle RAC内のIM列ストアの移入およびアクセスは、すべてのIM列ストアにどのインスタンスからでもアクセスできるよう、並列で起こる必要があります。

この項では、次の項目について説明します。

10.1.3.1 Oracle RACでのシリアル問合せとパラレル問合せ

Oracle RAC内のDatabase In-Memoryは、シェアード・ナッシング・アーキテクチャです。少なくとも1つのパラレル・サーバー・プロセスがすべてのアクティブ・インスタンス上で実行されていないかぎり、問合せによる、IM列ストアからの必要なすべてのデータへのアクセスは保証されません。

Oracle RACデータベース内の特定のノードで実行されるシリアル問合せでは、他のIM列ストア内のIMCUにアクセスできません。たとえば、インスタンス1で実行されているシリアル問合せで、salesの全体スキャンがリクエストされます。いくつかのsalesパーティションはインスタンス1内のIM列ストアに移入されますが、他のパーティションはインスタンス2内のIM列ストアに移入されます。この問合せでは、インスタンス1上のIM列ストア内のIMCUにのみアクセスできます。残りのデータは、ディスク・ストレージから取得する必要があります。

この状況はパラレル実行が有効な場合に似ていますが、PARALLEL_DEGREE_POLICY初期化パラメータはAUTOに設定されていません。問合せコーディネータは、問合せを実行するインスタンス上で動作します。PQプロセスにより、そのコーディネータにデータが送信されます。このケースでは、データベースによって複数のPQプロセスが開始されます。ただし、DOPが、問合せ内で参照されるオブジェクトのために移入されたIMCUを含むIM列ストアの数以上でないかぎり、すべてのデータがIM列ストアからアクセスされるわけではありません。自動DOPが有効になっていない場合は、DOPの大きさが、問合せ内の移入されたオブジェクトのためのIMCUを含むIM列ストアと少なくとも同じになるようにする必要があります。

関連項目:

10.1.3.2 Oracle RACでの自動DOP

自動並列度(自動DOP)により、オプティマイザはコストベースで計算を実行してSQL文の並列度を決定します。

PARALLEL_DEGREE_POLICY初期化パラメータをAUTOに設定することで、自動DOPを有効にします。オプティマイザでSQL文を解析するときには、実行時間が推定されます。この推定をPARALLEL_MIN_TIME_THRESHOLD初期化パラメータの設定に対して確認します。これは、IM列ストアが使用可能な場合に自動的に設定されます。その後、オプティマイザによって、次のようなコストベースの決定が行われます。

  • 推定時間がPARALLEL_MIN_TIME_THRESHOLDより短い場合、その文は順次実行されます。

  • 推定時間がPARALLEL_MIN_TIME_THRESHOLDより長い場合、その文は並列で実行されます。

    オプティマイザにより、リソース要件に基づいて並列度が計算されます。この計算は、PARALLEL_DEGREE_LIMIT初期化パラメータ、および構成されている場合はDatabase Resource Managerによって制限されます。

Oracle RAC環境でIM列ストアを使用している場合、この目的は、ディスクまたはバッファ・キャッシュへのアクセスを行わないようにすることです。この目的を達成するためには、すべてのアクティブ・データベース・インスタンス上で少なくとも1つのパラレル・サーバー・プロセスが実行されることを保証する必要があります。自動DOPは、この目的を達成するための推奨される方法です。

ノート:

自動DOPを使用しない場合は、DOPが、問合せで要求されるIMCUを含むIM列ストアの数以上になるようにする必要があります。

自動DOPにより、すべての共有プールに、すべてのIMCUが存在する場所やそれらの大きさなどを示すメタデータが格納されるため、プロセスの適切な分散が保証されます。すべての共有プール内に同じマップが存在します。問合せがクラスタ内のどこで生じても、パラレル問合せコーディネータは、IMCUのホーム・ロケーション(それが存在するインスタンス)を認識しています。

たとえば、PQコーディネータは、2016年のsalesパーティションがインスタンス1にあるのに対して、2015年のパーティションがインスタンス2にあることを認識しています。インスタンス1上で実行されている問合せによって2015年と2016年のパーティションがリクエストされた場合、問合せコーディネータでは、そのホーム・ロケーションを使用してアクセス先のIM列ストアを決定します。DOPが十分に高い値に設定されている場合は、コーディネータによって自動的に両方のインスタンス上でPQプロセスが開始され、それらのプロセスにより、リクエストされたデータが問合せコーディネータに送り返されます。

関連項目:

自動DOPについて学習するには、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

10.1.4 Oracle RACでのFastStart領域

FastStart領域は、すべてのOracle RACノードにわたり共有されます。この機能により、クラスタ全体にわたり最大限の共有および再利用性が実現されます。

FastStart領域には、IMCUのコピーが1つのみ存在します。たとえば、ノード4つのクラスタ内で1つのオブジェクトに対してDUPLICATE ALLが指定されている場合、IM列ストアには、オブジェクトのコピーが4つ存在します。しかしながら、データベースにより、1つのコピーのみがFastStart領域に保存されます。

Oracle RACクラスタ内のどのデータベース・インスタンスでも、FastStart領域内のIMCUを使用できます。この機能により、Oracle RAC環境でのインスタンスの再起動のパフォーマンスが向上します。

たとえば、sales表にsales_2014sales_2015およびsales_2016という3つのパーティションがあり、各パーティションは異なるインスタンスに移入されているとします。インスタンス障害が発生し、1つのインスタンスを再起動できません。IM列ストア内に十分な空き領域がある場合は、残存するインスタンスで、アクセス不可のインスタンスに以前に移入されたIMCUを読み取ることができます。したがって、3つすべてのsales表パーティションをアプリケーションで使用できます。

関連項目:

10.2 Oracle RACでのインメモリー・サービスの構成

サービスは、一連のインスタンスを意味します。Oracle RACでは、サービスを使用して、接続またはアプリケーションをクラスタ内のノードのサブセットに向けることができます。

この項では、次の項目について説明します。

関連項目:

Oracle RACでのサービスについてさらに学習するには、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。

10.2.1 インスタンスレベルのサービス制御

Oracle RACでは、IM列ストアの移入およびアクセスは、すべてのIM列ストアにどのデータベース・インスタンスからでもアクセスできるよう、並列で起こる必要があります。

PARALLEL_INSTANCE_GROUP初期化パラメータは、指定したサービスにパラレル問合せ操作を限定します。たとえば、クラスタ内の4つのデータベース・インスタンスのうちの3つにIM列ストアがある場合に、dbmperfという名前のサービスを作成し、PARALLEL_INSTANCE_GROUPを使用してこれら3つのインスタンスをこのサービスに割り当てるとします。その後、すべてのクライアント接続をそのdbmperfサービスに限定できます。パラレル操作では、サービスで定義されたインスタンスに対してのみ、パラレル実行プロセスが生成されます。

図10-8 サービスへのインスタンスのサブセットの割当て

図10-8の説明が続きます
「図10-8 サービスへのインスタンスのサブセットの割当て」の説明

関連項目:

PARALLEL_INSTANCE_GROUP初期化パラメータについてさらに学習するには、『Oracle Databaseリファレンス』を参照してください。

10.2.2 オブジェクトレベルのサービス制御

個々のオブジェクトの場合、INMEMORY ... DISTRIBUTE句には、このサービスを実行できるデータベース・インスタンスへの移入を制限するFOR SERVICE副句があります。

PARALLEL_INSTANCE_GROUP初期化パラメータは、サービス・レベルでセグメントを制御します。ここでは、サービスは1つ以上のインスタンスを意味します。その一方、INMEMORY ... DISTRIBUTE FOR SERVICEは、セグメント・レベルで分散を制御します。たとえば、INMEMORYオブジェクトをインスタンス1のみ、インスタンス2のみ、または両方のインスタンス内のIM列ストアに移入するよう構成できます。

DISTRIBUTE FOR SERVICEのオプションは次のとおりです。

  • DEFAULT: PARALLEL_INSTANCE_GROUPが設定されている場合、オブジェクトは、PARALLEL_INSTANCE_GROUPで指定されたIM列ストアがあるすべてのデータベース・インスタンスに移入されます。PARALLEL_INSTANCE_GROUPが設定されていない場合、オブジェクトは、IM列ストアがあるすべてのインスタンスに移入されます。

    FOR SERVICEを指定することは、FOR SERVICE DEFAULTを指定することと同じです。

  • ALL: データベースにより、オブジェクトが、IM列ストアがあるすべてのインスタンスに移入されます。

    ノート:

    PARALLEL_INSTANCE_GROUPが設定されていない場合、DEFAULTALLは機能的に等しくなります。

  • service_name: IMCOでは、その任務の一部として、前のサービスに割り当てられているデータベース・インスタンスからのオブジェクトの削除がトリガーされ、新しいサービスに割り当てられているインスタンスにそれが移入されます。

    セグメントを再分散する場合、データベースでは、必要な最小限の処理が実行されます。たとえば、サービスdbmperfがインスタンス1およびインスタンス2に割り当てられているとします。salesパーティションは、インスタンス1とインスタンス2の間で均等に分散されています。インスタンス3をこのサービスに追加します。均等な分散に必要になる場合は、データベースによって、IMCUがインスタンス3のみに移入され、それらがインスタンス1またはインスタンス2から削除されます。一部のIMCUは、それらの元の場所に残ります。

  • NONE: IMCOにより、現在指定してあるサービスのIM列ストアからオブジェクトが削除されます。

オブジェクトのPRIORITYの値がNONE以外の場合は、Wnnnプロセスにより、次のIMCOサイクルの間のDDL実行またはサービス起動の後にオブジェクトが移入されます。ただし、オブジェクトのPRIORITYNONEに設定されている場合、オブジェクトは、表の全体スキャンが実行中にのみ移入されます。スキャンによって、表に対する指定したサービスがアクティブでありブロックされていない、すべてのデータベース上でインメモリー移入がトリガーされます。このサービスは発行側サービスのスキャンとは異なる場合があることに注意してください。

インメモリー移入に使用されるサービスが停止した場合は、データベースにより、このサービスによって表されているIM列ストアからセグメントが削除されます。この点において、サービスの停止は、インスタンスのシャットダウンと同様です。このオブジェクトのINMEMORY属性は変わりません。サービスが再度起動されると、データベースによって、オブジェクトがそのINMEMORY属性に従って移入されます。IM列ストアからオブジェクトを削除するには、DDL文でNO INMEMORYを指定します。

DUPLICATEDISTRIBUTE FOR SERVICEと組み合せることができます。たとえば、ノード4つのうち3つに割り当てられているサービスdbmperfに対してオブジェクトでDUPLICATE ALLを使用することを指定するとします。このケースでは、これら3つの各ノード上のIM列ストアにオブジェクトのコピーがあります。

関連項目:

10.2.3 Oracle RACでのDatabase In-Memoryのサービスの利点

サービスとDUPLICATEの組合せで、ノード・アクセスおよびインメモリー移入を制御できます。

サービスには、次の利点があります。

  • ローリング・パッチおよびアップグレード

    IM列ストアを含むインスタンスに対してクライアント問合せを行うよう、Oracle RACサービスを設定するとします。DUPLICATE句を使用する場合は、問合せ応答時間に影響を与えることなくインスタンスを削除することを選択できます。この方法は、削除したインスタンスのワークロードを処理するためにサービス内の他のインスタンス上に十分なリソースが存在することが前提となっています。

    たとえば、ノード4つのクラスタでは、各ノードを順次削除すること、パッチを適用すること、および再度使用可能にすることができます。一時的にアクセス不可になっているノードのIMCUは、DUPLICATE句またはDUPLICATE ALL句を使用することで、1つ以上の他のノードで使用できます。したがって、列データへのアプリケーション・アクセスが中断されることはありません。

  • アプリケーション・アフィニティ

    サービス名に基づいてアプリケーション・アクセスを単一ノードに限定できます。たとえば、サービスdbmperf1はノード1に限定され、サービスdbmperf2はノード2に限定されるなどです。アプリケーションが特定のサービスに接続してパラレル問合せを発行する場合、その問合せでは、同一サービスに属するノード上のプロセスが使用されます。たとえば、サービスdbmperf1に接続するアプリケーションでは、ノード1上のプロセスのみが使用されます。

    アプリケーションは、Oracle RACデータベース内に独立して共存して、列データにアクセスできます。完全に異なるオブジェクトは、各ノードに移入できます。たとえば、HRアプリケーションをサービスdbmperf1に向け、販売履歴アプリケーションをサービスdbmperf2に向けることができます。

関連項目:

10.2.4 ノードのサブセットのためのインメモリー・サービスの構成: 例

この作業では、インメモリー・サービスをOracle RACデータベース内のノードのサブセットに割り当てる方法を知ります。

目的は次のとおりです。

  • RACデータベース内のノードのサブセット上でIM列ストアを作成します

  • IM列ストアがあるノードのみにアクセスできるよう、サービスを定義します

前提

このタスクでは、次のことを想定しています。

  • dbmmという名前のOracle RACデータベースにdbm1dbm2dbm3およびdbm4という4つのインスタンスがあります。図10-8」を参照してください。

  • dbm4以外のすべてのインスタンスで、INMEMORY_SIZEがゼロ以外の値に設定されています。

  • dbmperfという名前のサービスを追加し、それをIM列ストアがある3つのノードに割り当てる必要があります。

  • そのサービスに関連付けられているIM列ストアにsales表を移入する必要があります。

ノードのサブセットのためにインメモリー・サービスを構成するには:

  1. IM列ストアを実行する3つのノードを表すサービスを作成します。

    オペレーティング・システムのコマンド・ラインで、次の形式でsrvctlコマンドを使用します。

    srvctl add service -db db_name –s service_name
      -preferred "instance_names"

    たとえば、次のコマンドを入力します。

    srvctl add service –db dbmm –s dbmperf –preferred "dbm1, dbm2, dbm3"
  2. サービスを開始します。

    たとえば、dbmperfサービスを起動するには、次のコマンドを使用します。

    srvctl start service -db dbmm -service "dbmperf"
  3. サービスに接続するためのネット・サービス名を作成します。

    たとえば、次のようにtnsnames.oraファイルを更新します。

    DBMPERF = 
      (DESCRIPTION = 
         (ADDRESS = 
           (PROTOCOL = TCP)
           (HOST = host_name)
           (PORT = listener_port))
         (CONNECT_DATA =
           (SERVER = DEDICATED)
           (SERVICE_NAME = DBMPERF)
         ) 
      )

  4. DISTRIBUTE FOR SERVICE副句を使用して、移入する予定の表にINMEMORY属性を割り当てます。

    たとえば、次のようにsalesを変更します。

    ALTER TABLE sales INMEMORY DISTRIBUTE FOR SERVICE "dbmperf";

    上の文では、デフォルトのPRIORITY設定であるNONEsales表に対して使用されます。そのため、この表の移入は、自動ではなく要求に応じて行われます。

  5. sales表を移入するには、dbmperfサービスに接続してから、表の全体スキャンを開始します。

    たとえば、次のようにsalesを問い合せることで、全体スキャンを強制的に実行します。

    SELECT /*+ FULL(s) */ COUNT(*) FROM sales s;

関連項目: