メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

クエリキューの定義

ユーザーが Amazon Redshift でクエリを実行すると、クエリはクエリキューにルーティングされます。各クエリキューには、多くのクエリスロットが含まれています。各キューには、クラスターの使用可能なメモリの一部が割り当てられます。キューのメモリは、キューのクエリスロットに分けられます。各クエリキューの WLM プロパティを設定し、メモリがスロット間で割り当てられる方法、実行時に特定のキュークエリをルーティングする方法、実行時間が長いクエリをキャンセルするタイミングを指定できます。WLM のプロパティとは別個の wlm_query_slot_count パラメータを使用し、複数のスロットを割り当てることでクエリが一時的に多くのメモリを使用できるようにすることもできます。

デフォルトでは、Amazon Redshift は次のクエリキューを設定します。

  • 1 つのスーパーユーザーキュー:

    スーパーユーザーキューは、スーパーユーザー専用に予約されており、設定することはできません。このキューは、システムに影響を与えるクエリを実行する必要があるときや、トラブルシューティング目的でのみ使用してください。たとえば、ユーザーの実行時間が長いクエリをキャンセルしたり、ユーザーをデータベースに追加したりする必要がある場合にこのキューを使用します。これを使用してルーチンクエリを実行しないでください。キューはコンソールに表示されませんが、データベースのシステムテーブルには 5 番目のキューとして表示されます。スーパーユーザーキューでクエリを実行するには、ユーザーはスーパーユーザーとしてログインし、事前定義された superuser クエリグループを使用してクエリを実行する必要があります。

  • 1 つのデフォルトのユーザーキュー:

    デフォルトキューは、最初は 5 つのクエリを同時に実行するように設定されています。デフォルトキューの同時実行数、タイムアウト、メモリ割り当てのプロパティを変更することはできますが、ユーザーグループまたはクエリグループを指定することはできません。デフォルトキューは、WLM 設定の最後のキューにする必要があります。他のキューにルーティングされないクエリはすべて、デフォルトのキューで実行されます。

クエリキューは WLM 設定で定義されます。WLM 設定はパラメータグループの編集可能なパラメータ (wlm_json_configuration) であり、1 つ以上のクラスターと関連付けることができます。詳細については、「WLM 設定の変更」を参照してください。

デフォルトの WLM 設定にクエリキューを追加することができます (最大合計 8 つのユーザーキュー)。クエリキューごとに以下を設定できます。

  • 同時実行レベル

  • ユーザーグループ

  • クエリグループ

  • 使用する WLM メモリの割合

  • WLM タイムアウト

  • クエリのモニタリングルール

同時実行レベル

キューのクエリは、キューに対して定義された同時実行レベルに達するまで、同時に実行されます。その後、以降のキューはキューで待機します。各キューは、最大で同時に 50 個のクエリを実行するように設定できます。すべてのユーザー定義キューの最大合計同時実行レベルは 50 です。制限にはデフォルトのキューが含まれますが、予約された Superuser キューは含まれません。Amazon Redshift は、デフォルトでは各キューに固定された同じ配分の使用可能メモリを割り当てます。また、キューの各クエリスロットに固定された同じ配分のキューのメモリを割り当てます。各キューに割り当てられるメモリの比率は、memory_percent_to_use プロパティを使用して WLM 設定で定義されます。実行時、wlm_query_slot_count パラメータを設定してクエリに割り当てられるスロットの数を指定することにより、クエリに割り当てられるメモリの量を一時的に上書きできます。

WLM キューの同時実行レベルはデフォルトで 5 です。次のような場合は、同時実行レベルを引き上げるとワークロードに良い影響があることがあります。

  • 多数の小さいクエリが長時間実行クエリを強制的に待機させられている場合は、より高い同時実行レベルのキューを別に作成し、小さいクエリをそのキューに割り当てます。キューの同時実行レベルが高いと各クエリスロットに割り当てられるメモリは少なくなるものの、クエリが小さい方が必要なメモリが少なくなります。

  • 単一のスライスのデータにアクセスするクエリが複数ある場合は、別の WLM キューを設定してこれらのクエリを同時に実行します。Amazon Redshift によって同時実行クエリは個別のスライスに割り当てられるため、複数のクエリを複数のスライスで並列的に実行できます。たとえば、クエリが分散キーに関する述語を持つ単純な集計である場合、クエリのデータは単一のスライスに配置されます。

ベストプラクティスとして、15 以下の同時実行レベルを使用することをお勧めします。クラスターのすべてのコンピューティングノードおよびノードのすべてのスライスは、並列クエリ実行に関与します。同時実行レベルを引き上げると、システムリソースの競合が増え、全体的なスループットが制限されます。

各キューに割り当てられるメモリは、そのキューのクエリスロット間で分割されます。クエリで使用可能なメモリの量は、クエリが実行されているクエリスロットに割り当てられたメモリです。実際に同時実行されているクエリの数には関係ありません。同時実行レベルが 5 のときにすべてメモリで実行できるクエリは、同時実行レベルが 20 に引き上げられると、中間結果をディスクに書き込まなければならなくなることがあります。ディスク I/O が余分に発生すると、パフォーマンスが低下する可能性があります。

