次の方法で共有


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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) は以下に付属していません。

  • SQL Server 2022 (16.x) 以降
  • SQL Server Management Studio 19 以降

SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。

新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。

SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、この「サポート ライフサイクルの例外」を参照してください。

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 以降に選択された行数。
トランザクション 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 の計算結果になります。
[Network Statistics]\(ネットワークの統計\):
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 ドライバーがサーバーからの応答待ちに要した累積時間。

参照

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