PR

SQLの実行を「見える化」する

2010年10月4日(月)
藤井 等

SQLパフォーマンス問題を「見える化」するツールを使ってみる

今回利用するのは、Embarcadero DB Optimizer(以下、DB Optimizer)というSQLパフォーマンスチューニングツールです。

DB Optimizerは、Oracle、MS SQL Server、Sybase、DB2に対応したツールです。これひとつで、それぞれのデータベースにおけるSQLの実行状況を詳細に表示し、チューニング作業を支援してくれます。

DB Optimizerで、「見える化」をサポートするのは、SQLプロファイラと呼ばれるツールです。SQLプロファイラは、データベースを継続的に監視して、そのパフォーマンスに関する統計情報をグラフィカルに表示します。

SQLの実行にかかった時間のうち、CPU、I/O、待機などにかかった時間の詳細を時系列で見ることができるので、問題のあるSQL文やボトルネック箇所を特定できます。

SQLプロファイラを使ってプロファイリングを始めると、ロードグラフと呼ばれるグラフ領域に、色分けされた棒グラフで、実際のSQLの実行にどのような時間を消費したのかがリアルタイムで表示されていきます。このプロファイリングデータは、保存して後で再生することもできるので、疑わしい箇所を後で解析したり、運用環境のプロファイリングデータを記録して、後で別の環境でゆっくり調査するなどといった使い方も可能です。

待ち時間解析では、主にディスクI/OなどのI/O待ち時間、ロックなどに起因する待機などの時間をチェックします。これらの時間を最小化し、いかに効率よくSQLを実行するかが、チューニングのポイントになります。

図2:SQLプロファイラでSQLの実行状況をモニター(クリックで拡大)

セッションデータの詳細を見る

ロードグラフで全体の実行状況を把握したら、次にトップアクティビティセクションと呼ばれる詳細情報にドリルダウンしていきます。ここでは、負荷の原因となる箇所について、より詳しい統計情報を見ることができます。

詳しい統計情報を見ると、具体的にどのSQL文がパフォーマンス上問題になるのか、また、ほかの待機イベントによって実行速度の低下を招いているかなどが分かります。これらの情報を調べていくことで、パフォーマンス改善の方針を立てていくことができます。

このように、DB Optimizerによるプロファイリング作業は、地道でありながら直感的です。通常、膨大なログを調べて問題箇所を特定するような作業が、ビジュアル化されたパフォーマンス情報を見てすぐに行うことができ、また、感覚やカンなどを頼りにせず、網羅的に調査することができます。

実は、この能力は開発の早い段階からSQLパフォーマンス問題の芽を摘むのに大変重要です。

体感できるほどの速度低下は、負荷テストや実際の運用段階のトラブルで発見できますが、そうではない潜在的なボトルネックは、コードの中に潜んだままです。

これらを未然に摘み取っておくには、体感できない違いを見分け、その問題を特定できる嗅覚が必要です。これまで、こうした作業は、経験やカンが頼りでした。「こういった箇所が問題になるんだ」とか「SQLのべからず集」などのノウハウは、どこの開発チームにもあるでしょう。でも、それによってすべての問題をカバーできるほど、現在のシステムはシンプルではありません。また、そうした熟練技術者に依存しすぎる人頼みの品質管理は、開発プロジェクトとして適切ではありません。

DB Optimizerのようなツールを使ってパフォーマンス管理を行うことの重要性は、単に特定のシステムの品質を向上させるだけでなく、チーム全体の品質向上、すなわち底上げの効果にあるのです。

さて、SQLプロファイラで問題のあるSQLを特定したら、次に行うのはチューニングです。

エンバカデロ・テクノロジーズ 日本法人代表
千葉大学文学部行動科学科卒業。石油関連会社でGISなどの開発を経験したのち、1995年、ボーランドに入社。マーケティングとしてJava開発ツールJBuilderやVisiBrokerなどミドルウエア製品の立ち上げを行う。2008年7月、ボーランドの開発ツール部門を合併したエンバカデロ・テクノロジーズに移籍。2009年1月より日本法人代表を務める。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています