Sprache

Anbieterstatistiken für SQL Server

Microsoft.Data.SqlClient unterstützt Laufzeitstatistiken. Aktivieren Sie Statistiken, indem Sie die StatisticsEnabled Eigenschaft für ein gültiges SqlConnection Objekt auf Truefestlegen.

Nachdem Sie Statistiken aktiviert haben, rufen Sie RetrieveStatistics auf, um eine Momentaufnahme zu einem bestimmten Zeitpunkt im IDictionary-Objekt zu erhalten. Zählen Sie die nicht sortierten Namen-Wert-Paare auf, um die Zähler zu lesen. Rufen Sie ResetStatisticsauf, um die Zähler zurückzusetzen.

Wenn Sie keine Statistiken aktiviert haben, gibt RetrieveStatistics den Anfangswert jedes Zählers ohne Ausnahme zurück. Nachdem Sie Statistiken deaktiviert haben, behalten die Zähler die bis zu diesem Punkt gesammelten Werte bei.

Alle erfassten statistischen Werte gelten pro Verbindung.

Verfügbare statistische Werte

Der Microsoft SQL Server-Anbieter macht 18 statistische Werte verfügbar. Lesen Sie die Count-Eigenschaft des Wörterbuchs, um die Anzahl der verfügbaren Einträge abzurufen. Alle Zähler verwenden Int64, den 64-Bit-Typ namens Long in C# und long in Visual Basic.

Der Maximalwert ist Int64.MaxValue(2^63)-1. Bei diesem Grenzwert sind Zähler nicht mehr genau. Der größte gültige Wert für eine Statistik ist daher Int64.MaxValue - 1, oder (2^63)-2.

Hinweis

Ein Wörterbuch wird für die Rückgabe von Anbieterstatistiken verwendet, da sich Anzahl, Namen und Reihenfolge der zurückgegebenen Statistiken in Zukunft ändern können. Anwendungen dürfen sich nicht darauf verlassen, dass ein bestimmter Wert im Wörterbuch zu finden ist, sondern müssen prüfen, ob der Wert vorhanden ist und entsprechend verzweigen.

In der folgenden Tabelle werden die verfügbaren statistischen Werte beschrieben. Die Schlüsselnamen für die einzelnen Werte sind in den regionalen Versionen von .NET Framework nicht lokalisiert.

Schlüsselname Beschreibung
BuffersReceived Gibt die Anzahl der TDS-Pakete (Tabular Data Stream) zurück, die der Anbieter von SQL Server empfangen hat, nachdem die Anwendung die Nutzung des Anbieters gestartet und Statistiken aktiviert hat.
BuffersSent Gibt die Anzahl der TDS-Pakete zurück, die vom Anbieter nach Aktivieren von Statistiken an SQL Server gesendet wurden. Für große Befehle sind möglicherweise mehrere Puffer erforderlich. Wenn z. B. ein großer Befehl an den Server gesendet wird und er sechs Pakete erfordert, wird ServerRoundtrips um 1 und BuffersSent um 6 erhöht.
BytesReceived Gibt die Anzahl der Datenbytes in den TDS-Paketen zurück, die der Anbieter von SQL Server empfangen hat, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.
BytesSent Gibt die Anzahl der Datenbytes zurück, die in TDS-Paketen an SQL Server gesendet wurden, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.
ConnectionTime Die Zeitspanne (in Millisekunden), für die die Verbindung nach dem Aktivieren der Statistik geöffnet war (die Gesamtverbindungszeit, wenn die Statistik vor dem Öffnen der Verbindung aktiviert wurde).
CursorOpens Gibt zurück, wie oft ein Cursor über die Verbindung geöffnet wurde, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.

Beachten Sie, dass schreibgeschützte/vorwärtsgerichtete Ergebnisse, die von SELECT-Anweisungen zurückgegeben werden, nicht als Cursor betrachtet werden und daher diesen Zähler nicht beeinflussen.
ExecutionTime Gibt die Gesamtzeitspanne (in Millisekunden) zurück, die der Anbieter seit dem Aktivieren der Statistik mit der Verarbeitung verbracht hat, einschließlich der Zeit zum Warten auf Antworten vom Server und zum Ausführen von Code im Anbieter selbst.

