Azure Synapse Analytics でのワークロードを管理する

完了

Azure Synapse Analytics では、ワークロードが競合している場合にリソースの可用性を作成、制御、管理できます。 これにより、使用可能なリソースのために待機しているときに、各ワークロードの相対的な重要度を管理できます。

読み込み時間を短縮するために、"重要度" を above_normal または High に設定して、読み込みユーザーのワークロード分類子を作成できます。 ワークロードの重要度により、優先度の低い他の待機中のタスクよりも読み込みが優先されます。 ワークロードの分離のための独自のワークロード グループの定義と併せて使用して、繁忙期および閑散期のリソース割り当ての最小値と最大値を管理します。

Azure Synapse の専用 SQL プールのワークロード管理は、次の 3 つの大まかな概念で構成されています。

  • ワークロードの分類
  • ワークロードの重要度
  • ワークロードの分離

これらの機能により、ワークロードによるシステム リソースの活用方法をより細かく制御できます。

ワークロード分類

ワークロード管理の分類では、リソース クラスと重要度を割り当てて、ワークロード ポリシーを要求に適用することができます。

データ ウェアハウスのワークロードを分類するにはさまざまな方法がありますが、最も簡単で一般的な分類は読み込みとクエリです。 データを読み込むには、INSERT、UPDATE、DELETE ステートメントを使用します。 データをクエリするには、SELECT を使用します。 データ ウェアハウス ソリューションには、多くの場合、より高いリソース クラスにはより多くのリソースを割り当てるなど、読み込みアクティビティに関するワークロード ポリシーがあります。 クエリには、読み込みアクティビティに比べて重要度を低くするなど、異なるワークロード ポリシーを適用できます。

読み込みとクエリのワークロードを下位分類することもできます。 下位分類を使用すると、ワークロードをより細かく制御できます。 たとえば、クエリ ワークロードがキューブの更新、ダッシュボードのクエリ、アドホック クエリで構成されているとします。 これらのクエリ ワークロードをそれぞれ異なるリソース クラスや重要度の設定で分類できます。 読み込みも、下位分類の利点を受けることができます。 大規模な変換を大規模なリソース クラスに割り当てることができます。 気象データやソーシャル データ フィードの前に主要な売上データが読み込まれるようにするため、より高い重要度を設定できます。

リソースを必要としないか、実行に影響を及ぼす重要度を必要としない一部のステートメントは分類されません。 DBCC コマンド、BEGIN、COMMIT、および ROLLBACK TRANSACTION ステートメントは分類されません。

ワークロードの重要度

ワークロードの重要度は、要求がリソースにアクセスする順序に影響します。 ビジー状態のシステムでは、重要度の高い要求がリソースに最初にアクセスします。 重要度によって、ロックへの順次アクセスも保証されます。 重要度のレベルには、low、below_normal、normal、above_normal、high の 5 つがあります。 重要度が設定されない要求には、既定のレベルである normal が割り当てられます。 同じ重要度レベルが設定された要求については、現時点で存在しているスケジュール動作と同じになります。

ワークロードの分離

ワークロードの分離では、ワークロード グループのリソースが予約されます。 ワークロード グループに予約されているリソースは、そのワークロード グループのみで実行されるように保証されます。 ワークロード グループでは、リソース クラスと同様に、要求ごとに割り当てられるリソースの量を定義することもできます。 ワークロード グループを使用すると、一連の要求で消費できるリソースの量を予約したり上限を設定したりできます。 最後に、ワークロード グループは、クエリ タイムアウトなどのルールを要求に適用するためのメカニズムです。

ワークロード管理を実行するには、次の手順を実行します

ワークロード分類子を作成して、特定のクエリに重要度を追加する

