メンバー・リフレッシュ可能クローンへの問合せのオフロード

大量の読取りワークロードがあり、複数の問合せによって比較的少量のデータがスキャンされる場合、エラスティック・プール・リーダーまたはエラスティック・プール・メンバーからリフレッシュ可能クローンに問合せ(読取り)をオフロードできます。

問合せのオフロードについて

エラスティック・プールでの問合せオフロードの使用に関する情報と、問合せオフロード機能について説明します。

エラスティック・プール問合せオフロードでは、1つ以上のリフレッシュ可能クローンでエラスティック・プール・リーダーまたはエラスティック・プール・メンバーの問合せを処理できるため、パフォーマンス上の利点があります。この機能では、問合せ(読取り)需要の増加に対応するために、リフレッシュ可能クローンを追加することもできます。オフロード問合せを使用すると、アプリケーションを水平方向にスケーリングできます。ここでは、リフレッシュ可能クローンを追加して、問合せリクエスト・ボリュームを満たすために、必要に応じてシステム全体のパフォーマンスを維持できます。

問合せオフロードが有効な場合、問合せはエラスティック・プール・リーダーまたはエラスティック・プール・メンバーに発行され、使用可能なリフレッシュ可能クローンが問合せオフロードの候補になります。さらに、リフレッシュ可能なクローンを追加すると、問合せオフロードが動的に調整され、新しいリソースが使用されます。

問合せオフロードの1つのユース・ケースは、ピーク時の機能を有効にして、エラスティック・プール・リーダーまたはエラスティック・プール・メンバーの負荷を軽減することです。休止時間中は、問合せオフロードを無効にして、リフレッシュ可能クローンのリフレッシュなどのメンテナンス操作を実行できます。

デフォルトでは、問合せオフロードは任意のセッションからの問合せを考慮します。または、モジュール名またはアクション名で指定したセッションのリストから問合せをオフロードすることもできます。

次の図は、エラスティック・プール・リーダーからの問合せのオフロードを示しています。

autonomous-elastic-pool-leader-query-offload.pngの説明が続きます

図autonomous-elastic-pool-leader-query-offload.pngの説明

次の図は、エラスティック・プール・メンバーからの問合せのオフロードを示しています。

autonomous-elastic-pool-member-query-offload.epsの説明が続きます

図autonomous-elastic-pool-member-query-offload.pngの説明

リフレッシュ可能クローンのデータは、各リフレッシュ可能クローンの最終リフレッシュ時間に基づいて最新です。これは、問合せオフロードが有効な場合、エラスティック・プール・リーダーまたは問合せをオフロードしているエラスティック・プール・メンバーに対して、すべてのDDL、DMLおよびPL/SQL操作を実行することを意味します。その後、リフレッシュ可能クローンがリフレッシュされると、その変更がリフレッシュ可能クローンに反映されます。

詳細は、Autonomous AI Databaseでのリフレッシュ可能クローンの使用を参照してください。

問合せオフロード機能

  • 動的追加: リフレッシュ可能クローンは、エラスティック・プールのメンバーとしていつでも追加できます。問合せオフロードは、新しいメンバーを利用するように動的に調整されます。

  • 動的削除: リフレッシュ可能クローンは、エラスティック・プールのメンバーとしていつでも削除できます。問合せオフロードは、エラスティック・プールから削除されたリフレッシュ可能クローンへの問合せのオフロードを停止するように動的に調整されます。

  • セッション・ベースのスティッキー・オフロード: 問合せオフロードはセッション内でスティッキーです。つまり、セッション内の問合せが特定のリフレッシュ可能クローンにオフロードされている場合、問合せオフロードは、同じリフレッシュ可能クローンを使用して、同じセッション内の後続の問合せをオフロードします。

  • 1対1のサービス・マッピング: エラスティック・プール・リーダーまたは元の問合せによってエラスティック・プール・メンバーで使用されるサービスと、オフロードされた問合せに対してリフレッシュ可能クローンで使用されるサービスとの間に1対1のマッピングがあります。たとえば、セッションがMEDIUMサービスに接続されている場合、そのセッションの問合せオフロードでは、リフレッシュ可能クローンのMEDIUMサービスも使用されます。

  • セッションがオフロードされているかどうかを判断: SYS_CONTEXT問合せを使用して、セッションがエラスティック・プール・リーダーまたはメンバーで実行されているか、リフレッシュ可能クローンにオフロードされているかを判断できます。

  • PL/SQLからの問合せオフロード: 問合せは、PL/SQL内に埋め込まれていてもリフレッシュ可能クローンにオフロードされます。PL/SQLは、ストアド・プロシージャ、ファンクション、パッケージまたは無名ブロックです。

  • スケジューラ・ジョブからの問合せオフロード: Oracle Schedulerジョブ・アクション内からの問合せはオフロードされます。Oracle Schedulerジョブ問合せは、ジョブがフォアグラウンドで実行されるかバックグラウンドで実行されるかに関係なくオフロードされます。