Die Klassen, die Zeitsteuerungscode enthalten, lauten:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Um leistungskritische Member so klein wie möglich zu halten, werden die folgenden Member nicht zeitgesteuert:

SqlDataReader

this[] Operator (alle Überladungen)

GetBoolean

GetChar

GetDateTime

GetDecimal

GetDouble

GetFloat

GetGuid

GetInt16

GetInt32

GetInt64

GetName

GetOrdinal

GetSqlBinary

GetSqlBoolean

GetSqlByte

GetSqlDateTime

GetSqlDecimal

GetSqlDouble

GetSqlGuid

GetSqlInt16

GetSqlInt32

GetSqlInt64

GetSqlMoney

GetSqlSingle

GetSqlString

GetString

IsDBNull
IduCount Gibt die Gesamtanzahl von INSERT, DELETEund UPDATE Anweisungen, die über die Verbindung ausgeführt werden, nachdem die Anwendung mit der Verwendung des Anbieters begonnen hat und Statistiken aktiviert hat.
IduRows Gibt die Gesamtzahl der Zeilen zurück, die von INSERT-, DELETE- und UPDATE-Anweisungen betroffen sind, die über die Verbindung ausgeführt werden, nachdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.
NetworkServerTime Gibt die kumulative Zeitspanne (in Millisekunden) zurück, die der Anbieter zum Warten auf Antworten vom Server verwendet hat, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.
PreparedExecs Gibt die Anzahl vorbereiteter Befehle zurück, die über die Verbindung ausgeführt wurden, sobald die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.
Prepares Gibt die Anzahl der über die Verbindung vorbereiteten Anweisungen zurück, sobald die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.
SelectCount Gibt die Anzahl der SELECT Anweisungen zurück, die über die Verbindung ausgeführt wurden, nachdem die Anwendung Statistiken aktiviert hat. Enthält FETCH Anweisungen, die Zeilen aus Cursorn abrufen. Bei SELECT-Anweisungen aktualisiert der Anbieter die Anzahl der Ergebnisse, wenn SqlDataReader das Ende der Ergebnisse erreicht.
SelectRows Gibt die Anzahl der ausgewählten Zeilen zurück, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat. Dieser Zähler spiegelt alle von SQL-Anweisungen erstellten Zeilen wider, auch solche, die vom Aufrufer nicht wirklich genutzt wurden. Beispielsweise würde das Schließen eines Datenlesers vor dem Lesen des gesamten Resultsets die Anzahl nicht beeinflussen. Dies schließt die Zeilen ein, die von Cursorn über FETCH Anweisungen abgerufen werden.
ServerRoundtrips Gibt zurück, wie oft die Verbindung Befehle an den Server gesendet und eine Antwort erhalten hat, sobald die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.
SumResultSets Gibt die Anzahl der Resultsets zurück, die verwendet wurden, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat. Dies würde z. B. jedes an den Client zurückgegebene Resultset umfassen. Bei Cursorn wird jeder Abruf oder Blockabruf als unabhängiges Ergebnisset betrachtet.
Transactions Gibt die Anzahl der Benutzertransaktionen zurück, die gestartet wurden, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken, einschließlich Rollbacks, aktiviert hat. Wenn eine Verbindung mit aktiviertem Autocommit ausgeführt wird, gilt jeder Befehl als Transaktion.

Dieser Zähler erhöht den Transaktionszähler, sobald eine BEGIN TRAN-Anweisung ausgeführt wird, unabhängig davon, ob die Transaktion committet oder später rückgängig gemacht wird.
UnpreparedExecs Gibt die Anzahl der über die Verbindung ausgeführten unvorbereiteten Anweisungen zurück, nachdem die Anwendung mit der Nutzung des Anbieters begonnen und Statistiken aktiviert hat.

Abrufen eines Werts

Die folgende Konsolenanwendung zeigt, wie Statistiken über eine Verbindung aktiviert, vier einzelne Statistikwerte abgerufen und in das Konsolenfenster geschrieben werden können.

