web-dev-qa-db-ja.com

最小並列度を実装するための回避策

間違えた場合は訂正してください。ただし、クエリの実行がスケジュールされている場合、エンジンは使用可能な空きスレッドの数を考慮し、それに応じてクエリプランを調整します。

たとえば、マシンの負荷が高く、1つのスレッドだけが空いている場合、通常はアンロードされたマシンで複数のスレッドを使用して実行されるクエリは、シングルスレッドとして実行できます。

使用可能な空きスレッドの数を動的にクエリして、特定の重要なクエリ(MaxDop <Xとして受け入れられないほど実行される)を、最小の空きスレッド数が使用可能になるまで実行を遅らせる(while/waitfor)方法はありますか?

更新:キンの答えに基づく出発点:

これは単純な負荷テストに従っているようですが、何らかの理由ですべてのアイドル状態を返すことはありません。私はこのテーブルについて何も知りません。

select count(*) as Cpus, 
       sum(IsIdle) + 1 as IdleCpus  -- +1 since current query should be excluded
  from 
     (
        select Cpu_id, 
               min(convert(int, is_idle)) IsIdle
          from sys.dm_os_schedulers
          group by Cpu_id
     ) q
   ;
1
crokusek

Resource Governor Resource Pool を使用します。特定のクエリの並列処理の程度を直接指定するのではなく、接続の最小および最大のCPUリソースの可用性を設定できます。

そう

マシンの負荷が高く、1つのスレッドだけが空いている場合、通常はアンロードされたマシンで複数のスレッドを使用して実行されるクエリは、シングルスレッドとして実行される可能性があります。

並列クエリを実行しているセッションをMIN_CPU_PERCENTが設定されたリソースプールに割り当てることにより、プランを実行するためにスケジューラを使用できるようにすることができます。

最小並列度のような概念はありません。

SQL Serverには、最大並列度(max DOP)と並列処理のコストしきい値があります。これらの2つの設定は、クエリの実行に使用するスレッドの数に基づいてSQLサーバーのコストベースのオプティマイザーによって使用されます。

マシンの負荷が高く、1つのスレッドだけが空いている場合、通常はアンロードされたマシンで複数のスレッドを使用して実行されるクエリは、シングルスレッドとして実行される可能性があります。

マシンの負荷が高い場合、または暴走したクエリがサーバーを独占している場合は、 スレッドの枯渇 に遭遇し、使用可能なワーカースレッドを使い果たします。 max dop設定を適切な値に 調整して、テストする必要があります。

利用可能な空きスレッドの数を動的にクエリして、特定の重要なクエリ(MaxDop <Xとして受け入れられないほど実行される)が最小の空きスレッド数が利用可能になるまで実行を遅らせる(while/waitfor)方法はありますか?

以下 query は、追加のスレッドを生成したシステムタスクに関する情報を提供するのに役立ちます

SELECT  s.session_id, r.command, r.status,  
r.wait_type, r.scheduler_id, w.worker_address,  
w.is_preemptive, w.state, t.task_state,  
t.session_id, t.exec_context_id, t.request_id  
FROM sys.dm_exec_sessions AS s  
INNER JOIN sys.dm_exec_requests AS r  
ON s.session_id = r.session_id  
INNER JOIN sys.dm_os_tasks AS t  
ON r.task_address = t.task_address  
INNER JOIN sys.dm_os_workers AS w  
ON t.worker_address = w.worker_address  
WHERE s.is_user_process = 0;

または、sys.dm_os_waiting_tasksTHREADPOOL 関連の待機を確認することもできます。また、sys.dm_os_schedulerは、各スケジューラーのcurrent_workers_countを通知します。

複雑なロジックを組み込んで現在のワーカー数を確認してから、waitfor delay xを作成できます。ここで、xは必要な遅延です。私の意見では、物事を不必要に複雑にするのはやり過ぎでしょう。

最良の方法は、maxdopを調整し、並列処理のしきい値をコストで調整するとともに、統計が最新であることを確認し、インスタンスの待機統計を収集することです。つまり、サーバーのベースラインを設定し、異常を見つけたかどうかを確認してから、チューニングの演習を開始します。

2
Kin Shah