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)