すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:ワークロード管理にリソースキューを使用する

最終更新日:Mar 28, 2025

このトピックでは、AnalyticDB for PostgreSQL でリソースキューを作成および使用する方法について説明します。リソースキューを使用して、システムリソースを管理および分離できます。

概要

データベースインスタンスの CPU とメモリリソースは限られています。これらのリソースは、データベースのクエリパフォーマンスに影響を与えます。データベースのワークロードがしきい値に達すると、すべてのクエリがリソースを奪い合います。これにより、全体的なクエリパフォーマンスが低下し、遅延の影響を受けやすいビジネスに影響します。

AnalyticDB for PostgreSQL は、システムワークロードを管理するためのリソースキューを提供します。ビジネス要件に基づいて、データベースが処理できる同時クエリの数、各クエリで使用可能なメモリサイズ、各クエリで使用可能な CPU リソースの量を指定できます。このようにして、システムは各クエリに期待されるリソースを割り当て、期待されるクエリパフォーマンスを提供できます。

必要な権限

リソースキューを作成および使用するには、初期アカウント、または RDS_SUPERUSER 権限を持つ特権アカウントを使用する必要があります。

リソースキューを作成する

構文:

CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ])

/* queue_attribute パラメーターは、リソースキューの属性を指定します。有効な値: */

    ACTIVE_STATEMENTS=integer
        [ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

    MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ]
        [ ACTIVE_STATEMENTS=integer ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

パラメーター

説明

ACTIVE_STATEMENTS

ある時点におけるリソースキュー内のアクティブなクエリの最大数。アクティブなクエリとは、実行中のクエリを指します。

MEMORY_LIMIT

単一の計算ノード上のリソースキュー内のすべてのクエリで使用できる最大メモリサイズ。

  • 単位: KB、MB、または GB。

  • デフォルト値: -1。無制限のメモリサイズを指定します。

MAX_COST

リソースキュー内のクエリの最大コスト。デフォルト値: -1。無制限のコストを指定します。

説明

リソースキューのクエリコストは、AnalyticDB for PostgreSQL のクエリ オプティマイザーによって推定されます。

COST_OVERCOMMIT

このパラメーターは、MAX_COST パラメーターを指定した場合にのみサポートされます。

  • COST_OVERCOMMIT パラメーターが TRUE に設定されている場合、システムワークロードが低いときに、コストが MAX_COST パラメーターの値よりも大きいクエリが実行されます。

  • COST_OVERCOMMIT パラメーターが FALSE に設定されている場合、コストが MAX_COST パラメーターの値よりも大きいクエリは拒否されます。

MIN_COST

リソースキュー内のクエリの最小コスト。コストが MIN_COST パラメーターの値よりも小さいクエリは、キューに入れられることなくすぐに実行されます。

PRIORITY

リソースキューの優先度。優先度の高いリソースキュー内のクエリには、実行のためにより多くの CPU リソースが割り当てられます。有効な値:

  • MIN

  • LOW

  • MEDIUM (デフォルト)

  • HIGH

  • MAX

説明

リソースキューを作成するときは、ACTIVE_STATEMENTS パラメーターと MAX_COST パラメーターのいずれかを指定する必要があります。指定しないと、作成は失敗します。

CREATE RESOURCE QUEUE adhoc2 WITH (MEMORY_LIMIT='2000MB');
/* エラー: 少なくとも 1 つのしきい値 ("ACTIVE_STATEMENTS"、"MAX_COST") を指定する必要があります */
  • アクティブなクエリの最大数を構成する。

    リソースキューを作成するときは、次のステートメントを実行して、リソースキュー内のアクティブなクエリの最大数を構成します。

    CREATE RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=3);

    この例では、adhoc という名前のリソースキューが作成され、特定の時点におけるリソースキューのアクティブなクエリは最大 3 つまで許可されます。リソースキューに 3 つのアクティブなクエリが存在する場合、3 つのクエリが実行されるまで、新しいクエリは実行のためにキューに入れられます。

  • メモリの上限を構成する。

    リソースキューを作成するときは、次のステートメントを実行して、リソースキュー内のすべてのクエリで使用できる最大メモリサイズを構成します。

    CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS=20, MEMORY_LIMIT='2000MB');

    この例では、myqueue という名前のリソースキューが作成され、特定の時点におけるリソースキューのアクティブなクエリは最大 20 まで許可され、リソースキュー内のすべてのクエリは最大 2,000 MB のメモリを使用できます。クエリを実行すると、MEMORY_LIMIT または ACTIVE_STATEMENTS パラメーターで使用可能なメモリが計算ノードで消費される可能性があります。この場合、myqueue リソースキューの各クエリは最大 100 MB のメモリを使用できます。クエリが独立したメモリを必要とする場合は、statement_mem パラメーターを使用して、このクエリのメモリサイズを設定できます。このパラメーターの値は、MEMORY_LIMIT パラメーターと max_statement_mem パラメーターの値よりも小さくなければなりません。例:

    SET statement_mem='1GB';
    SELECT * FROM test_adbpg WHERE col='adb4pg' ORDER BY id;
    RESET statement_mem;
  • リソースキューの優先度を構成する。

    異なるリソースキューの優先度を構成して、リソースキュー内のクエリによる CPU リソースの使用を制御できます。たとえば、AnalyticDB for PostgreSQL が多数の同時クエリを受信した場合、優先度の低いリソースキュー内のクエリよりも、優先度の高いリソースキュー内のクエリにより多くのリソースを割り当てます。これにより、優先度の高いリソースキューには、クエリを実行するための十分な CPU リソースがあることが保証されます。

    リソースキューを作成するときに、リソースキューの優先度を構成できます。例:

    CREATE RESOURCE QUEUE executive WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);

    リソースキューを作成した後に、リソースキューの優先度を変更することもできます。詳細については、このトピックの「リソースキューの構成を変更する」セクションをご参照ください。

    説明

    リソースキューの PRIORITY 設定は、ACTIVE_STATEMENTS および MEMORY_LIMIT 設定とは異なります。

    • ACTIVE_STATEMENTS パラメーターと MEMORY_LIMIT パラメーターの値によって、クエリがキューに許可され、最終的に実行されるかどうかが決まります。

    • PRIORITY 設定により、システムがクエリの実行を開始した後、使用可能な CPU リソースが、システムの実行ステータスとクエリが属するリソースキューの優先順位に基づいて、クエリに動的に割り当てられます。

    たとえば、AnalyticDB for PostgreSQL が優先順位の低いリソースキューでクエリを実行しているときに、優先順位の高いリソースキューのクエリが許可され、実行準備が完了します。AnalyticDB for PostgreSQL は、優先順位の高いリソースキューからのクエリにより多くの CPU リソースを割り当て、優先順位の低いリソースキューのクエリの CPU リソースを削減します。CPU リソースの割り当てには、次のルールが適用されます。

    • AnalyticDB for PostgreSQL は、同じ優先順位のリソースキューのクエリに同じ量の CPU リソースを割り当てます。

    • AnalyticDB for PostgreSQL が優先順位の高い、中間の、および低いリソースキューのクエリを受信した場合、CPU リソースの 90% を優先順位の高いリソースキューのクエリに割り当てます。残りの 10% の CPU リソースのうち、AnalyticDB for PostgreSQL は 90% を優先順位の中間のリソースキューのクエリに割り当て、10% を優先順位の低いリソースキューのクエリに割り当てます。

