Freigeben über


Profiltreiber-Leistungsdaten (ODBC)

Dieses Beispiel zeigt die SQL Server ODBC-Treiberspezifischen Optionen zum Aufzeichnen von Leistungsstatistiken. Im Beispiel wird eine Datei erstellt: odbcperf.log.Dieses Beispiel zeigt sowohl die Erstellung einer Leistungsdatenprotokolldatei als auch das Anzeigen von Leistungsdaten direkt aus der SQLPERF-Datenstruktur (Die SQLPERF-Struktur ist in Odbcss.h. definiert). Dieses Beispiel wurde für ODBC Version 3.0 oder höher entwickelt.

Von Bedeutung

Verwenden Sie nach Möglichkeit die Windows-Authentifizierung. Wenn die Windows-Authentifizierung nicht verfügbar ist, werden Benutzer aufgefordert, ihre Anmeldeinformationen zur Laufzeit einzugeben. Vermeiden Sie das Speichern von Anmeldeinformationen in einer Datei. Wenn Sie Anmeldeinformationen beibehalten müssen, sollten Sie sie mit der Win32-Krypto-API verschlüsseln.

So protokollieren Sie Die Leistungsdaten des Treibers mithilfe des ODBC-Administrators

  1. Doppelklicken Sie in der Systemsteuerung auf "Verwaltungstools ", und doppelklicken Sie dann auf "Datenquellen (ODBC)". Alternativ können Sie odbcad32.exeaufrufen.

  2. Klicken Sie auf die Registerkarte "Benutzer-DSN", " System-DSN" oder " Datei-DSN ".

  3. Klicken Sie auf die Datenquelle, für die die Leistung protokolliert werden soll.

  4. Klicken Sie auf Konfigurieren.

  5. Navigieren Sie im Microsoft SQL Server-Assistenten zum Konfigurieren von DSN zur Seite mit Protokoll-ODBC-Treiberstatistiken zur Protokolldatei.

  6. Wählen Sie " ODBC-Treiberstatistiken protokollieren" in der Protokolldatei aus. Platzieren Sie im Feld den Namen der Datei, in der die Statistiken protokolliert werden sollen. Klicken Sie optional auf "Durchsuchen ", um das Dateisystem für das Statistikprotokoll zu durchsuchen.

So protokollieren Sie Leistungsdaten programmgesteuert

  1. Rufen Sie SQLSetConnectAttr mit SQL_COPT_SS_PERF_DATA_LOG und den vollständigen Pfad und Dateinamen der Leistungsdatenprotokolldatei auf. Beispiel:

    "C:\\Odbcperf.log"  
    
  2. Rufen Sie SQLSetConnectAttr mit SQL_COPT_SS_PERF_DATA und SQL_PERF_START auf, um mit der Protokollierung von Leistungsdaten zu beginnen.

  3. Rufen Sie optional SQLSetConnectAttr mit SQL_COPT_SS_LOG_NOW und NULL auf, um einen tabstopptrennten Datensatz mit Leistungsdaten in die Leistungsdatenprotokolldatei zu schreiben. Dies kann mehrmals ausgeführt werden, wenn die Anwendung ausgeführt wird.

  4. Rufen Sie SQLSetConnectAttr mit SQL_COPT_SS_PERF_DATA und SQL_PERF_STOP auf, um die Protokollierung von Leistungsdaten zu beenden.

So rufen Sie Die Leistungsdaten von Treibern in eine Anwendung ab

  1. Rufen Sie SQLSetConnectAttr mit SQL_COPT_SS_PERF_DATA und SQL_PERF_START auf, um Profilerstellungsleistungsdaten zu starten.

  2. Rufen Sie SQLGetConnectAttr mit SQL_COPT_SS_PERF_DATA und der Adresse eines Zeigers auf eine SQLPERF-Struktur auf. Der erste aufruf legt den Zeiger auf die Adresse einer gültigen SQLPERF-Struktur fest, die aktuelle Leistungsdaten enthält. Der Treiber aktualisiert die Daten in der Leistungsstruktur nicht kontinuierlich. Die Anwendung muss den Aufruf von SQLGetConnectAttr jederzeit wiederholen, wenn sie die Struktur mit aktuelleren Leistungsdaten aktualisieren muss.

  3. Rufen Sie SQLSetConnectAttr mit SQL_COPT_SS_PERF_DATA und SQL_PERF_STOP auf, um die Protokollierung von Leistungsdaten zu beenden.

Beispiel

Sie benötigen eine ODBC-Datenquelle namens AdventureWorks, deren Standarddatenbank die AdventureWorks-Beispieldatenbank ist. (Sie können die AdventureWorks-Beispieldatenbank von der Startseite für Microsoft SQL Server-Beispiele und Communityprojekte herunterladen.) Diese Datenquelle muss auf dem ODBC-Treiber basieren, der vom Betriebssystem bereitgestellt wird (der Treibername lautet "SQL Server"). Wenn Sie dieses Beispiel als 32-Bit-Anwendung auf einem 64-Bit-Betriebssystem erstellen und ausführen, müssen Sie die ODBC-Datenquelle mit dem ODBC-Administrator in %windir%\SysWOW64\odbcad32.exeerstellen.

In diesem Beispiel wird eine Verbindung mit der SQL Server-Standardinstanz Ihres Computers hergestellt. Um eine Verbindung mit einer benannten Instanz herzustellen, ändern Sie die Definition der ODBC-Datenquelle, um die Instanz mithilfe des folgenden Formats anzugeben: Server\nAmedinstance. Sql Server Express wird standardmäßig in einer benannten Instanz installiert.

Kompilieren mit 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);  
}  

Siehe auch

Profilerstellung von ODBC-Treibern – Themen zur Leistungsoptimierung (ODBC)
Profilerstellungs-ODBC-Treiberleistung