このページは機械翻訳したものです。

エラスティック・プール・リーダーからメンバー・リフレッシュ可能クローンへの問合せのオフロード

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

エラスティック・プール・リーダーの問合せオフロードについて

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

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

問合せオフロードが有効な場合、問合せはエラスティック・プール・リーダーに送信され、使用可能な1つ以上のリフレッシュ可能クローンが問合せオフロードの候補になります。さらに、リフレッシュ可能クローンの追加時に、問合せオフロードは動的に調整され、新しいリソースが利用されます。

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

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



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

詳細は、Autonomous 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 Databaseインスタンスがエラスティック・プール・リーダーであることを確認します。

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

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

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

    ノート

    エラスティック・プールが最近作成または変更された場合、sys_context値がエラスティック・プール・リーダーの現在の値を反映する遅延が最大15分になることがあります。
  2. エラスティック・プール・リーダーに対して問合せオフロードを有効にします。

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

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

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

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

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

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

名前付きモジュールまたはアクションのエラスティック・プール・リーダーに対する問合せオフロードの有効化

名前付きモジュールまたはアクションを持つセッションでエラスティック・プール・リーダーに対して問合せオフロードを有効にする方法について説明します。

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

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

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

    SELECT sys_context('userenv', 'is_elastic_pool_leader') 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)
      2  return number
      3  as
      4    l_cnt number;
      5  begin
      6    select sum(c1) into l_cnt from u2.tab1;
      7    return l_cnt;
      8  end;
      9  /
     
    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)
  2  as
  3    l_cnt number;
  4  begin
  5    select sum(c1) into l_cnt from u2.tab1;
  6    dbms_output.put_line('l_cnt is ' || l_cnt);
  7  end;
  8  /
 
Procedure created.

Offload Queries from Elastic Pool Leader to Member Refreshable Clones

SQL> create or replace procedure sproc1 (n number)
  2  as
  3    l_cnt number;
  4  begin
  5    select sum(c1) into l_cnt from u2.tab1;
  6    dbms_output.put_line('l_cnt is ' || l_cnt);
  7  end;
  8  /
 
Procedure created.
 
SQL>
SQL> BEGIN
  2    dbms_scheduler.create_job(job_name    => 'PROXYTEST1',
  3                              job_type    => 'PLSQL_BLOCK',
  4                              job_action  => 'BEGIN sproc1(3); END;',
  5                              enabled     => FALSE);
  6  END;
  7  /
 
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 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つのユース・ケースは、ピーク時にこの機能を有効にして、エラスティック・プール・リーダーの負荷を軽減することです。停止時間中は、問合せオフロードを無効にして、リフレッシュ可能クローンのリフレッシュなどのメンテナンス操作を実行できます。