DBA_PROXY_SQLビュー

DBA_PROXY_SQLビューDBA_PROXY_SQL_ACTIONSおよびDBA_PROXY_SQL_MODULESを使用して、問合せオフロード用に構成されているモジュールまたはアクションのリストを表示します。これらのビューは、問合せオフロードに対して有効化されていないセッションから問い合せる必要があります。

問合せオフロードの有効化

エラスティック・プール・リーダーまたはエラスティック・プール・メンバーの問合せオフロードを有効にする方法について説明します。

問合せオフロードを有効にするための要件は次のとおりです。

  • 問合せオフロードは、エラスティック・プール・リーダーまたはリフレッシュ可能クローンがないエラスティック・プール・メンバーに対して有効にできます。問合せのオフロードを有効にすると、リフレッシュ可能クローンを追加でき、問合せのオフロード機能は、リフレッシュ可能クローンを使用するように動的に調整されます。

  • 問合せオフロードの候補であるリフレッシュ可能クローンは、次の操作を行う必要があります。

    • エラスティック・プール・リーダーをソース・データベースとし、エラスティック・プール・リーダーと同じリージョンに配置します。

      または

      エラスティック・プール・メンバーをソース・データベースとして保持し、エラスティック・プール・メンバーと同じリージョンに配置します。

    • エラスティック・プール・メンバーになります。

問合せオフロードを有効にするには:

  1. Autonomous AI Databaseインスタンスがエラスティック・プール・リーダーまたはエラスティック・プール・メンバーであることを確認します。

    1. 次の問合せを使用して、インスタンスがエラスティック・プール・リーダーであることを確認します。

      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      この問合せは、YESを返します。

    2. 次の問合せを使用して、インスタンスがエラスティック・プール・メンバーであることを確認します。

      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      この問合せは、YESを返します。

    ノート

    ノート:エラスティック・プールが最近作成または変更された場合、sys_context値が現在の値を反映するようになるまで最大15分の遅延が発生する可能性があります。

  2. 問合せオフロードを有効にします。

    次の2つの選択肢があります。任意のセッションからの問合せに対して問合せオフロードを有効にするか、またはモジュール名またはアクション名で指定したセッションに問合せオフロードを制限できます。

    • すべてのセッションで問合せオフロードを有効にするには、パラメータを指定せずにDBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADを実行します。次に例を示します。

      EXEC DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD;
    • 特定のセッションに対する問合せオフロードをモジュール名またはアクション名で有効にするには、module_nameまたはaction_nameパラメータを指定してDBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADを実行します。

      詳細は、「名前付きモジュールまたはアクションの問合せオフロードの有効化」を参照してください。

セッションに対して問合せオフロードが有効な場合、問合せがオフロードされるリフレッシュ可能クローンの名前を確認できます。たとえば、セッションから次の問合せを実行します。

SELECT sys_context('userenv', 'con_name') FROM DUAL;

問合せがリフレッシュ可能クローンにオフロードされていない場合、この問合せにはエラスティック・プール・リーダー(またはリフレッシュ可能クローンではないエラスティック・プール・メンバー)の名前が表示されます。

詳細は、「SYS_CONTEXT」を参照してください。

詳細は、ENABLE_READ_ONLY_OFFLOADプロシージャを参照してください。

名前付きモジュールまたはアクションの問合せオフロードの有効化

名前付きモジュールまたはアクションを持つセッションの問合せオフロードを有効にする方法について説明します。

