12 Oracle RACでのIM列ストアのデプロイ
この章では、Oracle Real Application Clusters (Oracle RAC)環境でIM列ストアを使用可能にする方法、およびオブジェクトを移入のために構成する方法について説明します。
この項では、次の項目について説明します。
12.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
として扱われます。
12.1.1 複数のIM列ストア
Oracle RACでは、各データベース・インスタンスには固有のIM列ストアがあります。
概念上、Oracle RAC環境内のIM列ストアでは、シェアード・ナッシング・アーキテクチャが使用されます。各データベース・インスタンスで、別個にIM列ストアをサイズ設定および管理します。データベース・インスタンスで、キャッシュ・フュージョンを使用してIMCUがあちこちへ転送されることはありません。
図12-1 Oracle RACデータベース内のIM列ストア
この図は、ノード2つのOracle RACクラスタを示しています。各インスタンスには、別々に構成されたIM列ストアがあります。
「図12-1 Oracle RACデータベース内のIM列ストア」の説明
すべてのOracle RACノードでIM列ストアのサイズを等しく設定することをお薦めします。たとえば、どのIM列ストアにも100 GBのメモリーを割り当てることができます。IM列ストアを必要としないノードの場合は、このノードに対してINMEMORY_SIZE
初期化パラメータを0に設定します。
図12-2 2つのIM列ストアがある、ノード3つのOracle RACデータベース
この例では、インスタンス1およびインスタンス2にIM列ストアがあります。インスタンス3ではIM列ストアは必要ないため、このノードに対するINMEMORY_SIZE
初期化パラメータは0に設定されています。
「図12-2 2つのIM列ストアがある、ノード3つのOracle RACデータベース」の説明
関連項目:
-
INMEMORY_SIZE
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照 -
Oracle RACの概要は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照
12.1.2 Oracle RACでの列データの分散および複製
INMEMORY
が指定されると、DISTRIBUTE
およびDUPLICATE
キーワードはオブジェクトの分散を制御します。
Oracle RACには、複数の分散オプションが用意されています。ノードごとに異なるオブジェクトを移入することや、大きなオブジェクトをOracle RACクラスタ内のすべてのIM列ストアにわたり分散することができます。同じオブジェクトを各ノード(Oracle Engineered Systems上のみ)のIM列ストアに移入することもできます。
ノート:
表が現在IM列ストアに移入されており、PRIORITY
以外の表のINMEMORY
属性を変更した場合は、データベースでその表がIM列ストアから除去されます。再移入の動作は、PRIORITY
設定によって異なります。
この項では、次の項目について説明します。
12.1.2.1 Oracle RACでの列データの分散
INMEMORY
のDISTRIBUTE
句は、IM列ストア内の表データを複数のOracle RACインスタンスにわたりどのように分散するかを制御します。
デフォルト・オプションAUTO
が設定されている場合は、Oracle RACインスタンスにより、データが自動的に分散されます。セグメントの移入中に、領域管理スレーブ・プロセス(Wnnn)により、各インスタンスに同量のデータの配置が試みられます。分散は、アクセス・パターンおよびオブジェクト・サイズによって異なります。もう1つの方法として、データベースでパーティション、サブパーティションまたはROWID範囲をインスタンス間で分散するやり方を手動で指定することもできます。
パフォーマンスのためには、同量のデータ分散が重要となります。目的は、パラレル問合せプロセスで等しいデータ・セット・サイズを処理することで、それらすべてが最小限の時間で終了するようにすることです。データ分散が偏ると、実行時間の長いプロセスによって問合せの完了が遅くなります。
Oracle RACインスタンスに障害が発生すると、障害が発生したインスタンス上のIMCUが利用不可になります。その結果、アクセス不可のIMCUに格納されているデータを必要とする問合せでは、データベース・バッファ・キャッシュ、フラッシュ・ストレージ、ディスク、または他のIM列ストア内のミラー済IMCUなど、別の場所からそれを読み取ることが必要になります。
DBA_TABLES.INMEMORY_DISTRIBUTE
列は、IMCUをどのように分散するかを示します。AUTO
オプションが設定されている場合、この列値はAUTO-DISTRIBUTE
となります。
例12-1 デフォルトの分散
この例では、パーティションsales_2013_pt
およびsales_2014_pt
のみを含むsales
表を分散するデータベースを示します。データベースでは、自動的にsales_2013_pt
パーティションがインスタンス1に、sales_2014_pt
がインスタンス2に配置されます。
この項では、次の項目について説明します。
関連項目:
-
Oracle RACでのIM列ストアの管理方法を学習するには、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照
-
DISTRIBUTE
句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照 -
Wnnnバックグラウンド・プロセスについて学習するには、『Oracle Databaseリファレンス』を参照
12.1.2.1.1 パーティションによる分散
DISTRIBUTE BY PARTITION
句を使用して、パーティション内のデータを様々なOracle RACインスタンスに分散できます。
この手法は、ハッシュ・パーティションに適しています。たとえば、orders
表内のパーティションを等しく分散するには、order_id
列でハッシュによって分配します。次の図に示すように、Oracle Databaseでは、order_id
列でハッシュすることで4つのインスタンスにわたりパーティションが分散されます。
この手法は、複数パーティションが均一にアクセスされる場合のその他のパーティション化スキームに適しています。DISTRIBUTE BY PARTITION
句では、パーティション・ワイズ結合もサポートされています。
ノート:
パーティション化戦略によって大規模なデータ・スキューが生じる場合、つまり、あるパーティションが他のパーティションよりも非常に大きい場合は、DISTRIBUTE BY ROWID RANGE
を手動で指定することでデフォルトの分散(BY PARTITION
)をオーバーライドすることをお薦めします。
関連項目:
-
DISTRIBUTE BY PARTITION
副句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照 -
パーティション表の概要は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照
12.1.2.1.2 サブパーティションによる分散
コンポジット・パーティション化スキームを使用する表では、DISTRIBUTE BY SUBPARTITION
句を使用して、サブパーティション内のデータを様々なインスタンスに分散できます。
この手法は、ハッシュ・サブパーティションに適しています。たとえば、orders
表内のパーティションを等しく分散するには、order_date
列で範囲によって、またはorder_id
列でハッシュによって分配します。
この手法は、複数サブパーティションが均一にアクセスされる場合のその他のパーティション化スキームに適しています。DISTRIBUTE BY PARTITION ... SUBPARTITION
句では、パーティション・ワイズ結合もサポートされています。
関連項目:
-
コンポジット・パーティション化についてさらに学習するには、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照
-
DISTRIBUTE BY PARTITION ... SUBPARTITION
副句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照
12.1.2.1.3 ROWID範囲による分散
DISTRIBUTE BY ROWID RANGE
句を使用して、特定のROWID範囲内のデータを様々なOracle RACインスタンスに分散できます。
この手法では、最初のROWIDに対する均一ハッシュによってIMCUが分散されます。たとえば、Oracle Databaseでorders
表内の行1から105までをあるデータベース・インスタンスに分散し、行106から121までを別のインスタンスに分散するといったことができます。
ROWIDの分散手法は、パーティション化されていない表に最も役立ちます。ただし、パーティション化戦略によって大規模なデータ・スキューが生じる場合、たとえば、あるパーティションが他のパーティションよりも非常に大きい場合は、DISTRIBUTE BY ROWID RANGE
を手動で指定することでデフォルトの分散(BY PARTITION
)をオーバーライドすることをお薦めします。
関連項目:
DISTRIBUTE BY ROWID RANGE
副句についてさらに学習するには、Oracle Database SQL言語リファレンスを参照してください。
12.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列ストアに存在します。この手法は、ストレージのミラー化に似ています。
DUPLICATE
句を使用して表領域またはオブジェクト(表、パーティションまたはサブパーティション)レベルでデータをミラー化すると、次のような利点があります。
-
あるノードで障害が発生した場合に、ミラー化した列データに異なるノードからアクセスできるため、フォルト・トレランスが提供されます。
-
問合せでローカルでデータにアクセスでき、それによってバッファ・キャッシュまたはディスクへのアクセスが行われなくなるため、パフォーマンスが向上します。
たとえば、スター・クエリーでは、ディメンション表が
DUPLICATE ALL
を使用するのに対して、ファクト表はパーティション化できます。このシナリオでは、すべての結合は、完全にローカル・ノードで行われます。 -
オブジェクトのサブセットを複製できるため、管理性が向上します。
たとえば、今年のパーティションを複製し、同じ表の他のパーティションを複製しないでおくことができます。
IMCUのミラー化の短所は、オブジェクトがn回複製されると、そのメモリー要件がn倍増加することです。たとえば、500 MBの表が4つのインスタンスに分散されている場合は、合計で2000 MBのメモリーを使用します。
この項では、次の項目について説明します。
12.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
に対するリクエストを成立させることができます。
関連項目:
-
DUPLICATE
句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照
12.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言語リファレンス』を参照してください。
12.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言語リファレンス』を参照してください。
12.1.3 Oracle RACでの並列処理
データベース・インスタンスは、それらが存在するIM列ストア内のIMCUにアクセスする必要があります。Oracle RAC内のIM列ストアの移入およびアクセスは、すべてのIM列ストアにどのインスタンスからでもアクセスできるよう、並列で起こる必要があります。
12.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列ストアと同じになるようにします。
In-Memory動的スキャン
シリアル問合せとパラレル問合せの両方がIn-Memory動的スキャン(IM動的スキャン)を実行し、軽量スレッド・インフラストラクチャを使用できます。パラレル実行のインフラストラクチャは、新しいスレッド・インフラストラクチャと共存し、Oracle Database Resource Manager (リソース・マネージャ)によって動的に管理されます。INMEMORY_SIZE
が0
より大きい場合、リソース・マネージャはデフォルトで有効になります。
表スキャン・プロセスは、シリアル問合せのフォアグラウンド・プロセスまたはパラレル問合せのパラレル・サーバー・プロセスのいずれかになります。パラレル問合せがIM動的スキャンを実行するとき、すべての表スキャン・プロセスがスレッドのプールを所有できます。
関連項目:
-
リソース・マネージャについてさらに学習するには、『Oracle Database管理者ガイド』を参照
-
Oracle RACでのパラレル問合せについてさらに学習するには、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照
-
PARALLEL_DEGREE_POLICY
初期化パラメータについてさらに学習するには、『Oracle Databaseリファレンス』を参照
12.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およびパーティショニング・ガイド』を参照してください。12.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_2014
、sales_2015
およびsales_2016
という3つのパーティションがあり、各パーティションは異なるインスタンスに移入されているとします。インスタンス障害が発生し、1つのインスタンスを再起動できません。IM列ストア内に十分な空き領域がある場合は、残存するインスタンスで、アクセス不可のインスタンスに以前に移入されたIMCUを読み取ることができます。したがって、3つすべてのsales
表パーティションをアプリケーションで使用できます。
関連項目:
-
DUPLICATE ALL
句についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。
12.2 Oracle RACでのインメモリー・サービスの構成
サービスは、一連のインスタンスを意味します。Oracle RACでは、サービスを使用して、接続またはアプリケーションをクラスタ内のノードのサブセットに向けることができます。
関連項目:
Oracle RACでのサービスについてさらに学習するには、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。
12.2.1 インスタンスレベルのサービス制御
Oracle RACでは、IM列ストアの移入およびアクセスは、すべてのIM列ストアにどのデータベース・インスタンスからでもアクセスできるよう、並列で起こる必要があります。
PARALLEL_INSTANCE_GROUP
初期化パラメータは、指定したサービスにパラレル問合せ操作を限定します。たとえば、クラスタ内の4つのデータベース・インスタンスのうちの3つにIM列ストアがある場合に、dbmperf
という名前のサービスを作成し、PARALLEL_INSTANCE_GROUP
を使用してこれら3つのインスタンスをこのサービスに割り当てるとします。その後、すべてのクライアント接続をそのdbmperf
サービスに限定できます。パラレル操作では、サービスで定義されたインスタンスに対してのみ、パラレル実行プロセスが生成されます。
12.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
が設定されていない場合、DEFAULT
とALL
は機能的に等しくなります。 -
service_name - IMCOでは、その任務の一部として、前のサービスに割り当てられているデータベース・インスタンスからのオブジェクトの削除がトリガーされ、新しいサービスに割り当てられているインスタンスにそれが移入されます。
セグメントを再分散する場合、データベースでは、必要な最小限の処理が実行されます。たとえば、サービス
dbmperf
がインスタンス1およびインスタンス2に割り当てられているとします。sales
パーティションは、インスタンス1とインスタンス2の間で均等に分散されています。インスタンス3をこのサービスに追加します。均等な分散に必要になる場合は、データベースによって、IMCUがインスタンス3のみに移入され、それらがインスタンス1またはインスタンス2から削除されます。一部のIMCUは、それらの元の場所に残ります。 -
NONE
- IMCOにより、現在指定してあるサービスのIM列ストアからオブジェクトが削除されます。
オブジェクトのPRIORITY
の値がNONE
以外の場合は、Wnnnプロセスにより、次のIMCOサイクルの間のDDL実行またはサービス起動の後にオブジェクトが移入されます。ただし、オブジェクトのPRIORITY
がNONE
に設定されている場合、オブジェクトは、表の全体スキャンが実行中にのみ移入されます。スキャンによって、表に対する指定したサービスがアクティブでありブロックされていない、すべてのデータベース上でインメモリー移入がトリガーされます。このサービスは発行側サービスのスキャンとは異なる場合があることに注意してください。
インメモリー移入に使用されるサービスが停止した場合は、データベースにより、このサービスによって表されているIM列ストアからセグメントが削除されます。この点において、サービスの停止は、インスタンスのシャットダウンと同様です。このオブジェクトのINMEMORY
属性は変わりません。サービスが再度起動されると、データベースによって、オブジェクトがそのINMEMORY
属性に従って移入されます。IM列ストアからオブジェクトを削除するには、DDL文でNO INMEMORY
を指定します。
DUPLICATE
をDISTRIBUTE FOR SERVICE
と組み合せることができます。たとえば、ノード4つのうち3つに割り当てられているサービスdbmperf
に対してオブジェクトでDUPLICATE ALL
を使用することを指定するとします。このケースでは、これら3つの各ノード上のIM列ストアにオブジェクトのコピーがあります。
関連項目:
-
DISTRIBUTE FOR SERVICE
副句についてさらに学習するには、Oracle Database SQL言語リファレンスを参照
12.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
に向けることができます。
関連項目:
-
DUPLICATE
セマンティクスについては、『Oracle Database SQL言語リファレンス』を参照
12.2.4 ノードのサブセットのためのインメモリー・サービスの構成: 例
この作業では、インメモリー・サービスをOracle RACデータベース内のノードのサブセットに割り当てる方法を知ります。
目的は次のとおりです。
-
RACデータベース内のノードのサブセット上でIM列ストアを作成します
-
IM列ストアがあるノードのみにアクセスできるよう、サービスを定義します
前提
このタスクでは、次のことを想定しています。
-
dbmm
という名前のOracle RACデータベースにdbm1
、dbm2
、dbm3
およびdbm4
という4つのインスタンスがあります。「図12-8」を参照してください。 -
dbm4
以外のすべてのインスタンスで、INMEMORY_SIZE
がゼロ以外の値に設定されています。 -
dbmperf
という名前のサービスを追加し、それをIM列ストアがある3つのノードに割り当てる必要があります。 -
そのサービスに関連付けられているIM列ストアに
sales
表を移入する必要があります。
ノードのサブセットのためにインメモリー・サービスを構成するには:
-
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"
-
サービスを開始します。
たとえば、
dbmperf
サービスを起動するには、次のコマンドを使用します。srvctl start service -db dbmm -service "dbmperf"
-
サービスに接続するためのネット・サービス名を作成します。
たとえば、次のように
tnsnames.ora
ファイルを更新します。DBMPERF = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = host_name) (PORT = listener_port)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DBMPERF) ) )
-
DISTRIBUTE FOR SERVICE
副句を使用して、移入する予定の表にINMEMORY
属性を割り当てます。たとえば、次のように
sales
を変更します。ALTER TABLE sales INMEMORY DISTRIBUTE FOR SERVICE "dbmperf";
上の文では、デフォルトの
PRIORITY
設定であるNONE
がsales
表に対して使用されます。そのため、この表の移入は、自動ではなく要求に応じて行われます。 -
sales
表を移入するには、dbmperf
サービスに接続してから、表の全体スキャンを開始します。たとえば、次のように
sales
を問い合せることで、全体スキャンを強制的に実行します。SELECT /*+ FULL(s) */ COUNT(*) FROM sales s;
関連項目:
-
ALTER TABLE
のINMEMORY DISTRIBUTE FOR SERVICE
句についてさらに学習するには、Oracle Database SQL言語リファレンスを参照 -
srvctl
ユーティリティについてさらに学習するには、Oracle Database管理者ガイドを参照 -
ネット・サービス名についてさらに学習するには、Oracle Database Net Services管理者ガイドを参照