このトピックでは、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 | 単一の計算ノード上のリソースキュー内のすべてのクエリで使用できる最大メモリサイズ。
|
MAX_COST | リソースキュー内のクエリの最大コスト。デフォルト値: -1。無制限のコストを指定します。 説明 リソースキューのクエリコストは、AnalyticDB for PostgreSQL のクエリ オプティマイザーによって推定されます。 |
COST_OVERCOMMIT | このパラメーターは、MAX_COST パラメーターを指定した場合にのみサポートされます。
|
MIN_COST | リソースキュー内のクエリの最小コスト。コストが MIN_COST パラメーターの値よりも小さいクエリは、キューに入れられることなくすぐに実行されます。 |
PRIORITY | リソースキューの優先度。優先度の高いリソースキュー内のクエリには、実行のためにより多くの CPU リソースが割り当てられます。有効な値:
|
リソースキューを作成するときは、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 に設定されている場合、SELECT、SELECT INTO、CREATE TABLE AS SELECT、およびDECLARE CURSOR文はリソースキューによって制限されます。resource_select_onlyパラメーターが off に設定されている場合、INSERT、UPDATE、および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 を付与 */