Freigeben über


Anbieterstatistik für SQL Server (ADO.NET)

Ab .NET Framework Version 2.0 unterstützt der .NET Framework-Datenanbieter für SQL Server Laufzeitstatistiken. Sie müssen die Statistik aktivieren, indem Sie nach dem Erstellen eines gültigen Verbindungsobjekts die StatisticsEnabled-Eigenschaft des SqlConnection-Objekts auf True festlegen. Nach dem Aktivieren der Statistik können Sie sie als "Momentaufnahme" betrachten, indem Sie einen IDictionary-Verweis über die RetrieveStatistics-Methode des SqlConnection-Objekts abrufen. Blättern Sie durch die Liste wie durch Wörterbucheinträge mit Name-Wert-Paaren. Diese Name-Wert-Paare sind nicht sortiert. Sie können jederzeit die ResetStatistics-Methode des SqlConnection-Objekts aufrufen, um die Zähler zurückzusetzen. Wenn das Erfassen der Statistik nicht aktiviert wurde, wird keine Ausnahme ausgelöst. Wenn RetrieveStatistics aufgerufen wird, ohne vorher StatisticsEnabled aufzurufen, stellen die abgerufenen Werte die Anfangswerte für die einzelnen Einträge dar. Wenn Sie die Statistik aktivieren, die Anwendung für eine gewisse Zeit ausführen und dann die Statistik wieder deaktivieren, entsprechen die abgerufenen Werte den Werten, die bis zu dem Zeitpunkt erfasst wurden, an dem die Statistik deaktiviert wurde. Alle statistischen Werte werden auf der Basis einzelner Verbindungen erfasst.

Verfügbare statistische Werte

