Leistungsprofilerstellung des ODBC-Treibers

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Wichtig

SQL Server Native Client (SNAC) wird nicht ausgeliefert mit:

  • SQL Server 2022 (16.x) und höhere Versionen
  • SQL Server Management Studio 19 und höhere Versionen

Der SQL Server Native Client (SQLNCLI oder SQLNCLI11) und der ältere Microsoft OLE DB-Anbieter für SQL Server (SQLOLEDB) werden für die entwicklung neuer Anwendungen nicht empfohlen.

Für neue Projekte verwenden Sie einen der folgenden Treiber:

Informationen zu SQLNCLI, das als Komponente der SQL Server Datenbank-Engine (Versionen 2012 bis 2019) ausgeliefert wird, finden Sie in dieser Ausnahme für den Supportlebenszyklus.

Der SQL Server Native Client ODBC-Treiber kann zwei Arten von Leistungsdaten profilen:

  • Abfragen mit langer Ausführungszeit

    Der Treiber kann jede Abfrage in eine Protokolldatei schreiben, die innerhalb eines angegebenen Zeitraums keine Antwort vom Server erhält. Anwendungsprogrammierer und Datenbankadministratoren können dann die protokollierten SQL-Anweisungen untersuchen, um zu ermitteln, wie sie die Leistung verbessern können.

  • Treiberleistungsdaten

    Der Treiber kann Leistungsstatistiken aufzeichnen und entweder in eine Datei schreiben oder über eine treiberspezifische Datenstruktur namens SQLPERF einer Anwendung verfügbar machen. Die Datei mit den Leistungsstatistiken ist eine durch Tabstopps getrennte Datei, die mit jeder Tabellenkalkulationsanwendung, die durch Tabstopps getrennte Dateien unterstützt (beispielsweise Microsoft Excel), problemlos analysiert werden kann.

Beide Typen der Profilerstellung werden wie folgt aktiviert:

  • Durch Herstellen einer Verbindung zu einer Datenquelle, die die Protokollierung angibt

  • Aufrufen von SQLSetConnectAttr zum Festlegen treiberspezifischer Attribute, die die Profilerstellung steuern.

Jeder Anwendungsprozess erhält eine eigene Kopie des SQL Server Native Client ODBC-Treibers und die Profilerstellung ist global für die Kombination einer Treiberkopie und eines Anwendungsprozesses. Wenn die Profilerstellung in der Anwendung aktiviert wird, zeichnet die Profilerstellung Informationen über alle im Treiber dieser Anwendung aktiven Verbindungen auf. Das betrifft auch die Verbindungen, die die Profilerstellung nicht ausdrücklich angefordert haben.

Nachdem der Treiber ein Profilerstellungsprotokoll geöffnet hat (entweder das Protokoll für Leistungsdaten oder für eine Abfrage mit längerer Ausführungszeit), schließt er es erst wieder, wenn der Treiber vom ODBC-Treiber-Manager entladen wird, weil eine Anwendung alle Umgebungshandles freigibt, die sie im Treiber geöffnet hatte. Wenn die Anwendung ein neues Umgebungshandle öffnet, wird eine neue Kopie des Treibers geladen. Wenn die Anwendung dann entweder die Verbindung zu einer Datenquelle herstellt, die dieselbe Protokolldatei angibt, oder die treiberspezifischen Attribute auf die Protokollierung in derselben Datei festlegt, überschreibt der Treiber das alte Protokoll.

Wenn eine Anwendung mit der Profilerstellung in einer Protokolldatei beginnt und eine zweite Anwendung versucht, die Profilerstellung in derselben Protokolldatei zu beginnen, kann die zweite Anwendung keine Profildaten protokollieren. Wenn die zweite Anwendung mit der Profilerstellung beginnt, nachdem die erste Anwendung ihren Treiber entladen hat, überschreibt die zweite Anwendung die Protokolldatei der ersten Anwendung.

Wenn eine Anwendung eine Verbindung mit einer Datenquelle herstellt, die Profilerstellung aktiviert hat, gibt der Treiber SQL_ERROR zurück, wenn die Anwendung SQLSetConnectOption aufruft, um die Protokollierung zu starten. Ein Aufruf von SQLGetDiagRec gibt dann Folgendes zurück:

SQLState: 01000, pfNative = 0  
ErrorMsg: [Microsoft][SQL Server Native Client]  
   An error has occurred during the attempt to access  
   the log file, logging disabled.  

Der Treiber hört auf, Leistungsdaten zu erfassen, wenn ein Umgebungshandle geschlossen wird. Wenn eine SQL Server Native Client-Anwendung über mehrere Verbindungen verfügt, jedes mit einem eigenen Umgebungshandle, beendet der Treiber das Sammeln von Leistungsdaten, wenn eine der zugehörigen Umgebungshandles geschlossen wird.

Die Leistungsdaten des Treibers können entweder in der SQLPERF-Datenstruktur gespeichert oder in einer durch Tabstopps getrennten Datei protokolliert werden. Die Daten umfassen die folgenden Statistikkategorien:

  • Anwendungsprofil

  • Verbindung

  • Network

  • Zeit

In der folgenden Tabelle gelten die Beschreibungen der Felder in der SQLPERF-Datenstruktur auch für die in der Leistungsprotokolldatei erfassten Statistiken.

Anwendungsprofilstatistiken