Hinweis

Im folgenden Beispiel wird die Beispieldatenbank AdventureWorks verwendet, die in SQL Server enthalten ist. In der im Beispielcode bereitgestellten Verbindungszeichenfolge wird davon ausgegangen, dass die Datenbank auf dem lokalen Computer installiert und verfügbar ist. Ändern Sie die Verbindungszeichenfolge nach Bedarf für Ihre Umgebung.

Option Strict On

Imports System
Imports System.Collections
Imports System.Data
Imports Microsoft.Data.SqlClient

Module Module1

  Sub Main()
    Dim connectionString As String = GetConnectionString()

    Using awConnection As New SqlConnection(connectionString)
      ' StatisticsEnabled is False by default.
      ' It must be set to True to start the
      ' statistic collection process.
      awConnection.StatisticsEnabled = True

      Dim productSQL As String = "SELECT * FROM Production.Product"
      Dim productAdapter As _
          New SqlDataAdapter(productSQL, awConnection)

      Dim awDataSet As New DataSet()

      awConnection.Open()

      productAdapter.Fill(awDataSet, "ProductTable")

      ' Retrieve the current statistics as
      ' a collection of values at this point
      ' and time.
      Dim currentStatistics As IDictionary = _
          awConnection.RetrieveStatistics()

      Console.WriteLine("Total Counters: " & _
          currentStatistics.Count.ToString())
      Console.WriteLine()

      ' Retrieve a few individual values
      ' related to the previous command.
      Dim bytesReceived As Long = _
          CLng(currentStatistics.Item("BytesReceived"))
      Dim bytesSent As Long = _
          CLng(currentStatistics.Item("BytesSent"))
      Dim selectCount As Long = _
          CLng(currentStatistics.Item("SelectCount"))
      Dim selectRows As Long = _
          CLng(currentStatistics.Item("SelectRows"))

      Console.WriteLine("BytesReceived: " & bytesReceived.ToString())
      Console.WriteLine("BytesSent: " & bytesSent.ToString())
      Console.WriteLine("SelectCount: " & selectCount.ToString())
      Console.WriteLine("SelectRows: " & selectRows.ToString())

      Console.WriteLine()
      Console.WriteLine("Press any key to continue")
      Console.ReadLine()
    End Using

  End Sub

  Function GetConnectionString() As String
    ' To avoid storing the connection string in your code,
    ' you can retrieve it from a configuration file.
    Return "..."
  End Function
End Module
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using Microsoft.Data.SqlClient;

namespace CS_Stats_Console_GetValue
{
  class Program
  {
    static void Main(string[] args)
    {
      string connectionString = GetConnectionString();

      using (SqlConnection awConnection =
        new SqlConnection(connectionString))
      {
        // StatisticsEnabled is False by default.
        // It must be set to True to start the
        // statistic collection process.
        awConnection.StatisticsEnabled = true;

        string productSQL = "SELECT * FROM Production.Product";
        SqlDataAdapter productAdapter =
          new SqlDataAdapter(productSQL, awConnection);

        DataSet awDataSet = new DataSet();

        awConnection.Open();

        productAdapter.Fill(awDataSet, "ProductTable");
        // Retrieve the current statistics as
        // a collection of values at this point
        // and time.
        IDictionary currentStatistics =
          awConnection.RetrieveStatistics();

        Console.WriteLine("Total Counters: " +
          currentStatistics.Count.ToString());
        Console.WriteLine();

        // Retrieve a few individual values
        // related to the previous command.
        long bytesReceived =
            (long) currentStatistics["BytesReceived"];
        long bytesSent =
            (long) currentStatistics["BytesSent"];
        long selectCount =
            (long) currentStatistics["SelectCount"];
        long selectRows =
            (long) currentStatistics["SelectRows"];

        Console.WriteLine("BytesReceived: " +
            bytesReceived.ToString());
        Console.WriteLine("BytesSent: " +
            bytesSent.ToString());
        Console.WriteLine("SelectCount: " +
            selectCount.ToString());
        Console.WriteLine("SelectRows: " +
            selectRows.ToString());

        Console.WriteLine();
        Console.WriteLine("Press any key to continue");
        Console.ReadLine();
      }

    }
    private static string GetConnectionString()
    {
      // To avoid storing the connection string in your code,
      // you can retrieve it from a configuration file.
      return "...";
    }
  }
}

