Share via


ODBC ドライバのパフォーマンスのプロファイル

SQL Server Native Client ODBC ドライバは、次の 2 種類のパフォーマンス データをプロファイルできます。

  • 実行時間の長いクエリ。

    ドライバは、指定した時間内にサーバーから応答が得られないクエリをログ ファイルに書き込むことができます。アプリケーション プログラマやデータベース管理者は、ログに記録された各 SQL ステートメントを確認し、パフォーマンスを改善する方法を判断できます。

  • ドライバのパフォーマンス データ。

    ドライバはパフォーマンス統計情報を記録できます。また、この情報をファイルに書き込んだり、SQLPERF というドライバ固有の構造体を使用して、アプリケーションで利用可能にすることができます。このパフォーマンス統計情報が書き込まれるファイルはタブで区切られており、Microsoft Excel など、タブ区切りのファイルをサポートするスプレッドシートを使用して容易に分析できます。

各プロファイルは、次の方法で有効にできます。

  • ログ記録が指定されているデータ ソースに接続する。

  • SQLSetConnectAttr を呼び出して、プロファイルを制御するドライバ固有の属性を設定する。

各アプリケーション プロセスは、個別に SQL Server Native Client ODBC ドライバのコピーを取得しますが、プロファイルは、ドライバのコピーとアプリケーション プロセスの組み合わせに対してグローバルに実行されます。アプリケーションによってプロファイルが有効になると、ドライバ内でアクティブになっている、そのアプリケーションからの全接続に関する情報が、プロファイルによって記録されます。特にプロファイルを要求していない接続も、プロファイルの対象に含まれます。

ドライバがプロファイル ログ (パフォーマンス データまたは実行時間の長いクエリのログ) を開くと、ドライバで開かれているすべての環境ハンドルがアプリケーションによって解放され、ODBC ドライバ マネージャがドライバをアンロードするまで、このプロファイル ログは閉じられません。アプリケーションが新しい環境ハンドルを開くと、ドライバの新しいコピーが読み込まれます。その後、アプリケーションが同じログ ファイルを指定しているデータ ソースに接続するか、同じファイルにログ記録するようにドライバ固有の属性を設定している場合、ドライバは古いログを上書きします。

あるアプリケーションが任意のログ ファイルに対してプロファイルの記録を開始し、別のアプリケーションが同じログ ファイルに対してプロファイルの記録を開始しようとすると、2 番目のアプリケーションはプロファイル データをログに記録できません。最初のアプリケーションがドライバをアンロードした後に、2 番目のアプリケーションがプロファイルを開始した場合、最初のアプリケーションのデータを記録しているログ ファイルは、2 番目のアプリケーションによって上書きされます。

プロファイルが有効になっているデータ ソースへアプリケーションが接続した場合、SQLSetConnectOption を呼び出してログ記録を開始しようとすると、ドライバは SQL_ERROR を返します。その後、SQLGetDiagRec への呼び出しにより、次の情報が返されます。

SQLState: 01000, pfNative = 0
ErrorMsg: [Microsoft][SQL Server Native Client]
   An error has occurred during the attempt to access
   the log file, logging disabled.

ドライバは、環境ハンドルが閉じられると、パフォーマンス データの収集を停止します。SQL Server Native Client アプリケーションが、それぞれ固有の環境ハンドルを持つ複数の接続を保持している場合、関連付けられている環境ハンドルのいずれかが閉じられると、ドライバはパフォーマンス データの収集を停止します。

ドライバのパフォーマンス データは、SQLPERF データ構造体に保存するか、タブ区切り形式ファイルに記録できます。このデータには、次の種類の統計情報が含まれます。

  • アプリケーション プロファイル

  • 接続

  • ネットワーク

  • 時刻

次の表では、SQLPERF データ構造体のフィールドについて説明します。この説明は、パフォーマンス ログ ファイルに記録される統計情報にも適用されます。

アプリケーション プロファイル統計情報

SQLPERF のフィールド

説明

TimerResolution

ミリ秒単位で表されたサーバーのクロック時間の最小単位。通常は 0 (ゼロ) が報告されます。大きな値が報告される場合のみ考慮する必要があります。サーバー クロックの最小単位が、タイマベースの一部の統計で予想される間隔よりも大きい場合は、統計値が増加する可能性があります。

SQLidu