モジュール名またはアクション名で特定のセッションの問合せオフロードを有効にするには:

  1. インスタンスがエラスティック・プール・リーダーまたはエラスティック・プール・メンバーであることを確認します。

    1. 次の問合せを使用して、インスタンスがエラスティック・プール・リーダーであることを確認します。
      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      この問合せは、YESを返します。

    2. 次の問合せを使用して、インスタンスがエラスティック・プール・メンバーであることを確認します。

      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      この問合せは、YESを返します。

    ノート

    ノート:エラスティック・プールが最近作成または変更された場合、sys_context値が現在の値を反映するようになるまで最大15分の遅延が発生する可能性があります。

  2. DBMS_APPLICATION_INFOのルーチンSET_ACTIONまたはSET_MODULEを使用して、現在のセッションでモジュール名またはアクション名(あるいはその両方)を設定します。

    CREATE or replace PROCEDURE add_employee(
      name VARCHAR2,
      salary NUMBER,
      manager NUMBER,
      title VARCHAR2,
      commission NUMBER,
      department NUMBER) AS
    BEGIN
      DBMS_APPLICATION_INFO.SET_MODULE(
        module_name => 'add_employee',
        action_name => 'insert into emp');
      INSERT INTO emp
        (ename, empno, sal, mgr, job, hiredate, comm, deptno)
        VALUES (name, emp_seq.nextval, salary, manager, title, SYSDATE,
                commission, department);
      DBMS_APPLICATION_INFO.SET_MODULE(null,null);
    END;

    詳細は、DBMS_APPLICATION_INFOを参照してください。

  3. 問合せのオフロードを有効にし、モジュール名またはアクション名(またはモジュール名とアクション名の両方)で適格なセッションを指定します。

    たとえば:

    DECLARE
       mod_values clob := to_clob('["mod1", "mod2"]');
       act_values clob := to_clob('["act1", "act2"]');
    BEGIN
       DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD(
          module_name => mod_values,
          action_name => act_values);
    END;
    /

セッションに対して問合せオフロードが有効になっている場合、セッションから、問合せがオフロードされるリフレッシュ可能クローンの名前を確認できます。たとえば:

SELECT sys_context('userenv', 'con_name') FROM DUAL;

問合せがリフレッシュ可能クローンにオフロードされていない場合、この問合せにはエラスティック・プール・リーダー(またはリフレッシュ可能クローンではないエラスティック・プール・メンバー)の名前が表示されます。

詳細は、「SYS_CONTEXT」を参照してください。

ビューDBA_PROXY_SQL_ACTIONSおよびDBA_PROXY_SQL_MODULESには、問合せオフロード用に構成されたモジュールまたはアクションのリストが表示されます。これらのビューは、問合せオフロードに対して有効化されていないセッションから問い合せる必要があります。詳細は、「DBA_PROXY_SQLビュー」を参照してください。

詳細は、ENABLE_READ_ONLY_OFFLOADプロシージャを参照してください。

問合せオフロードの無効化

エラスティック・プール・リーダーまたはエラスティック・プール・メンバーの問合せオフロードを無効にする方法について説明します。

問合せをオフロードしているインスタンスで、問合せのオフロードを無効にします。

たとえば:

EXEC DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOAD;

詳細は、DISABLE_READ_ONLY_OFFLOADプロシージャを参照してください。

PL/SQLからの問合せオフロード

問合せオフロードが有効な場合、問合せはPL/SQL内に埋め込まれていても、リフレッシュ可能クローンにオフロードされます。PL/SQLには、ストアド・プロシージャ、ファンクション、パッケージまたは無名ブロックを使用できます。

