連載
» 2018年06月22日 05時00分 公開

SQL Serverトラブルシューティング(71):RESOURCE_SEMAPHORE_QUERY_COMPILE待ちが発生する(処理遅延) (1/2)

本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブルについて、「なぜ起こったか」の理由とともに具体的な対処方法を紹介していきます。今回は「RESOURCE_SEMAPHORE_QUERY_COMPILE待ちが発生する」場合の解決方法を解説します。

[椎名武史,@IT]

SQL Serverトラブルシューティング一覧

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブルについて、「なぜ起こったか」の理由とともに具体的な対処方法を紹介していきます。

トラブル 60(カテゴリー:処理遅延):RESOURCE_SEMAPHORE_QUERY_COMPILE待ちが発生する

 「Windows Server 2012 R2」上に「SQL Server 2016 RTM」をインストールした環境を想定して解説します(本トラブルシューティングの対応バージョン:SQL Server 全バージョン)。

トラブルの実例:処理を大量に実行したところ、幾つかの処理しか実行されておらず、残りの処理は止まっているように見えた。SELECTの処理しか実行していないため、ロック待ちが発生しているとは考えにくい。dm_exec_requestsで状況を確認してみると、statusはsuspendedになっており、wait_typeはRESOURCE_SEMAPHORE_QUERY_COMPILEと表示されていた(図1)。

図1 図1 RESOURCE_SEMAPHORE_QUERY_COMPILEという待ちが発生

トラブルの原因を探る

 wait_typeがRESOURCE_SEMAPHORE_QUERY_COMPILEとあることから、クエリのコンパイルに関連する待ちであると推測できます。SQL Server内のメモリの使い方を確認できるDBCC MEMORYSTATUSやSQL Server 2016から実装されたdm_exec_query_optimizer_memory_gatewaysというDMV(Dynamic Management View)を使用してゲートウェイの様子を確認してみます(図2、図3)。

図2 図2 Waitersの値が0ではない
図3 図3 waiter_countの値が0でない

 これらの結果から確認できるように、ゲートウェイ(Gateway)と呼ばれる場所で待ちが発生しているようです。

 SQL Serverは一度にコンパイルできる数を、コンパイルに必要なメモリ量に応じて制御しています。ほとんどコンパイルにメモリを使用しないクエリは幾つでも実行可能です。しかし、ある程度メモリを使用するクエリは、使用メモリ量に応じてSmall Gateway、Medium Gateway、Big Gatewayを通過する必要があります。

 ゲートウェイを通過できる数が決まっているため、コンパイルに多くのメモリが必要なクエリを一度に実行すると、RESOURCE_SEMAPHORE_QUERY_COMPILEの待ちになります。



       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。