LoginSignup
0
1

More than 3 years have passed since last update.

【SQLServer】インデックスを使用して処理改善をする

Last updated at Posted at 2019-08-03

とにかく処理が重い

うちの会社が客先へいれているシステムの処理が遅すぎて
どうあがいてもタイムアウトになり、10分以上経っても応答なし。

原因

もともとサーバーのスペックが低く、ネットワーク環境もよろしくない。
しかし、特にネットワークが原因ではなかった。
自社から客先で稼働しているものを実行してみると同じ状況になり、
タイムアウトとなって何も出来ない・・・・
理由としては、SQLで、ビューを使用しており、テーブルは10個以上見ている。
上司にはデータベース構造が悪いんじゃない?と根本的なことを言われたが、
すぐにどうこうできる問題ではない。

対処法

SQLの実行計画を見る

上司に相談してSQLの実行計画を見てみなよと言われた。
前にも見たことはある気がするがほぼなんじゃそりゃ状態・・・
とりあえず教えてもらいながら見てみた。

見てみると、INDEX SCANとなっており、コスト33%。
SEEKになれば大分変わると言われたが、じゃあ何をすれば良いのか状態。

インデックスをはる

上述の実行計画を見てみると、主キー以外の項目Aが条件となり、
データを探している。
とりあえず、項目Aを追加して非クラスタインデックスを新規作成。
そして、再度実行計画を見てもINDEX SCANのままで変わらない。

ヒント句を使う

hinto.sql
SELECT *
FROM   テーブル名
WITH (INDEX(インデックス名))

参考:https://www.projectgroup.info/tips/SQLServer/SQL/SQL000020.html
ヒント句を使用することで強制的に先ほど作ったインデックスを参照するようになり、
INDEX SEEKへと変わった。

再度SQLを実行する

実行時間が10分以上かかっていてタイムアウトになっていたところが
1分半となりました。それでも遅いですが・・。

さいごに

SQLを速くする方法・・なんて考えたことが今回の問題を通して感じた。
システムを作ってもレスポンスが遅ければ、
もしかすると手で書くほうが早い場合もあるだろう。
ITを使えばオールオッケーではなく、業務もシステム内部も効率良く出来なければ
システム化する意味はない・・・

0
1
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
0
1