次の方法で共有


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

このサンプルでは、パフォーマンス統計を記録するための SQL Server ODBC ドライバー固有のオプションを示します。 このサンプルでは、odbcperf.log.このサンプルでは、パフォーマンス データ ログ ファイルの作成と、SQLPERF データ構造から直接パフォーマンス データを表示する方法の両方を示しています (SQLPERF 構造体は Odbcss.h で定義されています)。 このサンプルは、ODBC バージョン 3.0 以降用に開発されました。

重要

可能な場合は、Windows 認証を使用します。 Windows 認証を使用できない場合は、実行時に資格情報を入力するようにユーザーに求めます。 資格情報をファイルに格納しないでください。 資格情報を保持する必要がある場合は、 Win32 暗号化 API を使用して暗号化する必要があります。

ODBC Administrator を使用してドライバーのパフォーマンス データをログに記録するには

  1. コントロール パネルで、[管理ツール] をダブルクリックし、[データ ソース (ODBC)] をダブルクリックします。 または、odbcad32.exeを呼び出すこともできます。

  2. [ ユーザー DSN]、[ システム DSN]、または [ ファイル DSN ] タブをクリックします。

  3. パフォーマンスをログに記録するデータ ソースをクリックします。

  4. [構成] をクリックします。

  5. Microsoft SQL Server DSN の構成ウィザードで、 ログ ODBC ドライバーの統計情報を含むページに移動してログ ファイルに移動します。

  6. [ LOG ODBC driver statistics to the log file]\(ODBC ドライバーの統計情報をログ ファイルに記録する\) を選択します。 ボックスに、統計をログに記録するファイルの名前を入力します。 必要に応じて、[ 参照 ] をクリックして、統計ログのファイル システムを参照します。

ドライバーのパフォーマンス データをプログラムでログに記録するには

  1. SQL_COPT_SS_PERF_DATA_LOGと、パフォーマンス データ ログ ファイルの完全なパスとファイル名を使用して SQLSetConnectAttr を呼び出します。 例えば次が挙げられます。

    "C:\\Odbcperf.log"  
    
  2. SQL_COPT_SS_PERF_DATAとSQL_PERF_STARTで SQLSetConnectAttr を呼び出して、パフォーマンス データのログ記録を開始します。

  3. 必要に応じて、SQL_COPT_SS_LOG_NOWと NULL を指定して SQLSetConnectAttr を呼び出し、パフォーマンス データのタブ区切りレコードをパフォーマンス データ ログ ファイルに書き込みます。 これは、アプリケーションの実行時に複数回実行できます。

  4. SQL_COPT_SS_PERF_DATAとSQL_PERF_STOPで SQLSetConnectAttr を呼び出して、パフォーマンス データのログ記録を停止します。

ドライバーのパフォーマンス データをアプリケーションにプルするには

  1. SQL_COPT_SS_PERF_DATAとSQL_PERF_STARTで SQLSetConnectAttr を呼び出して、パフォーマンス データのプロファイリングを開始します。

  2. SQL_COPT_SS_PERF_DATAと SQLPERF 構造体へのポインターのアドレスを使用して SQLGetConnectAttr を呼び出します。 このような最初の呼び出しは、現在のパフォーマンス データを含む有効な SQLPERF 構造体のアドレスへのポインターを設定します。 ドライバーは、パフォーマンス構造のデータを継続的に更新しません。 アプリケーションは、より新しいパフォーマンス データで構造を更新する必要がある場合は常に 、SQLGetConnectAttr の呼び出しを繰り返す必要があります。

  3. SQL_COPT_SS_PERF_DATAとSQL_PERF_STOPで SQLSetConnectAttr を呼び出して、パフォーマンス データのログ記録を停止します。

AdventureWorks という ODBC データ ソースが必要です。その既定のデータベースは AdventureWorks サンプル データベースです。 (AdventureWorks サンプル データベースは、 Microsoft SQL Server サンプルとコミュニティ プロジェクト のホーム ページからダウンロードできます)。このデータ ソースは、オペレーティング システムによって提供される ODBC ドライバーに基づいている必要があります (ドライバー名は "SQL Server" です)。 このサンプルを 64 ビット オペレーティング システムで 32 ビット アプリケーションとしてビルドして実行する場合は、odbc Administrator を使用して ODBC データ ソースを %windir%\SysWOW64\odbcad32.exeで作成する必要があります。

このサンプルでは、コンピューターの既定の SQL Server インスタンスに接続します。 名前付きインスタンスに接続するには、ODBC データ ソースの定義を変更し、サーバー\namedinstance という形式でインスタンスを指定します。 既定では、SQL Server Express は名前付きインスタンスにインストールされます。

odbc32.lib を使用してコンパイルします。

// compile with: odbc32.lib  
#include <stdio.h>  
#include <string.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
SQLHENV henv = SQL_NULL_HENV;  
SQLHDBC hdbc1 = SQL_NULL_HDBC;       
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;  
  
void Cleanup() {  
   if (hstmt1 != SQL_NULL_HSTMT)  
      SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
  
   if (hdbc1 != SQL_NULL_HDBC) {  
      SQLDisconnect(hdbc1);  
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   }  
  
   if (henv != SQL_NULL_HENV)  
      SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
  
int main() {  
   RETCODE retcode;  
  
   // Pointer to the ODBC driver performance structure.  
   SQLPERF *PerfPtr;  
   SQLINTEGER cbPerfPtr;  
  
   // Allocate the ODBC environment and save handle.  
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);  
   if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(Env) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Notify ODBC that this is an ODBC 3.0 app.  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);  
   if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetEnvAttr(ODBC version) Failed\n\n");  
      Cleanup();  
      return(9);      
   }  
  
   // Allocate ODBC connection handle and connect.  
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);  
   if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLAllocHandle(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // This sample use Integrated Security. Please create the SQL Server   
   // DSN by using the Windows NT authentication.   
   retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLConnect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Set options to log performance statistics.  Specify file to use for the log.  
   retcode = SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG, &"odbcperf.log", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Start the performance statistics log.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)SQL_PERF_START, SQL_IS_UINTEGER);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Allocate statement handle, then execute command.  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLAllocHandle() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Purchasing.Vendor", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT * FROM Sales.Store", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   // Generate a long-running query.  
   retcode = SQLExecDirect(hstmt1, (UCHAR*)"waitfor delay '00:00:04' ", SQL_NTS);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLExecDirect() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Clear any result sets generated.  
   while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA ) {  
      if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
         printf("SQLMoreResults() Failed\n\n");  
         Cleanup();  
         return(9);  
      }  
   }  
  
   // Write current statistics to the performance log.  
   retcode =   
      SQLSetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA_LOG_NOW, (SQLPOINTER)NULL, SQL_IS_UINTEGER);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLSetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Get pointer to current SQLPerf structure.  
   // Print a couple of statistics.  
   retcode =   
      SQLGetConnectAttr( hdbc1, SQL_COPT_SS_PERF_DATA, (SQLPOINTER)&PerfPtr, SQL_IS_POINTER, &cbPerfPtr);  
   if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {  
      printf("SQLGetConnectAttr() Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   printf("SQLSelects = %d, SQLSelectRows = %d\n", PerfPtr->SQLSelects, PerfPtr->SQLSelectRows);  
  
   // Cleanup  
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  

こちらもご覧ください

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