Abrufen aller Werte

Die folgende Konsolenanwendung zeigt, wie Statistiken über eine Verbindung aktiviert, alle verfügbaren Statistikwerte mit dem Enumerator abgerufen und in das Konsolenfenster geschrieben werden können.

Hinweis

Im folgenden Beispiel wird die Beispieldatenbank AdventureWorks verwendet, die in SQL Server enthalten ist. In der im Beispielcode bereitgestellten Verbindungszeichenfolge wird davon ausgegangen, dass die Datenbank auf dem lokalen Computer installiert und verfügbar ist. Ändern Sie die Verbindungszeichenfolge nach Bedarf für Ihre Umgebung.

Option Strict On

Imports System
Imports System.Collections
Imports System.Data
Imports Microsoft.Data.SqlClient

Module Module1
  Sub Main()
    Dim connectionString As String = GetConnectionString()

    Using awConnection As New SqlConnection(connectionString)
      ' StatisticsEnabled is False by default.
      ' It must be set to True to start the
      ' statistic collection process.
      awConnection.StatisticsEnabled = True

      Dim productSQL As String = "SELECT * FROM Production.Product"
      Dim productAdapter As _
          New SqlDataAdapter(productSQL, awConnection)

      Dim awDataSet As New DataSet()

      awConnection.Open()

      productAdapter.Fill(awDataSet, "ProductTable")

      ' Retrieve the current statistics as
      ' a collection of values at this point
      ' and time.
      Dim currentStatistics As IDictionary = _
          awConnection.RetrieveStatistics()

      Console.WriteLine("Total Counters: " & _
          currentStatistics.Count.ToString())
      Console.WriteLine()

      Console.WriteLine("Key Name and Value")

      ' Note the entries are unsorted.
      For Each entry As DictionaryEntry In currentStatistics
        Console.WriteLine(entry.Key.ToString() & _
            ": " & entry.Value.ToString())
      Next

      Console.WriteLine()
      Console.WriteLine("Press any key to continue")
      Console.ReadLine()
    End Using

  End Sub

  Function GetConnectionString() As String
    ' To avoid storing the connection string in your code,
    ' you can retrieve it from a configuration file.
    Return "..."
  End Function
End Module
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Microsoft.Data.SqlClient;

namespace CS_Stats_Console_GetAll
{
  class Program
  {
    static void Main(string[] args)
    {
      string connectionString = GetConnectionString();

      using (SqlConnection awConnection =
        new SqlConnection(connectionString))
      {
        // StatisticsEnabled is False by default.
        // It must be set to True to start the
        // statistic collection process.
        awConnection.StatisticsEnabled = true;

        string productSQL = "SELECT * FROM Production.Product";
        SqlDataAdapter productAdapter =
            new SqlDataAdapter(productSQL, awConnection);

        DataSet awDataSet = new DataSet();

        awConnection.Open();

        productAdapter.Fill(awDataSet, "ProductTable");

        // Retrieve the current statistics as
        // a collection of values at this point
        // and time.
        IDictionary currentStatistics =
            awConnection.RetrieveStatistics();

        Console.WriteLine("Total Counters: " +
            currentStatistics.Count.ToString());
        Console.WriteLine();

        Console.WriteLine("Key Name and Value");

        // Note the entries are unsorted.
        foreach (DictionaryEntry entry in currentStatistics)
        {
          Console.WriteLine(entry.Key.ToString() +
              ": " + entry.Value.ToString());
        }

        Console.WriteLine();
        Console.WriteLine("Press any key to continue");
        Console.ReadLine();
      }

    }
    private static string GetConnectionString()
    {
      // To avoid storing the connection string in your code,
      // you can retrieve it from a configuration file.
      return "...";
    }
  }
}

Siehe auch