「遅いクエリ」のテスト
「遅いクエリ」を特定できたら,今度はクエリアナライザやローカルパイプを利用して,サーバー上でそのクエリを実行して出力をファイルにリダイレクトする。このような方法を利用することにより,ネットワーク,画面I/O,アプリケーションのバッファといった複雑な要因を排除してテストを実施することができる。サーバー上でクエリを実行しても遅ければ,そのクエリ自体に原因があるといってよい。
クエリアナライザのメニューから[クエリ]−[現在の接続オプション]を選択したときに表示される[現在の接続オプション]ダイアログボックスの[全般]パネルには,[時間経過を表示]オプションと[I/O統計情報を表示]オプションが用意されている。これらのオプションを指定してトレース情報を取得することにより,実行されたクエリのリソース使用状況を知ることができる。それによって,プロセッサのリソースを多量に消費するのか,ディスクI/O回数が多いのか判断することができる。また,クエリのチューニング効果を観察するときにも,これらのオプションは活用できる。
Fig.9-25 クエリアナライザのオプション設定

[時間経過を表示]オプションと[I/O統計情報を表示]オプションを選択した状態でクエリを実行すると,次のような結果が表示される。
SQL Server 実行時間 :CPU 時間 = 1ミリ秒,経過時間 = 4352749ミリ秒。
テーブル 'authors'。 スキャン回数 1,論理読み取り数 1,物理読み取り数 1,先行読み取り数 0。
クエリのリソース使用状況は,SET STATISTICS IO ONステートメントを使用しても調べることができる。具体的には,次のようにすればよい。
Fig.9-26 SET STATISTICS IO ONステートメントによる出力

同様に,SET STATISTICS TIME ONステートメントを使用すると,クエリの実行時間,SQL Serverが構文解析やコンパイルに要した時間を表示することができる。
Fig.9-27 SET STATISTICS TIME ONステートメントによる出力
クエリをテストする場合,テーブルにトリガが設定されていれば,トリガを外して実行する。また,クエリにストアドプロシージャやビューが含まれている場合は,ストアドプロシージャやビューを切り離して別々に実行する。それによって,トリガやストアドプロシージャに原因があるのか,クエリ自体に問題があるのか,問題を切り分けることができる。
「遅いクエリ」が使用しているテーブルのインデックスを調べて,インデックスがクエリに指定されていなければ,WHERE句またはFROM句の各列にインデックスを指定してみるのもよいだろう。また,WHERE句またはFROM句で指定されている各列のデータの一意性と分布を調べる。最新の統計情報が使用されているか否かを調べる。SQL Serverクエリアナライザの「インデックスの分析」機能を利用してもよい。
| Chapter 9 12/46 |