組織から、CEO によって実行されるクエリを他のユーザーより重要なものとしてマークして、大量のデータ読み込みやキュー内の他のワークロードが原因で低速に見えないようにする方法がないか聞かれました。 ワークロード分類子を作成し、重要度を追加して、CEO のクエリを優先することにしました。

  1. [開発] ハブを選択します。

    [開発] ハブが強調表示されています。

  2. [開発] メニューの [+] ボタン (1) を選択し、コンテキスト メニューから [SQL スクリプト] (2) を選択します。

    [SQL スクリプト] コンテキスト メニュー項目が強調表示されています。

  3. ツールバー メニューで、SQL プール データベースに接続してクエリを実行します。

    クエリ ツールバーの [接続先] オプションが強調表示されています。

  4. クエリ ウィンドウで、スクリプトを次のように置き換えて、asa.sql.workload01 (組織の CEO を表す) または asa.sql.workload02 (プロジェクトで作業しているデータアナリストを表す) としてログインしているユーザーによる現在実行中のクエリがないことを確認します。

    --First, let's confirm that there are no queries currently being run by users logged in workload01 or workload02
    
    SELECT s.login_name, r.[Status], r.Importance, submit_time, 
    start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s 
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload01','asa.sql.workload02') and Importance
    is not NULL AND r.[status] in ('Running','Suspended') 
    --and submit_time>dateadd(minute,-2,getdate())
    ORDER BY submit_time ,s.login_name
    
  5. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツールバーの [実行] ボタンが強調表示されています。

    クエリが実行されていないことを確認したので、次に、システムで多くのクエリを実行し、asa.sql.workload01asa.sql.workload02 の動作を確認する必要があります。 これを行うには、クエリをトリガーする Azure Synapse パイプラインを実行します。

  6. [統合] ハブを選択します。

    [統合] ハブが強調されています。

  7. [Lab 08 - Execute Data Analyst and CEO Queries] (ラボ 08 - データ分析と CEO クエリを実行する) パイプライン (1) を選択します。これは、asa.sql.workload01asa.sql.workload02 クエリを実行またはトリガーします。 [トリガーの追加] (2) を選択し、[今すぐトリガーする] (3) を選択します。 表示されるダイアログで、[OK] を選択します。

    [トリガーの追加] と [Trigger now] (今すぐトリガー) メニュー項目。

  8. トリガーされたクエリをシステムに投入ときに何が起こったかを見てみましょう。 クエリ ウィンドウで、スクリプトを次のように置き換えます。

    SELECT s.login_name, r.[Status], r.Importance, submit_time, start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s 
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload01','asa.sql.workload02') and Importance
    is not NULL AND r.[status] in ('Running','Suspended') and submit_time>dateadd(minute,-2,getdate())
    ORDER BY submit_time ,status
    
  9. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツール バーの [実行] ボタンが再度強調されています。

    次のような出力が表示されます。

    SQL クエリの結果の表示。

    すべてのクエリの重要度レベルが normal に設定されていることに注意してください。

  10. asa.sql.workload01機能を実装することによって、asa.sql.workload01 ユーザー クエリの優先順位を指定します。 クエリ ウィンドウで、スクリプトを次のように置き換えます。

    IF EXISTS (SELECT * FROM sys.workload_management_workload_classifiers WHERE name = 'CEO')
    BEGIN
        DROP WORKLOAD CLASSIFIER CEO;
    END
    CREATE WORKLOAD CLASSIFIER CEO
      WITH (WORKLOAD_GROUP = 'largerc'
      ,MEMBERNAME = 'asa.sql.workload01',IMPORTANCE = High);
    

    このスクリプトを実行して、largerc ワークロード グループを使用してクエリの重要度レベルを High に設定する、CEO という名前の新しいワークロード分類子を作成します。

  11. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツール バーの [実行] ボタンが再度強調されています。

  12. 次に、クエリをシステムに投入し、asa.sql.workload01 および asa.sql.workload02 クエリの結果を確認してみましょう。 これを行うには、クエリをトリガーする Azure Synapse パイプラインを実行します。 Integrate タブを選択し、[Lab 08 - Execute Data Analyst and CEO Queries] (ラボ 08 - データ分析と CEO クエリを実行する) パイプラインを実行します。これにより、asa.sql.workload01 および asa.sql.workload02 クエリが実行またはトリガーされます。

  13. クエリ ウィンドウで、スクリプトを次のように置き換えて、今回は asa.sql.workload01 クエリがどのように動作するかを確認します。

    SELECT s.login_name, r.[Status], r.Importance, submit_time, start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s 
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload01','asa.sql.workload02') and Importance
    is not NULL AND r.[status] in ('Running','Suspended') and submit_time>dateadd(minute,-2,getdate())
    ORDER BY submit_time ,status desc
    
  14. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    [実行] ボタンが再度強調されています。

    次のような出力が表示されます。

    SQL クエリの結果。

    asa.sql.workload01 ユーザーによって実行されるクエリの重要度が asa.sql.workload01 であることに注意してください。

  15. [監視] ハブを選択します。

    [監視] ハブが強調されています。

  16. [パイプラインの実行] (1) を選択し、[実行中] (3) とマークされている各 Lab 08 パイプラインの [再帰のキャンセル] (2) を選択します。 これにより、残りのタスクを高速化できます。

    [再帰のキャンセル] オプションが表示されています。

