4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Autonomous Database:Elastic Poolのプール・リーダーに対するクエリをプール・メンバーにオフロードする

Last updated at Posted at 2025-03-06

はじめに

Autonomous Databaseに、1つまたは複数のリフレッシュ可能クローンがElastic Poolのプールリーダーのクエリーを処理できるようにすることで、プール・リーダーの負荷をオフロードして処理パフォーマンスを向上するためのElastic Pool Query Offloadの機能が追加されました。
この機能により、リフレッシュ可能クローンを追加して、クエリー(読み取り)需要の増加に対応することもできます。クエリをオフロードすることで、アプリケーションを水平方向に拡張することができ、クエリ需要を満たすために必要なリフレッシュ可能クローンを追加してシステム全体のパフォーマンスを維持することができます。

スクリーンショット 2025-03-06 19.19.33.png

1. Elastic Pool Query Offloadの前提条件

Elastic Pool Query Offloadを利用する前提条件は以下の通りです。
・Elastic Poolの利用
・Elastic Poolのプール・リーダーのリフレッシュ可能クローンとしてプール・メンバーを作成
・アプリケーション・ユーザーはプール・リーダーに接続してクエリを実行

2. 検証環境

前提条件に沿って、以下のような環境を準備しました。
・Elastic Poolのプール・リーダーとして、POOLLEADER19Cという名前のAutonomous Databaseを作成
・Elastic Poolのプール・メンバーとして、プール・リーダーPOOLLEADER19Cのリフレッシュ可能クローンPOOLMEMBER19C1を作成
・Elastic Poolのプール・メンバーとして、プール・リーダーPOOLLEADER19Cのリフレッシュ可能クローンPOOLMEMBER19C2を作成

スクリーンショット 2025-03-06 19.32.06.png

3. 動作検証

adminユーザとして、プール・リーダーのAutonomous DatabaseにSQL*Plusから接続します。

[oracle@oracle23ai ~]$ sqlplus admin/Demo#1Demo#1@poolleader

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Jan 17 15:55:39 2025
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Last Successful login time: Fri Jan 17 2025 15:07:06 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.26.0.1.0

SQL> 

dba_pdbsビューのcloud_identity列からデータベース名を抽出します。

SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_NAME') database_name FROM dba_pdbs;

DATABASE_NAME
--------------------------------------------------------------------------------
POOLLEADER19C

SQL>

まだQuery Offloadを有効にしていないので、クエリはプール・リーダーで実行され、プール・リーダーのデータベース名が返ってきました。

DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADプロシージャを実行し、Query Offloadを有効化します。
パラメータを指定せずにDBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADプロシージャを実行すると、全てのクエリ(SELECT文)がプール・メンバーにオフロードされます。

SQL> EXEC DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD();

PL/SQL procedure successfully completed.

SQL> 

再度、dba_pdbsビューのcloud_identity列からデータベース名を抽出してみます。

SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_NAME') database_name FROM dba_pdbs;

DATABASE_NAME
--------------------------------------------------------------------------------
POOLMEMBER19C1

SQL>

クエリがプール・メンバー(リフレッシュ可能クローン)にオフロードされ、プール・メンバーのデータベース名が返ってきました。

次に、特定のセッションに対してのみ、Query Offloadを有効化します。
パラメータとしてクエリをオフロードするセッションのモジュール名、アクション名を指定してDBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADプロシージャを実行すると、条件に合致したセッションからのクエリ(SELECT文)がプール・メンバーにオフロードされます。
ここでは、モジュール名がmodule1、アクション名がaction1となっているセッションからのクエリのみがプール・メンバーにオフロードされるように設定してみます。

SQL> EXEC DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD('["module1"]','["action1"]');

PL/SQL procedure successfully completed.

SQL>

まず、セッションのモジュール名、アクション名を指定せずにクエリを実行してみます。

SQL>  SELECT JSON_VALUE(cloud_identity, '$.DATABASE_NAME') database_name FROM dba_pdbs;

DATABASE_NAME
--------------------------------------------------------------------------------
POOLLEADER19C

SQL> 

セッションの モジュール名、アクション名がオフロードの条件と一致しないため、クエリがオフロードされず、Pool Leaderのデータベース名が返されました。

DBMS_APPLICATION_INFO.SET_MODULEプロシージャで、現行セッションのモジュール名をmodule1に、セッションのアクション名をaction1に設定します。

SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE('module1','action1');

PL/SQL procedure successfully completed.

SQL> 

再度、同じクエリを実行してみます。

SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_NAME') database_name FROM dba_pdbs;

DATABASE_NAME
--------------------------------------------------------------------------------
POOLMEMBER19C1

SQL>

セッションの モジュール名、アクション名がオフロードの条件と一致するため、クエリがオフロードされ、Pool Memberのデータベース名が返されました。

ここで、DDLおよびDMLを実行してみます。
DDL、DMLは全てプール・リーダーで実行されます。

SQL> CREATE TABLE test(id NUMBER);

Table created.

SQL> INSERT INTO test VALUES(1);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> 

ここで、作成した表testに対してクエリを実行してみます。

SQL> SELECT * FROM test;
SELECT * FROM test
              *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-02063: preceding line from ADB$LINK
Help: https://docs.oracle.com/error-help/db/ora-00942/


SQL>

クエリがオフロードされますが、クローンのリフレッシュが実行されておらず、クローンにはオブジェクト(test表)が存在しないため、エラーになりました。

ここで、OCIコンソールからプール・リーダーの全てのリフレッシュ可能クローンをリフレッシュします。

プール・リーダーの全てのリフレッシュ可能クローンのリフレッシュには、こちらを使用しました。

ここで、作成した表testに対してクエリを実行してみます。

SQL> SELECT * FROM test;

        ID
----------
	     1

SQL>

クローンのリフレッシュ実行後は、クローンにもオブジェクトが存在するため、クエリがプール・メンバーにオフロードされてもエラーにならず、正しく結果が返ってきました。

DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOADプロシージャでQuery Offloadを無効化します。

SQL> EXEC DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOAD;

PL/SQL procedure successfully completed.

SQL> 

dba_pdbsビューのcloud_identity列からデータベース名を抽出します。

SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_NAME') database_name FROM dba_pdbs;

DATABASE_NAME
--------------------------------------------------------------------------------
POOLLEADER19C

SQL>

Query Offloadが無効化されたので、クエリはプール・リーダーで実行され、プール・リーダーのデータベース名が返ってきました。

参考情報

Offload Queries from Elastic Pool Leader to Member Refreshable Clones
DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOADプロシージャ
DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOADプロシージャ
DBMS_APPLICATION_INFO.SET_MODULEプロシージャ

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?