Gegenwärtig sind vom Anbieter Microsoft SQL Server 18 verschiedene Elemente verfügbar. Die Anzahl der verfügbaren Elemente kann über die Count-Eigenschaft des IDictionary-Schnittstellenverweises abgerufen werden, die von RetrieveStatistics zurückgegeben wird. Alle Zähler für Anbieterstatistiken verwenden den Int64-CLR-Typ (Common Language Runtime) (long in C# und Visual Basic), der 64 Bit lang ist. Der Maximalwert des im Feld int64.MaxValue definierten int64-Datentyps beträgt ((2^63)-1)). Wenn die Werte für die Zähler diesen Maximalwert erreichen, können sie nicht mehr als korrekt bezeichnet werden. Das bedeutet, dass int64.MaxValue-1 ((2^63)-2) tatsächlich der größte gültige Wert für alle Statistiken ist.

HinweisHinweis

Für die zurückgegebene Anbieterstatistik wird ein Wörterbuch verwendet, da sich die Anzahl, die Namen und die Reihenfolge der zurückgegebenen Statistiken zukünftig ändern können.Anwendungen sollten sich nicht darauf verlassen, dass ein bestimmter Wert in einem Wörterbuch gefunden wird, sondern stattdessen überprüfen, ob der Wert vorhanden ist, und entsprechend verzweigen.

In der folgenden Tabelle werden die aktuell verfügbaren statistischen Werte beschrieben. Beachten Sie, dass die Schlüsselnamen für die einzelnen Werte für regionale Versionen von Microsoft .NET Framework nicht lokalisiert werden.

Schlüsselname

Beschreibung

BuffersReceived

Gibt die Anzahl der TDS-Pakete (Tabular Data Stream) zurück, die vom Anbieter von SQL Server empfangen wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

BuffersSent

Gibt die Anzahl der TDS-Pakete zurück, die vom Anbieter an SQL Server gesendet wurden, seit die Statistik aktiviert wurde. Für umfangreiche Befehle sind möglicherweise mehrere Puffer erforderlich. Wenn z. B. ein großer Befehl an der Server gesendet wurde und 6 Pakete erfordert, wird ServerRoundtrips um 1 vergrößert und BuffersSent um 6 vergrößert.

BytesReceived

Gibt die Anzahl der Bytes der Daten in TDS-Paketen zurück, die vom Anbieter von SQL Server empfangen wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

BytesSent

Gibt die Anzahl der Bytes der Daten zurück, die in TDS-Paketen an SQL Server gesendet wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

ConnectionTime

Die Zeitspanne, 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 während der Verbindung ein Cursor geöffnet war, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

Beachten Sie, dass schreibgeschützte Vorwärtsergebnisse, die von SELECT-Anweisungen zurückgegeben wurden, nicht als Cursor betrachtet werden und deshalb diesen Zähler nicht beeinflussen.

ExecutionTime

Gibt die Gesamtzeitspanne 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.

Folgende Klassen enthalten Zeiterfassungscode:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Um leistungswichtige Member so klein wie möglich zu halten, erfolgt für die folgenden Member keine Zeiterfassung:

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 gesamte Anzahl der über die Verbindung ausgeführten INSERT-, DELETE- und UPDATE-Anweisungen zurück, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

IduRows

Gibt die gesamte Anzahl der Zeilen zurück, die von über die Verbindung ausgeführten INSERT-, DELETE- und UPDATE-Anweisungen beeinflusst wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

NetworkServerTime

Gibt die kumulative Zeitspanne 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, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

Prepares

Gibt die Anzahl der über die Verbindung vorbereiteten Anweisungen zurück, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

SelectCount

Gibt die Anzahl von SELECT-Anweisungen zurück, die über die Verbindung ausgeführt wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat. Darin sind FETCH-Anweisungen zum Abrufen von Zeilen von Cursors enthalten, und die Anzahl von SELECT-Anweisungen wird aktualisiert, wenn das Ende eines SqlDataReader erreicht wird.

SelectRows

Gibt die Anzahl der Zeilen zurück, die ausgewählt wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat. Dieser Zähler gibt alle Zeilen wieder, die durch SQL-Anweisungen erstellt wurden, darunter auch die, die vom Aufrufer nicht verarbeitet wurden. Das Schließen eines Datenreaders vor dem vollständigen Lesen des Ergebnisses beeinflusst z. B. die Zählung nicht. Dies gilt auch für Zeilen, die über FETCH-Anwendungen von Cursors abgerufen wurden.

ServerRoundtrips

Gibt an, wie oft die Verbindung Befehle zum Server gesendet und eine Antwort erhalten hat, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

SumResultSets

Gibt die Anzahl der verwendeten Resultsets zurück, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat. Dies umfasst z. B. Resultsets, die zum Client zurückgegeben wurden. Für Cursors wird jede "fetch"- oder "block-fetch"-Operation als unabhängiges Resultset behandelt.

Transactions

Gibt die Anzahl der gestarteten Benutzertransaktionen (einschließlich Rollbacks) zurück, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat. Wenn eine Verbindung mit aktiviertem Autocommit ausgeführt wird, wird jeder Befehl als Transaktion behandelt.

Dieser Zähler erhöht die Transaktionszählung, sobald eine BEGIN TRAN-Anweisung ausgeführt wird, unabhängig davon, ob die Transaktion später gespeichert oder zurückgesetzt wird.

UnpreparedExecs

Gibt die Anzahl der nicht vorbereiteten Anweisungen zurück, die über die Verbindung ausgeführt wurden, seitdem die Anwendung den Anbieter verwendet und die Statistik aktiviert hat.

Abrufen eines Werts

Die folgende Konsolenanwendung zeigt, wie die Statistik für eine Verbindung aktiviert, vier einzelne statistischen Werte abgerufen und diese in das Konsolenfenster geschrieben werden.

HinweisHinweis

Im folgenden Beispiel wird die in SQL Server 2005 enthaltene AdventureWorks-Beispieldatenbank verwendet.Bei der im Beispielcode bereitgestellten Verbindungszeichenfolge wird angenommen, dass die Datenbank auf dem lokalen Computer installiert und verfügbar ist.Ändern Sie die Verbindungszeichenfolge entsprechend der Umgebung.

Option Strict On

Imports System
Imports System.Collections
Imports System.Data
Imports System.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 retrive it from a configuration file.
    Return "Data Source=localhost;Integrated Security=SSPI;" & _
      "Initial Catalog=AdventureWorks"
  End Function
End Module

[C#]

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.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 retrive it from a configuration file.
      return "Data Source=localhost;Integrated Security=SSPI;" + 
        "Initial Catalog=AdventureWorks";
    }
  }
}

Abrufen aller Werte

Die folgende Konsolenanwendung zeigt, wie die Statistik für eine Verbindung aktiviert, vier einzelne statistischen Werte abgerufen und diese in das Konsolenfenster geschrieben werden.

HinweisHinweis

Im folgenden Beispiel wird die in SQL Server 2005 enthaltene AdventureWorks-Beispieldatenbank verwendet.Bei der im Beispielcode bereitgestellten Verbindungszeichenfolge wird angenommen, dass die Datenbank auf dem lokalen Computer installiert und verfügbar ist.Ändern Sie die Verbindungszeichenfolge entsprechend der Umgebung.

Option Strict On

Imports System
Imports System.Collections
Imports System.Data
Imports System.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 retrive it from a configuration file.
    Return "Data Source=localhost;Integrated Security=SSPI;" & _
      "Initial Catalog=AdventureWorks"
  End Function
End Module
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.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 retrive it from a configuration file.
      return "Data Source=localhost;Integrated Security=SSPI;" + 
        "Initial Catalog=AdventureWorks";
    }
  }
}

Siehe auch

Weitere Ressourcen

SQL Server und ADO.NET