今回はVer.16です。
今回はSAP SQL Anywhere Ver.16のパフォーマンス分析ツール「アプリケーションプロファイリング」の解説です。
このバージョンはメインストリームサポートは終了したバージョンですが、まだまだ御利用いただいているお客様が多いため解説させていただきます。
それぞれのバージョン用の解説が単独のブログ投稿として成り立つような内容にしておりますので他バージョンと説明が似ている点は御了承ください。
こちらも長くなってしまいましたので前後編の2つで解説となります。こちらは前編です。後編は
こちらです。
アプリケーションプロファイリング
アプリケーションプロファイリングはデータベースで発生するアクティビティを記録するツールです。このツールは開発及び診断ツールで、パフォーマンスの問題に関する情報を分析できるようになっています。このツールはパフォーマンスだけではなく「デッドロックおよびロック待ちによる動作のブロックの検出」にも使用することが可能です。
個人的にはこのツールは本番開始後の問題発生時だけではなく、開発の後半段階、製品テスト段階でも使用したほうが良いと考えます。手動でテストしているのであれば手間になるかもしれませんが通常のテストを行った他にこのツールを使用しながらテストすることでデータベース的な問題をより探る事ができます。
このツールの残念な点
このツールは「Sybase Centralの機能」として提供されています。そのためアプリケーション開発者がアプリケーション内でスイッチやボタンでプロファイリングを実行できるように仕掛けておくということが出来ません。(要求ロギングではそれが可能です。)そしてエンドユーザー様に代わりに行っていただくのは少々難しいです。やはりオンサイトでのサポート時や開発時に使用すると考えたほうが良いでしょう。
そして、このツールは接続にTCP/IP接続が必要となります。つまりは
パーソナルエンジン(dbeng16)では使用することが出来ません。プロファイリング対象のデータベースはネットワークエンジン(dbsrv16)を使用し、ネットワーク接続を有効にする必要があります。以前の説明のとおり、SQL Anywhereのパーソナルエンジンとネットワークエンジンはデータベース機能的には差がないのでパーソナルエンジン前提で作成されたアプリケーションはネットワークエンジンで動作させたデータベースに対しても動作しますが、パーソナルエンジンとネットワークエンジンでディフォルト値が異なるパラメータが存在しますので確認し、ネットワークエンジンをリソース的にパーソナルエンジンに近づける形で動作させることが必要です。
また、Ver.17のSQL Anywhereプロファイラとの違いともなりますが、実質的にアプリケーションプロファイリングはプロファイリングした内容を別のSQL Anywhereデータベースファイルに記述します。つまりプロファイリング最中は2つのデータベースが動作していることになります。軽量とはいえパフォーマンスロスはSQL Anywhereプロファイラより大きいといえます。(そのためにVer.17での改善としてSQL Anywhereプロファイラが登場しました。)
そしてもう一つ、このツールはプロファイリングを行った「後」分析は出来ますが、「行いながら」の分析は出来ません。リアルタイムではないのです。(これもSQL Anywhereプロファイラがでの改善点となります。)
プロファイリングの開始と完了
このツールはSybase Centralから起動します。いくつか起動方法はありますが、スタンダードと思われる方法をご紹介します。まず、
ネットワークエンジンで起動したデータベースに対してSybase Centralから接続します。このときはネットワーク接続で接続するようにしてください。また、この際はDBAユーザーで接続するようにしてください。

同一マシン上であっても上記のように「別のコンピュータで稼働しているデータベースに接続」でホストとポートを指定して接続するほうが安全です。
そうそう、もし、問題がデッドロックが絡むという場合、
左ペインでデータベースを選択肢、右ペインでデッドロックのタブを選択し、「設定」ボタンをクリック

データベースのプロパティ画面で「設定」タブの下部、「このデータベースで発生したデッドロックの情報を収集する」「デッドロックが発生した接続のSQL文情報を含める」にチェックを入れてください。(「適用」→「OK」をクリック)
こうしておかないと、デッドロックが発生したことは記録されますが、発生した原因のSQL情報が含まれません。
そして

上部のメニューから「モード」→「アプリケーションプロファイリング」の順にクリックします。

アプリケーションプロファイリングウィザードが起動します。「次へ」をクリックします。

プロファイリング対象を選択します。プロファイリングしたい対象にチェックを入れることになります。問題原因を絞れていない場合は「実行時間が1秒未満のクエリを無視」
以外全てチェックを入れてください。
「実行時間が1秒未満のクエリを無視」という部分ですが、もし、問題が単一のSQL文の速度でなく複数のSQL文の合計実行時間ということであった場合、ここにチェックを入れた場合その問題原因はプロファイリングに含まれない可能性が出てきます。しかし、チェックを入れるとあらゆるSQLがプロファイリング対象になりますのでパフォーマンス劣化度合いが大きくなります。やはり、ある程度目星をつけるということが重要です。
今回は上記のようにチェックをいれ、「次へ」をクリックします。
プロファイリングデータの保存先を選択します。この保存先でベストなのはデータベースが関わらない別のドライブです。このファイルに書き込むことになりますので本来のデータベースが使用するディスクとIOが重なるとあまり良くないと言えます。できるだけIOが重ならないドライブにファイルを指定してください。
「次のサイズに制限する」をチェックするとプロファイリングデータの保存の最大サイズを指定することが出来ます。正直なところこの設定は使わず、短期間でプロファイリングを行う(そこまで目星を付けてからプロファイリングする)のがポイントとなります
「次へ」をクリックします。