ワークロードの分離を使用して特定のワークロードのリソースを予約する

ワークロードの分離とは、リソースがワークロード グループ専用で予約されることを意味します。 ワークロード グループは、一連の要求のコンテナーであり、ワークロードの分離などのワークロードの管理をシステム上で構成するための基礎となります。 単純なワークロード管理構成では、データの読み込みとユーザークエリを管理できます。

ワークロードの分離がされない場合、要求はリソースの共有プールで動作します。 共有プール内のリソースへのアクセスは保証されず、重要度基準で割り当てられます。

Tailwind Traders が提供するワークロードの要件を考慮して、CEO によって実行されるクエリのリソースを予約する CEODemo という新しいワークロードグループを作成することにしました。

まず、さまざまなパラメーターを試してみましょう。

  1. クエリ ウィンドウで、スクリプトを次のように置き換えます。

    IF NOT EXISTS (SELECT * FROM sys.workload_management_workload_groups where name = 'CEODemo')
    BEGIN
        Create WORKLOAD GROUP CEODemo WITH  
        ( MIN_PERCENTAGE_RESOURCE = 50        -- integer value
        ,REQUEST_MIN_RESOURCE_GRANT_PERCENT = 25 --  
        ,CAP_PERCENTAGE_RESOURCE = 100
        )
    END
    

    このスクリプトでは、CEODemo というワークロード グループを作成し、そのワークロード グループ専用のリソースを予約します。 この例では、MIN_PERCENTAGE_RESOURCE が 50% に設定され、REQUEST_MIN_RESOURCE_GRANT_PERCENT が 25% に設定されているワークロード グループに、2 つの同時実行が保証されます。

  2. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    [実行] ボタンが強調されています。

  3. クエリ ウィンドウで、スクリプトを次のように置き換えて、ワークロード グループと、着信要求に重要度を割り当てる CEODreamDemo というワークロード分類子を作成します。

    IF NOT EXISTS (SELECT * FROM sys.workload_management_workload_classifiers where  name = 'CEODreamDemo')
    BEGIN
        Create Workload Classifier CEODreamDemo with
        ( Workload_Group ='CEODemo',MemberName='asa.sql.workload02',IMPORTANCE = BELOW_NORMAL);
    END
    

    このスクリプトは、新しい CEODreamDemo ワークロード分類子を使用して、asa.sql.workload02 ユーザーに対して重要度を BELOW_NORMAL に設定します。

  4. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    [実行] ボタン。

  5. クエリ ウィンドウで、スクリプトを次のように置き換えて、asa.sql.workload02 により実行されているアクティブなクエリがないことを確認し ます (中断されたクエリは OK です)。

    SELECT s.login_name, r.[Status], r.Importance, submit_time,
    start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload02') and Importance
    is not NULL AND r.[status] in ('Running','Suspended')
    ORDER BY submit_time, status
    
  6. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    もう一度 [実行] ボタン。

  7. [統合] ハブを選択します。

    [統合] ハブが再度強調されています。

  8. [ラボ 08 - ビジネス アナリスト クエリを実行する] パイプライン (1) を選択します。これにより、asa.sql.workload02 クエリが実行またはトリガーされます。 [トリガーの追加] (2) を選択し、[今すぐトリガーする] (3) を選択します。 表示されるダイアログで、[OK] を選択します。

    [トリガーの追加] と [Trigger now] (今すぐトリガー) メニュー項目が強調されています。

  9. クエリ ウィンドウで、スクリプトを次のように置き換えて、トリガーされ、システムに投入されたすべての asa.sql.workload02 クエリに何が起こったかを確認します。

    SELECT s.login_name, r.[Status], r.Importance, submit_time,
    start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload02') and Importance
    is not NULL AND r.[status] in ('Running','Suspended')
    ORDER BY submit_time, status
    
  10. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツール バーの [実行] ボタンが選ばれています。

    次のような出力が表示され、各セッションの重要度が below_normal に設定されています。

    スクリプトの結果は、各セッションが通常の重要度未満で実行されたことを示しています。

    実行中のスクリプトが asa.sql.workload02 ユーザー asa.sql.workload02 によって below_normal (2) の重要度レベルで実行されていることに注意してください。 CEO のクエリよりも低い重要度で実行するようにビジネス アナリストのクエリを構成することに成功しました。 CEODreamDemo ワークロード分類子が期待どおりに動作することを確認することもできます。

  11. [監視] ハブを選択します。

    [監視] ハブ。

  12. [パイプラインの実行] (1) を選択し、[実行中] (3) とマークされている各 Lab 08 パイプラインの [再帰のキャンセル] (2) を選択します。 これにより、残りのタスクを高速化できます。

    [再帰のキャンセル] オプションが表示されています (スクリーンショット 2)。

  13. [開発] ハブの下にあるクエリ ウィンドウに戻ります。 クエリ ウィンドウで、スクリプトを次のように置き換えて、要求ごとに 3.25% の最小リソースを設定します。

    IF  EXISTS (SELECT * FROM sys.workload_management_workload_classifiers where group_name = 'CEODemo')
    BEGIN
        Drop Workload Classifier CEODreamDemo
        DROP WORKLOAD GROUP CEODemo
        --- Creates a workload group 'CEODemo'.
            Create  WORKLOAD GROUP CEODemo WITH  
        (MIN_PERCENTAGE_RESOURCE = 26 -- integer value
            ,REQUEST_MIN_RESOURCE_GRANT_PERCENT = 3.25 -- factor of 26 (guaranteed more than 4 concurrencies)
        ,CAP_PERCENTAGE_RESOURCE = 100
        )
        --- Creates a workload Classifier 'CEODreamDemo'.
        Create Workload Classifier CEODreamDemo with
        (Workload_Group ='CEODemo',MemberName='asa.sql.workload02',IMPORTANCE = BELOW_NORMAL);
    END
    

    注意

    ワークロードの包含の構成では、コンカレンシーの最大レベルが暗黙的に定義されます。 CAP_PERCENTAGE_RESOURCE を 60% に設定し、REQUEST_MIN_RESOURCE_GRANT_PERCENT を 1% に設定した場合、ワークロード グループではレベル 60 のコンカレンシーが保証されます。 最大コンカレンシーを決定するには、次に含まれるメソッドを検討してください: [Max Concurrency] = [CAP_PERCENTAGE_RESOURCE] / [REQUEST_MIN_RESOURCE_GRANT_PERCENT]

  14. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツール バーの [実行] ボタンが再度選ばれています。

  15. システムにもう一度投入し、asa.sql.workload02 に何が起こるかを見てみましょう。 これを行うには、クエリをトリガーする Azure Synapse パイプラインを実行します。 [Integrate] タブを選択します。[ラボ 08 - ビジネス アナリスト クエリを実行する] パイプラインを [実行] します。これにより、asa.sql.workload02 クエリが実行またはトリガーされます。

  16. クエリ ウィンドウで、スクリプトを次のように置き換えて、トリガーされ、システムに投入されたすべての asa.sql.workload02 クエリに何が起こったかを確認します。

    SELECT s.login_name, r.[Status], r.Importance, submit_time,
    start_time ,s.session_id FROM sys.dm_pdw_exec_sessions s
    JOIN sys.dm_pdw_exec_requests r ON s.session_id = r.session_id
    WHERE s.login_name IN ('asa.sql.workload02') and Importance
    is  not NULL AND r.[status] in ('Running','Suspended')
    ORDER BY submit_time, status
    
  17. ツールバー メニューから [実行] を選択して、SQL コマンドを実行します。

    クエリ ツール バーの [実行] ボタンが強調されています。

    しばらくすると (最大 1 分)、asa.sql.workload02 の重要度で実行されている asa.sql.workload02 ユーザーによる複数の同時実行が表示されます。 変更したワークロード グループとワークロード分類子が想定どおりに動作することを検証しました。

    スクリプトの結果は、各セッションが通常の重要度未満で実行されたことを示しています

  18. [監視] ハブを選択します。

    [監視] ハブが強調されています。

  19. [パイプラインの実行] (1) を選択し、[実行中] (3) とマークされている各 Lab 08 パイプラインの [再帰のキャンセル] (2) を選択します。 これにより、残りのタスクを高速化できます。

    [再帰のキャンセル] オプションが表示されています (スクリーンショット 3)。