たとえば、特定のモジュールおよびアクションに対して問合せオフロードを有効にすると、リフレッシュ可能クローンにオフロードされる問合せを示すことができます。この例では、リーダーのデータが更新され、リフレッシュ可能クローンがまだ更新されていない(リフレッシュ可能クローンのデータが古く、異なる)と仮定します。この例では、エラスティック・プール・リーダーとリフレッシュ可能クローンの値が異なるため、リーダーまたはリフレッシュ可能クローンのいずれかからデータが取得されるタイミングを確認できます。

  1. 問合せオフロードを有効にし、モジュール名とアクション名で適格なセッションを指定します。たとえば、'mod1'、'act1'です。

    DECLARE
      mod_values clob := to_clob('["mod1"]');
      act_values clob := to_clob('["act1"]');
    BEGIN
      DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD(
          module_name => mod_values,
          action_name => act_values);
    END;
    /
  2. 問合せオフロードをテストするファンクションf1を定義します。

    SQL> create or replace function f1 (n number)
        return number
        as
          l_cnt number;
        begin
          select sum(c1) into l_cnt from u2.tab1;
    
          return l_cnt;
        end;
        /
    
    Function created.
  3. 関数f1を実行します。関数f1を使用した問合せは、エラスティック・プール・リーダー(またはオフロード問合せが有効になっているエラスティック・プール・メンバー)で実行されます。このセッションは、ステップ1の問合せオフロードに指定されたものと一致しない未指定のモジュールおよびアクション名で実行されます。

    SQL> -- expected to fetch from Elastic Pool Leader and returns value 40
    SQL> select f1(3) from dual;
    
         F1(3)
    
    ----------
            40
    
    1 row selected.
  4. ステップ1で指定した名前と一致するセッションのモジュール名およびアクション名を指定します。このセッションからの問合せは、リフレッシュ可能クローンへのオフロードに適格になりました。

    SQL> exec dbms_application_info.set_module('mod1', 'act1');
    
    PL/SQL procedure successfully completed.
  5. ファンクションf1を再度実行します。この場合、モジュール名とアクション名は、ステップ1で指定した名前と一致します。関数f1の問合せは、リフレッシュ可能クローンにオフロードされます。

    SQL> -- Expected to fetch from Refreshable Clone and returns value 10
    SQL> select f1(3) from dual;
    
         F1(3)
    
    ----------
            10
    
    1 row selected.
  6. モジュール名とアクション名を、mod1およびact1以外のものとして指定します。モジュールおよびアクション名がステップ1で指定したものと一致しないため、このセッションからの問合せはリフレッシュ可能クローンにオフロードできなくなりました。

    SQL> exec dbms_application_info.set_module('random', 'random');
    
    PL/SQL procedure successfully completed.
  7. ファンクションf1を使用して問合せを実行します。このセッションのモジュールおよびアクション名はステップ1で設定されたものと一致しないため、この問合せはオフロードされず、エラスティック・プール・リーダーで実行されます。

    SQL> -- expected to fetch from Elastic Pool Leader and returns value 40
    SQL> select f1(3) from dual;
    
         F1(3)
    
    ----------
            40
    
    1 row selected.

スケジューラ・ジョブからの問合せオフロード

問合せオフロードが有効な場合、Oracle Schedulerジョブ・アクション内からの問合せは、リフレッシュ可能クローンにオフロードされます。ジョブがフォアグラウンドで実行されるかバックグラウンドで実行されるかに関係なく、問合せはオフロードされます。

たとえば、PL/SQLの前の例と同様に、Oracle Schedulerジョブの問合せオフロードを有効にすると、リフレッシュ可能クローンにオフロードされる問合せを示すことができます。この例では、リーダーのデータが更新され、リフレッシュ可能クローンがまだ更新されていない(リフレッシュ可能クローンのデータが古く、異なる)と仮定します。この例では、エラスティック・プール・リーダーとリフレッシュ可能クローンの値が異なるため、リーダーまたはリフレッシュ可能クローンのいずれかからデータが取得されるタイミングを確認できます。

SQL> create or replace procedure sproc1 (n number)
    as
    l_cnt number;
    begin
      select sum(c1) into l_cnt from u2.tab1;
      dbms_output.put_line('l_cnt is ' || l_cnt);
    end;
    /

Procedure created.

Offload Queries from Elastic Pool Leader to Member Refreshable Clones

SQL> create or replace procedure sproc1 (n number)
  as
    l_cnt number;
  begin
    select sum(c1) into l_cnt from u2.tab1;
    dbms_output.put_line('l_cnt is ' || l_cnt);
  end;
  /

Procedure created.

SQL>
SQL> BEGIN
    dbms_scheduler.create_job(job_name    => 'PROXYTEST1',
                              job_type    => 'PLSQL_BLOCK',
                              job_action  => 'BEGIN sproc1(3); END;',
                              enabled     => FALSE);
  END;
  /

PL/SQL procedure successfully completed.

