とにかく処理が重い
うちの会社が客先へいれているシステムの処理が遅すぎて
どうあがいてもタイムアウトになり、10分以上経っても応答なし。
原因
もともとサーバーのスペックが低く、ネットワーク環境もよろしくない。
しかし、特にネットワークが原因ではなかった。
自社から客先で稼働しているものを実行してみると同じ状況になり、
タイムアウトとなって何も出来ない・・・・
理由としては、SQLで、ビューを使用しており、テーブルは10個以上見ている。
上司にはデータベース構造が悪いんじゃない?と根本的なことを言われたが、
すぐにどうこうできる問題ではない。
対処法
SQLの実行計画を見る
上司に相談してSQLの実行計画を見てみなよと言われた。
前にも見たことはある気がするがほぼなんじゃそりゃ状態・・・
とりあえず教えてもらいながら見てみた。
見てみると、INDEX SCANとなっており、コスト33%。
SEEKになれば大分変わると言われたが、じゃあ何をすれば良いのか状態。
インデックスをはる
上述の実行計画を見てみると、主キー以外の項目Aが条件となり、
データを探している。
とりあえず、項目Aを追加して非クラスタインデックスを新規作成。
そして、再度実行計画を見てもINDEX SCANのままで変わらない。
ヒント句を使う
SELECT *
FROM テーブル名
WITH (INDEX(インデックス名))
参考:https://www.projectgroup.info/tips/SQLServer/SQL/SQL000020.html
ヒント句を使用することで強制的に先ほど作ったインデックスを参照するようになり、
INDEX SEEKへと変わった。
再度SQLを実行する
実行時間が10分以上かかっていてタイムアウトになっていたところが
1分半となりました。それでも遅いですが・・。
さいごに
SQLを速くする方法・・なんて考えたことが今回の問題を通して感じた。
システムを作ってもレスポンスが遅ければ、
もしかすると手で書くほうが早い場合もあるだろう。
ITを使えばオールオッケーではなく、業務もシステム内部も効率良く出来なければ
システム化する意味はない・・・