次の方法で共有


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

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

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

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

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

    ドライバーは、パフォーマンス統計を記録し、ファイルに書き込むか、SQLPERF という名前のドライバー固有のデータ構造を介してアプリケーションで使用できるようにします。 パフォーマンス統計を含むファイルはタブ区切りファイルであり、Microsoft Excel などのタブ区切りファイルをサポートするスプレッドシートで簡単に分析できます。

どちらの種類のプロファイリングも、次の方法で有効にすることができます。

  • ログ記録を指定するデータ ソースへの接続。

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

各アプリケーション プロセスは、SQL Server Native Client ODBC ドライバーの独自のコピーを取得します。プロファイリングは、ドライバーのコピーとアプリケーション プロセスの組み合わせに対してグローバルです。 アプリケーション内の何かのプロファイルを有効にすると、プロファイルは、そのアプリケーションからドライバーでアクティブなすべての接続の情報を記録します。 プロファイリングを特に呼び出さなかった接続も含まれます。

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

アプリケーションがログ ファイルへのプロファイリングを開始し、2 番目のアプリケーションが同じログ ファイルへのプロファイリングを開始しようとすると、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後に選択された行数。
トランザクション ロールバックを含む、SQL_PERF_START後のユーザー トランザクションの数。 ODBC アプリケーションが SQL_AUTOCOMMIT_ON で実行されている場合、各コマンドはトランザクションと見なされます。
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 パケットの数。
送信済みバイト数 アプリケーションがドライバーの使用を開始した後に、TDS パケットで SQL Server に送信されたデータのバイト数。
BytesRec アプリケーションがドライバーの使用を開始した後に SQL Server からドライバーが受信した TDS パケット内のデータのバイト数。

時間統計

SQLPERF フィールド 説明
msExecutionTime ドライバーがSQL_PERF_START後に処理に費やした累積時間 (サーバーからの応答の待機に費やされた時間を含む)。
msNetworkServerTime ドライバーがサーバーからの応答を待機するために費やした累積時間。

こちらもご覧ください

SQL Server Native Client (ODBC)
ODBC ドライバーのパフォーマンスのプロファイリングに関する操作方法に関するトピック (ODBC)