SQL>
SQL> -- Job runs in the foreground in the current session
SQL> -- expected to fetch from Leader: 40
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => true);
l_cnt is 40

PL/SQL procedure successfully completed.

SQL>
SQL> exec dbms_proxy_sql.enable_read_only_offload;

PL/SQL procedure successfully completed.

SQL> show con_name

CON_NAME
------------------------------
CDB1_PDB1
SQL>
SQL> set serveroutput on
SQL> -- Job runs in the foreground in the current session
SQL> -- expected to fetch from Refreshable Clone: 10
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => true);
l_cnt is 10

PL/SQL procedure successfully completed.

SQL>
SQL> -- Job runs in the background and is expected to fetch from Refreshable Clone: 10
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => false);

PL/SQL procedure successfully completed.

問合せのオフロードに関するノート

問合せオフロード機能の追加ノートを提供します。

問合せのオフロードに関するノート:

  • リフレッシュ可能クローンの追加または削除: リフレッシュ可能クローンをエラスティック・プール・メンバーとして追加すると、その追加がエラスティック・プール・リーダーに反映されるまでに最大15分の遅延が発生する可能性があります。新しく追加されたリフレッシュ可能クローンは、リーダーが新しく追加されたエラスティック・プール・メンバーを認識するまで、問合せオフロードのターゲットとみなされません。

    同様に、リフレッシュ可能クローンをエラスティック・プールから削除すると、削除がエラスティック・プール・リーダーに反映されるまでに最大15分遅れる可能性があります。削除されたリフレッシュ可能クローンは、メンバーがエラスティック・プールから削除されたことをリーダーが認識するまで、問合せオフロードのターゲットとみなされます。

  • リフレッシュ可能クローンのリフレッシュ: リフレッシュ可能クローンをリフレッシュすると、リフレッシュ可能クローンにオフロードされた問合せが遅延する場合があります。

  • パブリック・エンドポイントおよびプライベート・エンドポイントのサポート: 問合せオフロードは、パブリック・エンドポイント上のインスタンスおよびプライベート・エンドポイント上のインスタンスに対してサポートされます。

  • 切断されたリフレッシュ可能クローン: リフレッシュ可能クローンが切断されると、問合せオフロードのターゲットとして適格ではなくなります。エラスティック・プール・リーダーがリフレッシュ可能クローンが切断されたことを検出し、問合せのオフロードを停止するまでに、最大15分の遅延が発生する場合があります。

    リフレッシュ可能クローンを問合せのオフロードに使用できるようにするには、自動リフレッシュを有効にするか、リフレッシュ可能クローンを定期的に手動でリフレッシュします。

    詳細は、Autonomous AI Databaseでのリフレッシュ可能クローンのリフレッシュを参照してください。

  • 大/小文字を区別するモジュール名およびアクション名: モジュール名またはアクション名で指定するセッションのリストから問合せをオフロードすると、DBMS_APPLICATION_INFOで設定されたモジュール名およびアクション名では大/小文字が区別されます。DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADは、この大/小文字を区別する動作に従います。たとえば、セッションに小文字のモジュール名または大/小文字が混在するモジュール名がある場合、DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADを使用して問合せオフロードを有効にし、module_nameまたはaction_nameパラメータを含めると、パラメータ値で大/小文字が一致する必要があります。

    DBMS_APPLICATION_INFO.READ_MODULEを使用して、現在のセッションのモジュール名とアクション名を確認できます。

    set serveroutput on;
    declare
    l_mod varchar2(50);
    l_act varchar2(50);
    BEGIN
    DBMS_APPLICATION_INFO.READ_MODULE(l_mod, l_act);
    DBMS_OUTPUT.PUT_LINE('l_mod: ' || l_mod);
    DBMS_OUTPUT.PUT_LINE('l_act: ' || l_act);
    END;
    /
  • 一般的なユース・ケース: 問合せオフロードの1つのユース・ケースは、エラスティック・プール・リーダー(または問合せオフロードが有効なエラスティック・プール・メンバー)からロードをオフにするために、ピーク時間中にこの機能を有効にすることです。待機時間中に、問合せオフロードを無効にして、リフレッシュ可能クローンのリフレッシュなどのメンテナンス操作を実行できます。