この特集のトップページへ

9.6.1 「遅いクエリ」の識別

 一般的にアプリケーションには複数のトランザクション処理が含まれ,さらに各トランザクション処理には複数のクエリが含まれている。「遅いアプリケーション」や「遅いトランザクション処理」は比較的容易に判別することができるが,そのなかにある「遅いクエリ」を判別することはなかなか難しい。複雑なクエリになると数十から数百のSQLステートメントが含まれていることもあり,そのなかのどのSQLステートメントが問題となっているのかを判別することは,ツールを利用できなければ極めて困難である。

 このような場合に,SQL Server 7.0ではSQL Serverプロファイラおよびクエリアナライザを利用する。それ以外にも,「遅いクエリ」を明確化するために利用できるツールはある。たとえば,4032トレースフラグ,ODBCトレース,TechNet CD-ROMに収録されているSQL Eye Analysis Tool,トレース機能を備えたサードパーティ製のクライアントサイドツール*1などを利用してもよいだろう。また,ネットワークモニタまたはLANアナライザを使用することも可能である。

 「遅いクエリ」は,一般的に次のような手順で識別する。

  1. SQL Serverプロファイラを使用して,実行クエリの情報を収集する
  2. 遅いと思われるクエリを識別する
  3. 遅いと思われるクエリをテストする

SQL Serverプロファイラによるトレース情報の採集

 SQL Server 7.0で標準サポートされるSQL Serverプロファイラには,データベース上で発生しているアクティビティについての詳細な情報を記録するトレース機能が搭載されている。具体的には,次のような情報をトレースすることが可能である。

  • SQLオペレータの操作
  • Transact-SQLステートメント
  • RPC統計
  • エラーと警告
  • オブジェクトの操作
  • カーソルの操作
  • インデックスとテーブルスキャン
  • ストアドプロシージャの操作
  • DTCトランザクションとSQLトランザクション
  • ロック
  • セッションの接続と切断
  • ユーザー設定のイベント

 以上のようなイベントの記録は,拡張子“.trc”のファイルまたはSQL Serverのテーブルに格納される。SQL Serverプロファイラで記録したトレースを利用することで,ユーザーのアクセス方法,ユーザーのアクティビティ,オブジェクトがアクセスされた回数,ロック衝突とデッドロック,ほかのプロセスをブロックしているプロセス,性能上のボトルネック,などを調べることができる。


 SQL Serverプロファイラで採取したトレース情報は,あとからデータベースに対して再適用することもできる。具体的にいうと,トラブルシューティングに際して解決策を適用したあとで,問題が解決したか否かを判断するため,あるいは性能改善策の効果があったか否かを検証するため,再度同じ条件で結果を確認できるのである。
 クエリを分析して「遅いクエリ」を識別するためには,まずSQL Serverプロファイラを使用してトレースを採取する。

(1)SQL Server Enterprise ManagerからSQL Serverプロファイラを開始し,メニューから[ツール]−[SQL Serverプロファイラ]を選択する。あるいは,[スタート]メニューから[プログラム]−[SQL Server 7.0]−[SQL Serverプロファイラ]を選択してもよい。

(2)新たにSQL Serverプロファイラでトレースを取得するため,[Ctrl]+[N]キーを押す。あるいは,SQL Serverプロファイラのメニューから[ファイル]−[新規作成]−[トレース]を選択する。

(3)[トレースのプロパティ]ダイアログボックスが表示されるので,[全般]パネルが開かれていることを確認して[トレース名]を入力し,トレースの対象となるSQL Serverが動作しているコンピュータ名を選択する。

 トレースを作成した本人以外の人間がこのトレース情報を使用する場合には,[トレースの種類]で[共有]を選択する。たとえば,購入先やサポートサービスプロバイダにトレース情報を提供するような場合に[共有]を選択しておく。

Fig.9-17 トレースのプロパティ(全般)


(4)イベントを記録するファイルまたはテーブルを選択する。SQLステートメントで情報を照会する場合は,テーブルに格納するほうがよいので,[テーブルにキャプチャ]を選択して格納先となるテーブルを指定する。なお,[ファイルにキャプチャ]や[テーブルにキャプチャ]を選択しなかった場合,トレースは画面上にのみ表示される。

(5)[イベント]パネルを開き,トレースの対象となるイベントを選択する。デフォルトでは,Transact-SQLステートメントの一部とセッションの接続または切断がすでに選択されている。遅いSQLステートメントを探す場合は,[SQLオペレータ]イベントおよび[TSQL]イベントを選択する。[SQLオペレータ]イベントを選択すると,データベースに対するすべてのINSERTステートメント,UPDATEステートメント,SELECTステートメント,DELETEステートメントをトレースすることができる。[TSQL]イベントを選択すると,SQLステートメントの開始と完了,バッチの開始と完了,RPCの開始と完了というイベントをトレースすることができる。

Fig.9-18 トレースのプロパティ(イベント)


(6)[トレースのプロパティ]ダイアログボックスで[データ列]パネルを開き,トレース対象となる各イベントのデータ列を選択する。
 実行時間の長いクエリを抽出する場合には,[期間],[CPU],[読み取り数],[書き込み数]を選択する。通常はそのほかに,[イベントクラス],[サーバー名],[データベースID],[オブジェクトID],[接続ID],[アプリケーション名],[開始時刻]を選択する。
[サーバー名]と[データベースID]を選択すると,[オブジェクトID]の代わりに[オブジェクト名]が表示される。同様に,[サーバー名],[データベースID],[オブジェクトID]を選択すると,[インデックスID]の代わりに[インデックス名]が表示される。

 トレースを採取したあと,トレースの分析を容易にするため,データ列をグループ化する。その際,グループ化を指定する順序に若干の注意が必要になる。たとえば,サーバー間やデータベース間で一意の識別子が割り当てられていないオブジェクトIDやインデックスIDなどをグループ化する場合は,次の順序で処理する。[オブジェクトID]でグループ化する場合には,まず[サーバー名]と[データベースID]でグループ化し,そのあと[オブジェクトID]でグループ化する。同様に,[インデックスID]でグループ化する場合には,[サーバー名],[データベースID],[オブジェクトID]でグループ化してから,[インデックスID]でグループ化する。

Fig.9-19 トレースのプロパティ(データ列)


(7)[トレースのプロパティ]ダイアログボックスで[フィルタ]パネルを開き,トレース対象となるイベントを決定する条件を指定する。
 [期間]および[CPU]には,トレースを開始してからの経過時間とCPUの使用時間を[最小]および[最大]として範囲指定する。この範囲外を示す時間であれば,トレースの対象とはならない。たとえば,設計時の予測時間の数倍から10倍大きな値を[最小]に設定する。

 [読み取り数]および[書き込み数]には,トレースするI/O回数の範囲を指定できる。しかし,I/O回数は条件として明確に予測できない場合が多いと思われるので,空白のままでかまわない。

Fig.9-20 トレースのプロパティ(フィルタ)


(8)各パネルの設定が完了したら,[OK]ボタンを押してトレースを開始する。


  1. トレース機能を備えたサードパーティ製のクライアントサイドツールとしては,Blue Langoon Software社の「SQL Inspector」やDatabase Architechs社の「SQL Scope 2.5 Performance & Tuning Tools」(http://www.dbarchitechs.com/dbtools.htm)などがある。
前へ Chapter 9 10/46 次へ