特定のクエリに、単一のクエリスロットに割り当てられているメモリよりも多くのメモリが必要な場合、wlm_query_slot_count パラメータの値を引き上げて、使用可能なメモリを増やすことができます。以下の例は wlm_query_slot_count を 10 に設定し、バキュームを実行してから、wlm_query_slot_count を 1 にリセットしています。

Copy
set wlm_query_slot_count to 10; vacuum; set wlm_query_slot_count to 1;

詳細については、「クエリパフォーマンスの向上」を参照してください。

ユーザーグループ

各ユーザーグループ名を指定するか、ワイルドカードを使用して、一連のユーザーグループをキューに割り当てることができます。リストされたユーザーグループのメンバーがクエリを実行すると、そのクエリは対応するキューで実行されます。キューに割り当てることができるユーザーグループの数に設定された制限はありません。詳細については、「ワイルドカード」を参照してください。

クエリグループ

各クエリグループ名を指定するか、ワイルドカードを使用して、一連のクエリグループをキューに割り当てることができます。クエリグループはラベルにすぎません。実行時に、一連のクエリにクエリグループラベルを割り当てることができます。リストされたクエリグループに割り当てられたクエリは、対応するキューで実行されます。キューに割り当てることができるクエリグループの数に設定された制限はありません。詳細については、「ワイルドカード」を参照してください。

ワイルドカード

WLM キュー設定でワイルドカードが有効になっている場合は、個別に、または Unix シェル形式のワイルドカードを使用して、ユーザーグループとクエリグループをキューに割り当てることができます。パターンマッチングでは大文字と小文字が区別されません。たとえば、「*」ワイルドカード文字は任意の数の文字に一致するため、キューのユーザーグループに dba_* を追加すると、名前が dba_ で始まるグループ (dba_adminDBA_primary など) に属するユーザーによって実行される任意のクエリが、そのキューに割り当てられます。「?」ワイルドカード文字は任意の単一の文字に一致するため、キューにユーザーグループ dba?1 が含まれる場合、dba11 および dba21 という名前のユーザーグループが一致しますが、dba12 は一致しません。ワイルドカードはデフォルトでは無効になっています。

WLM Memory Percent to Use

クエリに割り当てられる使用可能なメモリの量を指定するには、WLM Memory Percent to Use パラメータを設定します。デフォルトでは、各ユーザー定義キューには、ユーザー定義クエリで使用可能なメモリが均等に割り当てられます。たとえば、4 つのユーザー定義キューがある場合、各キューには使用可能なメモリの 25 パーセントが割り当てられます。Superuser キューには、独自に割り当てられているメモリがあり、変更できません。割り当て量を変更するには、各キューのメモリの割合を整数で割り当てます (最大で合計 100 パーセント)。未割り当てのメモリは Amazon Redshift によって管理され、処理用に追加メモリをリクエストするキューに一時的に付与できます。

たとえば、4 つのキューを設定する場合、20 パーセント、30 パーセント、15 パーセント、15 パーセントのようにメモリを割り当てることができます。残りの 20 パーセントは未割り当てになり、サービスによって管理されます。

WLM タイムアウト

各キューについて WLM タイムアウト値を設定することで、特定の WLM キュー内でクエリが使用できる時間を制限することができます。タイムアウトパラメータは、ミリ秒単位で、クエリをキャンセルする前に Amazon Redshift がクエリの実行を待機する時間を指定します。タイムアウトはクエリの実行時間に基づいていて、キューでの待機時間は含まれません。WLM タイムアウトは returning 状態に達したクエリには適用されません。クエリの状態を表示するには、STV_WLM_QUERY_STATE システムテーブルを参照してください。

WLM タイムアウトの機能は statement_timeout 設定パラメータに似ています。ただし、statement_timeout 設定パラメータがクラスター全体に適用される場合、WLM タイムアウトは WLM 設定の単一のキューに固有であることが異なります。

WLM クエリキューのホッピング

SELECT ステートメントなどの読み取り専用クエリが、WLM のタイムアウトによってキャンセルされた場合、WLM は WLM キューの割り当てルールに基づいて、次に一致するキューにクエリをルーティングするよう試みます。クエリがその他のキューの定義に一致しない場合、クエリはキャンセルされ、デフォルトキューには割り当てられません。ユーザー定義関数 (UDF) またはデータベースに書き込みを行うその他のクエリは再ルーティングできず、キャンセルされます。このようなクエリには、データ操作言語 (DML) のステートメント、データ定義言語 (DDL) ステートメント、および VACUUM など、データベースを変更するコマンドが含まれます。

クエリのモニタリングルール

クエリモニタリングルールは、WLM キューのメトリクスベースのパフォーマンスの境界を定義し、クエリがこれらの境界を超えた場合のアクションを指定します。たとえば、実行時間の短いクエリ専用のキューとして、60 秒以上経過したらクエリーを中止するようにルールを作成できます。デザインの不十分なクエリを追跡する目的で、ネステッドループを含むクエリを記録する別のルールを設定することができます。詳細については、「WLM クエリモニタリングルール」を参照してください。