SQL_PERF_START 以降に処理された INSERT、DELETE、または UPDATE ステートメントの数。

SQLiduRows

SQL_PERF_START 以降に処理された INSERT、DELETE、または UPDATE ステートメントの数。

SQLSelects

SQL_PERF_START 以降に処理された SELECT ステートメントの数。

SQLSelectRows

SQL_PERF_START 以降に選択された行数。

Transactions

SQL_PERF_START 以降のユーザー トランザクションの数。ロールバックの数も含まれます。SQL_AUTOCOMMIT_ON の状態で ODBC アプリケーションが実行されている場合は、各コマンドがトランザクションと見なされます。

SQLPrepares

SQL_PERF_START 以降の SQLPrepare 呼び出しの数。

ExecDirects

SQL_PERF_START 以降の SQLExecDirect 呼び出しの数。

SQLExecutes

SQL_PERF_START 以降の SQLExecute 呼び出しの数。

CursorOpens

SQL_PERF_START 以降にドライバがサーバー カーソルを開いた回数。

CursorSize

SQL_PERF_START 以降にカーソルによって開かれた結果セット内の行数。

CursorUsed

SQL_PERF_START 以降に実際にドライバによってカーソルから取得された行数。

PercentCursorUsed

CursorUsed/CursorSize の計算結果になります。たとえば、アプリケーションによりドライバでサーバー カーソルが開かれて "SELECT COUNT(*) FROM Authors" が実行され、この SELECT ステートメントの結果セットには 23 行が含まれるとします。その後、アプリケーションがこれらの行から 3 行のみをフェッチした場合、CursorUsed/CursorSize は 3/23 なので、PercentCursorUsed は 13.043478 になります。

AvgFetchTime

SQLFetchTime/SQLFetchCount の計算結果になります。

AvgCursorSize

CursorSize/CursorOpens の計算結果になります。

AvgCursorUsed

CursorUsed/CursorOpens の計算結果になります。

SQLFetchTime

サーバー カーソルに対してフェッチの完了に要した累積時間。

SQLFetchCount

SQL_PERF_START 以降にサーバー カーソルに対して実行されたフェッチの数。

CurrentStmtCount

ドライバ内で開かれているすべての接続上で、現在開いているステートメント ハンドルの数。

MaxOpenStmt

SQL_PERF_START 以降に同時に開かれたステートメント ハンドルの最大数。

SumOpenStmt

SQL_PERF_START 以降に開かれたステートメント ハンドルの数。

接続統計情報 :

 

CurrentConnectionCount

アプリケーションがサーバーに対して開いている現在アクティブな接続ハンドルの数。

MaxConnectionsOpened

SQL_PERF_START 以降に同時に開かれた接続ハンドルの最大数。

SumConnectionsOpened

SQL_PERF_START 以降に開かれた接続ハンドルの合計数。

SumConnectionTime

SQL_PERF_START 以降に開かれたすべての接続の接続時間の合計。たとえば、アプリケーションが接続を 10 開いていて、各接続を 5 秒間保持していた場合、SumConnectionTime は 50 秒になります。

AvgTimeOpened

SumConnectionsOpened/ SumConnectionTime の計算結果になります。

ネットワーク統計情報 :

 

ServerRndTrips

ドライバがサーバーにコマンドを送信し、応答を受け取った回数。

BuffersSent

SQL_PERF_START 以降にドライバから SQL Server に送信された表形式データ ストリーム (TDS) パケットの数。大量の処理を伴うコマンドは複数のバッファを使用する可能性があるので、このようなコマンドがサーバーに送信され、6 個のパケットを使用する場合、ServerRndTrips は 1 ずつ増加しますが、BuffersSent は 6 ずつ増加します。

BuffersRec

アプリケーションがドライバの使用を開始した後に、ドライバが SQL Server から受信した TDS パケットの数。

BytesSent

アプリケーションがドライバの使用を開始した後に、TDS パケットを使用して SQL Server に送信されたデータのバイト数。

BytesRec

アプリケーションがドライバの使用を開始した後に、ドライバが SQL Server から TDS パケットを使用して受信したデータのバイト数。

時間統計情報

SQLPERF のフィールド

説明

msExecutionTime

SQL_PERF_START 以降、ドライバが処理に要した累積時間。サーバーからの応答の待ち時間も含まれます。

msNetworkServerTime

ドライバがサーバーからの応答待ちに要した累積時間。