1.はじめに
よくある話なのですが、パッケージ製品をお客様環境に導入したあと動作の確認を行うと、思うような動作をしていない、動作が遅いなどの事象が発生することが多々あります。その時、パッケージ製品側にデバッグログやトレースログの取得などの機能が用意されている場合、解決に向けて大いに役立つものなので、使わない手はありません。しかしながら、取得したログから原因の究明ができない場合やそもそも詳細なログを取得する機能を用意していない場合もあります。
私自身も過去に上記の様な状況に直面し、解決に向けて打てる手はあるのか、色々なアイデアを捻出したことがあります。そういった中である程度調査などを進めていた結果、データベースサーバ周りに原因があるのではないか、という状況になることがあります。その時に私自身が行ったことを参考までに記載いたします。ここでは、Microsoft SQL ServerをDatabase Management System(以下DBMS)としている場合を記載します。
2.実行されるSQLの確認
「実行されているSQLがおかしい?」
「無駄なSQLが実行されている?」
「どのようなSQLが実行されている?」
「どのテーブルにアクセスしている?」
上記の様な不明点を解決する方法として、当然ながら製品の開発元に問い合わせることがベストの選択だと思います。しかし、それができない状況の場合に不明点を解決する方法を考えたときにたどり着いたのは、SQL Serverには「SQL Server Profiler」というツールが用意されているということです。SQL Server Profilerの使用方法については、公式の情報を参照下さい。
SQL Server Profilerでトレースを取得すると下記のような情報が取得できます。発生したイベント毎にレコードが生成され、一覧に表示されます。
[TextData]の項目が実際に実行されているSQLです。リストを選択すると下部に表示されます。
[Duration]がそのSQLの実行にかかった時間(ms)を表しています。
上記の2つの項目のデータを確認することで、不明点の解決のヒントが得られます。
3.実行に時間のかかるSQLの確認
実行に時間のかかるSQLを簡単に確認する方法としては、SQL Server Management Studioの標準機能である「利用状況モニター」があります。利用状況モニターを表示すると、現在のデータベースの利用状況について、いろいろな情報が確認できます。その中の[最近コストの高いクエリ]という項目に表示されているクエリが、実行に時間がかかっているSQL一覧です。
その一覧の中から問題と関係しそうなSQLを見つけ出すことができます。そこから、さらに時間がかかっている原因を確認します。
4.SQLの最適化の入り口
実行に時間のかかっているSQLが分かった場合、当然時間のかかる原因を追究する必要があります。判明しているSQLをSQL Server Management Studioのクエリ機能で推定実行プランを、利用状況モニターで直接実行プランを確認します。
クエリを選択し、右クリックメニューから[実行プランの表示]をクリックします。
上図のようにグラフィカルにSQLの実行にかかるコストを見ることができます。実行プランで、どの部分でコストがかかっているかを確認し、コストを減らしていきます。コストを減らす方法としては、
①統計情報を更新する
②インデックスのサンプル再構成、再構築を定期的に実行する
③不足しているインデックスを作成する
④複数のテーブルの結合の順番を変える
⑤関数の使用の見直し
などがありますが、より高度な内容となります。別の機会に私自身のアプローチを記載したいと思います。今回は調査の入り口について記載しました。
執筆者プロフィール
- いつも足元ばかり見ている、未来を考えるのが苦手なエンジニアです。