リソースキューを作成した後、pg_resqueue テーブルからリソースキューのステータスと制限をクエリできます。

SELECT * FROM pg_resqueue WHERE rsqname='adhoc';

トランザクションブロック内でリソースキューを作成することはできません。例:

BEGIN
CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);
-- エラー: CREATE RESOURCE QUEUE はトランザクションブロック内で実行できません。
ERROR:  CREATE RESOURCE QUEUE cannot run inside a transaction block
説明

すべて SQL 文がリソースキューによって制限されるわけではありません。

  • resource_select_only パラメーターが on に設定されている場合、SELECTSELECT INTOCREATE TABLE AS SELECT、および DECLARE CURSOR 文はリソースキューによって制限されます。

  • resource_select_only パラメーターが off に設定されている場合、INSERTUPDATE、および DELETE 文は、SELECT、SELECT INTO、CREATE TABLE AS SELECT、および DECLARE CURSOR 文に加えて、リソースキューによって制限されます。

  • AnalyticDB for PostgreSQL では、resource_select_only パラメーターはデフォルトで off に設定されています。

リソースキューへのユーザーの割り当て

リソースキューを作成した後、1 人以上のユーザーをリソースキューに割り当てる必要があります。これにより、AnalyticDB for PostgreSQL は、リソースキュー内のユーザーのクエリのリソースを管理できます。

説明
  • ユーザーがリソースキューに割り当てられていない場合、AnalyticDB for PostgreSQL は、このユーザーを pg_default リソースキューに割り当てます。

  • pg_default キューでは、500 のアクティブなクエリを同時に実行できます。リソースキューにはコスト制限は課されません。リソースキューの優先度は MEDIUM です。

次のいずれかの文を実行して、ユーザーをリソースキューに割り当てます。

ALTER ROLE name RESOURCE QUEUE queue_name;
CREATE ROLE name WITH LOGIN RESOURCE QUEUE queue_name;

ユーザーの作成時に、リソースキューをユーザーに割り当てることができます。ユーザーの作成後に、ユーザーに割り当てられているリソースキューを変更することもできます。

説明

ユーザーは 1 つのリソースキューにのみ所属できます。

リソースキューからユーザーを削除する

リソースキューからユーザーを削除するには、次の文を実行します。

ALTER ROLE role_name RESOURCE QUEUE none;

リソースキューの構成を変更する

次の文を使用して、リソースキューの構成を変更できます。

  • アクティブなクエリの数を変更します。

    ALTER RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=5);
  • すべてのクエリで使用できる最大メモリサイズと、クエリの最大コストを変更します。

    ALTER RESOURCE QUEUE adhoc WITH (MAX_COST=-1.0, MEMORY_LIMIT='2GB');
  • 優先度を変更します。

    ALTER RESOURCE QUEUE adhoc WITH (PRIORITY=LOW);
    ALTER RESOURCE QUEUE reporting WITH (PRIORITY=HIGH);

リソースキューを削除する

リソースキューを削除するには、次の文を実行します。

DROP RESOURCE QUEUE name;
説明

次の項目を含むリソースキューは削除できません。

  • 割り当て済みのユーザー

  • 待機状態のクエリ

一般的なエラーとトラブルシューティング

エラー: リソースキューを変更するにはスーパーユーザーである必要があります

原因: データベースアカウントに十分な権限がありません。リソースキューを作成および管理するには、初期アカウント、または RDS_SUPERUSER 権限を持つ特権アカウントを使用する必要があります。

解決策: 初期アカウント、または RDS_SUPERUSER 権限を持つ特権アカウントを使用します。初期アカウントまたは特権アカウントを使用して、データベースアカウントに RDS_SUPERUSER ロールを付与することもできます。

ALTER ROLE role_name WITH RDS_SUPERUSER; /* role_name に RDS_SUPERUSER を付与 */