このような進行を示すダイアログが表示されますので少々待ってください。
(トレーシング用のファイル=データベースとその中身のテーブルを作成しています。)

この画面になったら
「このまま」アプリケーションで問題の処理を実行します。「完了」をクリックすることはプロファイリング終了を意味しますので注意です。
問題の処理が終了したら「完了」をクリックしてプロファイリングを終了します。
プロファイリングデータの分析
(ステータスタブはこのプロファイリングデータのステータス・情報を表示するタブなので割愛します)
おそらくは「推奨」タブが最初に表示されるかと思います。

ここはプロファイリング内容からの推奨処置が表示されます。サブジェクトに表示された内容をダブルクリックするとその詳細が表示されます。

データベースファイルに断片化が発生しているということです。OS付属のデフラグツールを使用して解決が基本となります。また、これからもデータベースサイズの増大が予期されるのであればALTER DBSPACE文でデータベースファイル自体を拡大してしまっても良いでしょう。(その後デフラグをします。)

デッドロックが検出された場合も報告されます。プロファイリングの開始時にちょっと解説を入れましたが、もしデッドロックに関する情報を収集するようにしておかないとこれ以上の情報が無いことになります。実際のデッドロック情報は専用のデッドロックのタブで表示されます。

このようななかなかマニアックなことも指摘してくれます。(笑)
上記に関しては、正直なところ、カラム順を変更したことによる効果を発揮するのはカラム数、行数共に相当大きなテーブルになると思われますが、このようなことも覚えておくと良いと思います。
最近はあまり見なくなりましたが、"SELECT * FROM TABLE"、"INSERT INTO TABLE VALUES(....)"のようにカラム名を書かないSQLを使用していなければアプリケーション側ではDB側のテーブルのカラムの並びや後からの追加は影響を受けません。
推奨タブはいわば「プロファイリング内容から重要な点をまとめて指摘」ですのでまずはここを見てデータベース全体の問題を把握するようにしてください。
「データベーストレーシングデータ」タブはSQLレベルのトレース結果を表示するタブです。
このタブ内には更に3つのタブがあります。

「概要」タブではSQLの呼び出し回数、合計時間、最大時間を表示します。最大時間でソートして(カラム名のところをクリックすると昇順・降順ソートが可能です)最大時間が長いものをチェックするという使い方が基本かと思います。フィルタリングは結果をフィルタするものです。例えばSELECT文しか見ないなどの時は「SELECT」と入力して「適用」をクリックすると表示される結果がSELECTという文字列でフィルタリングされます。

「詳細」タブは「概要」タブの表示内容が集約される前の状態で表示されます。時系列で並べて表示ができることになりますので処理の前後関係を追うことが出来ます。

「接続」のブロックタブは、正しくは「接続」ではなく、SQLの実行がブロックされたものの情報が表示されます。ロック待ちが発生したリストと考えると良いでしょう。(デッドロックの情報はこのひとつ上のタブに専用のものがあります。後半で解説します。)
ひとつ上のタブに戻り、次は「統計情報」タブです。

このタブは最初は何も表示されていません。まず、どんなことができるかというとプロファイリングで収集したデータベースシステム的な情報を時系列のグラフで表示させることが出来ます。例えば、キャッシュ読み込み量の変動を見たい場合、まず、「統計の追加」ボタンをクリックし

表示されたダイアログから表示したいものを選択して「OK」をクリックします。
「次のタイプの統計をリスト」は何に対しての統計か?を意味します。基本的には「データベース」を選択すればよいかと思います。

時系列でグラフがプロットされます。(「統計の追加」を繰り返すことで複数個同時表示も可能です。)
使い方、及び基本的に見たほうが良いものとしては「Active Req.(サーバ)」「Cache Read(データベース)」「Disk Read(データベース)」「Disk Write(データベース)」ではないでしょうか?*カッコ内は「次のタイプの統計をリストで選択するものです。
もちろんそれ以外でも見たほうが良いものはありますが、例えば上記を表示し、急激に上がっている部分を見つけ「時間」から「データベーストレーシングデータ」タブの「詳細」タブでSQLを特定し・・・・という使い方、あるいは逆に「データベーストレーシングデータ」タブで問題のSQLの実行時間帯の状況を見るという使い方があります。
「デッドロック」タブはデッドロックの情報を表示します。

これは開始時に説明した「このデータベースで発生したデッドロックの情報を収集する」「デッドロックが発生した接続のSQL文情報を含める」にチェックを入れておかないと表示されません。チェックを入れることで一目瞭然のデッドロックの相関関係を確認することが出来ます。
このようにアプリケーションプロファイリングは分析に使用することが出来ます。
長くなってしまいましたのでここまでを前編とし、後編にて分析ファイルを開く方法とインデックスコンサルタントについて解説します。 後編は
こちらです。