3
6

More than 3 years have passed since last update.

SQLserverで処理が遅いSQLの特定と改善

Last updated at Posted at 2021-02-19

対応概要

 画面から実行するとある検索処理が時間を要するため処理速度の改善対応を実施した。
 今回は、SQLserverでの改善方法を備忘メモとして記載。
 実施内容は2点。
 
1. 原因となっているSQLの特定
2. 原因となっているSQLに対応するINDEXの作成

 ⇒INDEXの張りすぎも良くないらしいので、対応については慎重に確認した方が良さそう。

対応詳細

原因となっているSQL文を調査する

  1. SQL Server Managment Studioのメニューバー>ツール>SQL server プロファイラーを選択
  2. トレースのプロパティで下記を設定する
      ・TSQLの「SQL:SmtCmpleted」をチェック
      ・Stored Proceduresの「SP:SmtCmpleted」をチェック
    image.png
  3. 実際に問題になっている処理を実行する →問題の検索処理等、SQLが絡んでいる処理。
  4. SQLserverプロファイラーを確認する。  ※実行前に一度クリアすると良いかも…。
     ※実行後は、一時停止ボタンを押下すると良いかも。
     「Reads」や「Duration」がやたらと数値が高い行を確認する。
      ウィンドウの下画面に赤字で問題となっているSQL文が表示される。
    image.png
取得できるSQLのサンプル※1
'SELECT 項目A,項目B,項目C FROM サンプルテーブル 
 WHERE ((項目カナ LIKE @P1) AND (項目コード LIKE @P2) AND (項目区分 = @P3) AND (項目属性 = @P4)) 
ORDER BY 項目A ASC,項目B ASC,項目コード ASC ',@p5 output,@p6 output,@p7 output,'%%','%','00001','0'

問題になったSQLのINDEXについて確認・作成

  1. SQL Server Managment Studioのメニューバー>クエリ>実際の実行プランを含めるを押下。
  2. SQLプロファイラーで取得したSQLを実際に実行。
     取得したSQLがパラメータがある場合は適宜置換をする事。(@P1等)
取得できるSQLのサンプル※1のSQL整形後
SELECT 項目A,項目B,項目C FROM サンプルテーブル 
 WHERE ((項目カナ LIKE '%%') AND (項目コード LIKE '%') AND (項目区分 = '00001') AND (項目属性 = '0')) 
ORDER BY 項目A ASC,項目B ASC,項目コード ASC

image.png
3. 実行プランタブ内で、右クリックして「不足しているインデックスの詳細」をクリック

4. 表示されたインデックス作成SQLを実行する。

  ※「<Name of Missing Index, sysname,>」は任意の名前に変更する。

image.png

結果

INDEXを貼ったら検索処理が早くなりました。
最初に記載しましたが、Index貼りすぎもNGらしいので
良く確認しながら作業した方がよさそうです。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6