SQLPERF-Feld Beschreibung
TimerResolution Minimale Auflösung der Uhrzeit des Servers in Millisekunden. Dies wird gewöhnlich als 0 (null) angegeben und sollte nur verwendet werden, wenn die angegebene Zahl sehr groß ist. Wenn die minimale Auflösung der Serveruhrzeit größer als das wahrscheinliche Intervall einiger der zeitgeberbasierten Statistikwerte ist, könnte die Statistikdatenmenge unnötig größer werden.
SQLidu Anzahl der INSERT-Anweisungen, DELETE-Anweisungen oder UPDATE-Anweisungen nach SQL_PERF_START
SQLiduRows Anzahl der INSERT-Anweisungen, DELETE-Anweisungen oder UPDATE-Anweisungen nach SQL_PERF_START
SQLSelects Anzahl der SELECT-Anweisungen, die nach SQL_PERF_START verarbeitet wurden
SQLSelectRows Anzahl von Zeilen, die nach SQL_PERF_START ausgewählt wurden
Transaktionen Anzahl der Benutzertransaktionen nach SQL_PERF_START, einschließlich der Rollbacks. Wenn eine ODBC-Anwendung mit SQL_AUTOCOMMIT_ON ausgeführt wird, wird jeder Befehl als Transaktion betrachtet.
SQLPrepares Die Anzahl der SQLPrepare-Funktionsaufrufe nach SQL_PERF_START.
ExecDirects Anzahl der SQLExecDirect-Aufrufe nach SQL_PERF_START.
SQLExecutes Die Anzahl der SQLExecute-Aufrufe nach SQL_PERF_START.
CursorOpens Anzahl der Male, die der Treiber nach SQL_PERF_START einen Servercursor geöffnet hat
CursorSize Anzahl von Zeilen in den Resultsets, die nach SQL_PERF_START von Cursorn geöffnet wurden
CursorUsed Anzahl von Zeilen, die nach SQL_PERF_START über den Treiber von Cursorn abgerufen wurden
PercentCursorUsed Entspricht CursorUsed/CursorSize. Wenn beispielsweise eine Anwendung den Treiber veranlasst, einen Servercursor zu öffnen, um "SELECT COUNT(*) FROM Authors," auszuführen, enthält das Resultset für die SELECT-Anweisung 23 Zeilen. Wenn die Anwendung dann nur drei von diesen Zeilen abruft, ist CursorUsed/CursorSize = 3/23, weshalb PercentCursorUsed = 13.043478 ist.
AvgFetchTime Entspricht SQLFetchTime/SQLFetchCount
AvgCursorSize Entspricht CursorSize/CursorOpens
AvgCursorUsed Entspricht CursorUsed/CursorOpens
SQLFetchTime Kumulierte Menge an Zeit, die für das Abrufen der Servercursor benötigt wurde
SQLFetchCount Zahl von Abrufen, die nach SQL_PERF_START für Servercursor ausgeführt wurden
CurrentStmtCount Anzahl von Anweisungshandles, die aktuell für alle im Treiber geöffneten Verbindungen geöffnet sind
MaxOpenStmt Maximale Anzahl gleichzeitig geöffneter Anweisungshandles nach SQL_PERF_START
SumOpenStmt Anzahl von Anweisungshandles, die nach SQL_PERF_START geöffnet wurden
Verbindungsstatistiken:
CurrentConnectionCount Aktuelle Anzahl aktiver Verbindungshandles, die die Anwendung für den Server geöffnet hat
MaxConnectionsOpened Maximale Anzahl gleichzeitig geöffneter Verbindungshandles nach SQL_PERF_START
SumConnectionsOpened Summe der Verbindungshandles, die nach SQL_PERF_START geöffnet wurden
SumConnectionTime Menge an Zeit insgesamt, die alle Verbindungen nach SQL_PERF_START geöffnet waren. Beispiel: Wenn eine Anwendung 10 Verbindungen geöffnet und jede 5 Sekunden lang offen gehalten hat, beträgt SumConnectionTime 50 Sekunden.
AvgTimeOpened Entspricht SumConnectionsOpened/SumConnectionTime
Netzwerkstatistik:
ServerRndTrips Die Anzahl von Malen, die der Treiber Befehle an den Server gesendet und eine Antwort erhalten hat
BuffersSent Anzahl der TDS-Pakete (Tabular Data Stream), die nach SQL_PERF_START vom Treiber an SQL Server gesendet wurden. Umfangreiche Befehle können mehrere Puffer belegen; wenn also ein umfangreicher Befehl an den Server gesendet wird und er sechs Pakete erfordert, wird ServerRndTrips um eins und BuffersSent um sechs erhöht.
BuffersRec Die Anzahl der TDS-Pakete, die vom Treiber von SQL Server empfangen wurden, nachdem die Anwendung mit dem Treiber begonnen hat.
BytesSent Die Anzahl der Bytes, die an SQL Server in TDS-Paketen gesendet wurden, nachdem die Anwendung mit dem Treiber begonnen hat.
BytesRec Anzahl der Daten in TDS-Paketen, die vom Treiber von SQL Server empfangen wurden, nachdem die Anwendung mit der Verwendung des Treibers begonnen hat.

Zeitstatistiken

SQLPERF-Feld Beschreibung
msExecutionTime Die kumulierte Verarbeitungszeit des Treibers nach SQL_PERF_START, einschließlich der Wartezeit des Treibers auf Antworten vom Server
msNetworkServerTime Die kumulierte Wartezeit des Treibers auf Antworten vom Server

Weitere Informationen

SQL Server Native Client (ODBC)
Themen zur Vorgehensweise zur Profilerstellung für die Treiberleistung (ODBC)