Amazon Redshift
データベース開発者ガイド

手動 WLM を実装する

手動 WLM で、システムパフォーマンスとユーザーエクスペリエンスを管理するには、WLM 設定を変更して、実行時間が長いクエリと短いクエリ用に異なるキューを作成できます。

ユーザーが Amazon Redshift でクエリを実行すると、クエリはクエリキューにルーティングされます。各クエリキューには、いくつかのクエリスロットが含まれています。各キューには、クラスターの使用可能なメモリの一部が割り当てられます。キューのメモリは、キューのクエリスロット間で分割されます。Amazon Redshift では、自動 WLM を使用してクエリの同時実行数を管理できます。詳細については、「自動 WLM の実装」を参照してください。

または、クエリキューごとに WLM プロパティを設定できます。設定することで、メモリをスロット間に割り当てる方法と、実行時に特定のキューにクエリをルーティングする方法を指定します。実行時間の長いクエリをキャンセルするように WLM プロパティを設定することもできます。さらに、WLM プロパティとは別個に、wlm_query_slot_count パラメータを使用することもできます。このパラメータは、複数のスロットを割り当てることで、クエリで使用できるメモリ量を一時的に増やすことができます。

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

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

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

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

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

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

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

  • 同時実行スケーリングモード

  • 同時実行レベル

  • ユーザーグループ

  • クエリグループ

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

  • WLM タイムアウト

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

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

同時実行スケーリングモード

同時実行スケーリングが有効になっていると、同時読み取りクエリの増加を処理する必要がある場合、Amazon Redshift は自動的に追加のクラスター容量を追加します。書き込みオペレーションは、メインクラスターで通常どおり続行されます。クエリをメインクラスターと同時実行スケーリングクラスターのどちらで実行しても、ユーザーには最新のデータが表示されます。

WLM キューを設定することで、どのクエリを同時実行スケーリングクラスターに送信するかを管理します。キューに対して同時実行スケーリングを有効にすると、対象クエリは待機することなく同時実行クラスターに送信されます。詳細については、「同時実行スケーリングを使用する」を参照してください。

同時実行レベル

キューのクエリは、キューに対して定義された WLM クエリスロットの数または同時実行レベルに達するまで、同時に実行されます。その後、以降のキューはキューで待機します。

注記

WLM の同時実行レベルは、クラスターに対して同時実行可能なユーザー接続の数とは異なります。 詳細については、Amazon Redshift Cluster Management Guideの「クラスターへの接続」を参照してください。

自動 WLM 設定では、同時実行レベルが auto (自動)] に設定されます。詳細については、「自動 WLM の実装」を参照してください。

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

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

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

    注記

    ショートクエリアクセラレーション (SQA) を有効にすると、WLM によって実行時間が短いクエリが実行時間が長いクエリよりも優先されます。このため、ショートクエリ用の個別のキューは、大部分のワークフローで不要になります。詳細については、「ショートクエリアクセラレーションを使用する」を参照してください。

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

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

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

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

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

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

ユーザーグループ

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

クエリグループ

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

ワイルドカード

WLM キュー設定でワイルドカードを有効にした場合は、ユーザーグループやクエリグループをキューに個別に割り当てるか、Unix シェル形式のワイルドカードを使用して割り当てることができます。パターンマッチングでは大文字と小文字が区別されません。

たとえば、ワイルドカード文字「*」は任意の文字数に一致します。たとえば、キューのユーザーグループのリストに dba_* を追加すると、dba_ で始まる名前を持つグループに属する、ユーザーが実行するすべてのクエリは、そのキューに割り当てられます。例は、dba_adminDBA_primary です。ワイルドカード文字「?」は、任意の 1 文字に一致します。したがって、キューにユーザーグループ dba?1 が含まれている場合、dba11dba21 は一致しますが、dba12 は一致しません。

ワイルドカードはデフォルトでは無効になっています。

使用する WLM メモリの割合

自動 WLM 設定の場合、メモリの割合は auto に設定されます。詳細については、「自動 WLM の実装」を参照してください。

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

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

WLM タイムアウト

WLM タイムアウト (max_execution_time) は廃止されました。代わりに、query_execution_time を使用してクエリモニタリングルール (QMR) を作成して、経過したクエリ実行時間を制限します。詳細については、「WLM クエリモニタリングルール」を参照してください。

各キューについて WLM タイムアウト値を設定することで、特定の WLM キュー内でクエリが使用できる時間を制限することができます。タイムアウトパラメーターは、ミリ秒単位で、クエリをキャンセルまたはホップする前に Amazon Redshift がクエリの実行を待機する時間を指定します。タイムアウトはクエリの実行時間に基づいていて、キューでの待機時間は含まれません。

WLM は、CREATE TABLE AS (CTAS) ステートメントと読み取り専用クエリ (SELECT ステートメントなど) のホップを試みます。ホップできないクエリはキャンセルされます。詳細については、「WLM クエリキューのホッピング」を参照してください。

WLM タイムアウトは returning 状態に達したクエリには適用されません。クエリの状態を表示するには、STV_WLM_QUERY_STATE システムテーブルを参照してください。COPY ステートメントと、ANALYZE や VACUUM などのメンテナンスオペレーションは、WLM タイムアウトの対象ではありません。

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

statement_timeout も指定されている場合、statement_timeout および WLM タイムアウト (max_execution_time) の低い方が使用されます。

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

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