マルチシャード問合せのための問合せ処理

マルチシャード問合せは、複数のシャードでデータをスキャンする必要がある問合せであり、各シャードでの処理は他のシャードから独立しています。

マルチシャード問合せは、複数のシャードにマップされ、結果をクライアントに送信する前に、コーディネータが処理する必要がある場合があります。たとえば、次の問合せは各顧客によって発注されたオーダー数を取得します。

SELECT count(*), c.custno FROM customers c, orders o WHERE c.custno = o.custno
 GROUP BY c.custno;

この問合せは、コーディネータによって次のように変換されます。

SELECT sum(count_col), custno FROM (SELECT count(*) count_col, c.custno
 FROM customers c, orders o 
 WHERE c.custno = o.custno GROUP BY c.custno) GROUP BY custno;

インライン問合せブロックは、リモート・マップ問合せブロックのように各シャードにマップされます。コーディネータは、すべてのシャードからの結果セットに対して、さらなる集計およびGROUP BYを実行します。各シャードでの処理の単位はインライン問合せブロックです。

マルチシャード問合せとグローバルな読取り一貫性

マルチシャード問合せでは、すべてのシャードで最も大きい共通SCNで問合せを発行することによって、グローバルな読込み一貫性(CR)を維持する必要があります。一貫性レベルを設定する方法の詳細は、マルチシャード問合せでの一貫性レベルの指定を参照してください。

マルチシャード問合せでのヒントの受け渡し

コーディネータに対する元の問合せで指定したヒントは、シャードに伝播されます。

マルチシャード問合せでの実行速度低下のトレースとトラブルシューティング

クエリー・リライトおよびシャード・プルーニングをトレースするには、コーディネータに対してトレース・イベントshard_sqlを設定します。観測される一般的なパフォーマンス問題の1つは、シャーディングの一定の制限により、GROUP BYがシャードにプッシュされない場合です。考えられるすべての操作がシャードにプッシュされ、シャードからの結果を統合するためのコーディネータでの処理が最低限であるかどうかを確認します。

マルチシャード問合せでの一貫性レベルの指定

シャード間でマルチシャード問合せを実行するときに、初期化パラメータMULTISHARD_QUERY_DATA_CONSISTENCYを使用して様々な一貫性レベルを設定できます。

MULTISHARD_QUERY_DATA_CONSISTENCY = { STRONG | SHARD_LOCAL | 
 DELAYED_STANDBY_ALLOWED | LOCAL_STANDBY_ONLY | LOCAL_STANDBY_PREFERRED }

前述の構文に示すように、マルチシャード問合せには様々な一貫性レベルを指定できます。たとえば、一部の問合せでシャード間のSCN同期のコストを回避する必要がある場合は、それらのシャードをグローバルに分散できます。

別のユース・ケースとして、レプリケーション用のスタンバイを使用している場合は、プライマリとそのスタンバイから結果がフェッチされる可能性があるため、マルチシャード問合せで少し古いデータが許容されます。

デフォルトのモードはSTRONGであり、すべてのシャード間でSCN同期が実行されます。他のモードでは、SCN同期はスキップされます。

SHARD_LOCALモードでは、SCN同期は実行されず、最新のデータが提供されます。

DELAYED_STANDBY_ALLOWEDモードでもSCN同期は実行されませんが、ロード・バランシングなどの要因に応じてスタンバイからもデータをフェッチでき、古いデータを含めることができます。

LOCAL_STANDBY_ONLYおよびLOCAL_STANDBY_PREFERREDは、クロス・シャード問合せのリージョン・アフィニティをサポートします。読取り専用クロスシャード問合せは、問合せコーディネータに近いシャードで実行されます。これは、コーディネータ(シャード・カタログ)およびシャードのリージョンに基づいて決定されます。

シャード・カタログでは、-regionパラメータを指定してGDSCTLコマンドMODIFY CATALOGを使用してリージョンを設定できます。-db_unique_nameパラメータが指定されている場合は、渡されたDB一意名を持つスタンバイ・カタログのリージョンが変更されます。

シャードのリージョンを変更するために、'add shard'中にリージョンがまだ設定されていない場合、GDSCTLコマンド'modify shard'を使用できます。

LOCAL_STANDBY_ONLYモードでは、SCN同期は実行されず、クロスシャード問合せのリージョン・アフィニティがサポートされます。これにより、問合せを実行しているコーディネータと同じリージョンのスタンバイ・シャードからデータをフェッチできます。使用可能なスタンバイ・シャードがない場合は、エラーが発生します。

LOCAL_STANDBY_PREFERREDは、LOCAL_STANDBY_ONLY設定と似ていますが、データベースが次の順序でデータをフェッチするシャードを検索しようとする点が異なります:

  1. 同じリージョンのスタンバイ・シャード。チャンクはシャード間で均等に分散されます

  2. 同じリージョンのプライマリ・シャード

  3. バディ・リージョンのスタンバイ・シャード。チャンクはシャード間で均等に分散されます

  4. バディ・リージョンのプライマリ・シャード

  5. 使用可能なシャードがない場合は、エラーが発生します。

このパラメータは、システム・レベルまたはセッション・レベルで設定できます。

関連項目:

MULTISHARD_QUERY_DATA_CONSISTENCYの使用方法の詳細は、Oracle AI Databaseリファレンスを参照してください。