Delen via


Providerstatistieken voor SQL Server

Vanaf .NET Framework versie 2.0 ondersteunt de .NET Framework-gegevensprovider voor SQL Server runtimestatistieken. U moet statistieken inschakelen door de StatisticsEnabled eigenschap van het SqlConnection object in te True stellen op nadat u een geldig verbindingsobject hebt gemaakt.

Nadat statistieken zijn ingeschakeld, kunt u deze controleren als een momentopname in de tijd door een IDictionary verwijzing op te halen via de RetrieveStatistics methode van het SqlConnection object. U inventariseert de lijst als een set woordenlijstvermeldingen voor naam/waardepaar. Deze naam-/waardeparen zijn niet gerangschikt. U kunt de ResetStatistics methode van het SqlConnection object op elk gewenst moment aanroepen om de tellers opnieuw in te stellen.

Als statistische verzameling niet is ingeschakeld, wordt er geen uitzondering gegenereerd. Bovendien zijn de opgehaalde waarden de initiële waarden voor elke vermelding als RetrieveStatistics deze worden aangeroepen zonder StatisticsEnabled dat ze eerst zijn aangeroepen. Als u statistieken inschakelt, voert u uw toepassing een tijdje uit en schakelt u vervolgens statistieken uit, worden de opgehaalde waarden weergegeven tot het punt waarop statistieken zijn uitgeschakeld.

Alle statistische waarden die worden verzameld, zijn per verbinding.

Beschikbare statistische waarden

Er zijn momenteel 18 verschillende items beschikbaar van de Microsoft SQL Server-provider. Het aantal beschikbare items kan worden geopend via de eigenschap Count van de IDictionary interface-verwijzing die wordt geretourneerd door RetrieveStatistics. Alle tellers voor providerstatistieken maken gebruik van het algemene type taalruntime Int64 (lang in C# en Visual Basic), wat 64 bits breed is. De maximumwaarde van het gegevenstype int64 , zoals gedefinieerd door de int64. Het veld MaxValue is ((2^63)-1).) Wanneer de waarden voor de tellers deze maximumwaarde bereiken, moeten ze niet langer als nauwkeurig worden beschouwd. Dit betekent dat int64. MaxValue-1((2^63)-2) is in feite de grootste geldige waarde voor elke statistiek.

Notitie

Een woordenlijst wordt gebruikt voor het retourneren van providerstatistieken, omdat het aantal, de namen en de volgorde van de geretourneerde statistieken in de toekomst kunnen veranderen. Toepassingen moeten niet afhankelijk zijn van een specifieke waarde die wordt gevonden in de woordenlijst, maar moeten in plaats daarvan controleren of de waarde er is en dienovereenkomstig vertakkingen hebben.

In de volgende tabel worden de beschikbare statistische waarden beschreven. De sleutelnamen voor de afzonderlijke waarden worden niet gelokaliseerd in regionale versies van .NET Framework.

Sleutelnaam Beschrijving
BuffersReceived Retourneert het aantal TDS-pakketten (tabular data stream) dat is ontvangen door de provider van SQL Server nadat de toepassing is begonnen met het gebruik van de provider en statistieken heeft ingeschakeld.
BuffersSent Retourneert het aantal TDS-pakketten dat door de provider naar SQL Server wordt verzonden nadat statistieken zijn ingeschakeld. Grote opdrachten kunnen meerdere buffers vereisen. Als een grote opdracht bijvoorbeeld naar de server wordt verzonden en er zes pakketten nodig zijn, ServerRoundtrips wordt dit met één verhoogd en BuffersSent met zes verhoogd.
BytesReceived Retourneert het aantal bytes aan gegevens in de TDS-pakketten die door de provider van SQL Server zijn ontvangen zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld.
BytesSent Retourneert het aantal bytes aan gegevens dat is verzonden naar SQL Server in TDS-pakketten nadat de toepassing is begonnen met het gebruik van de provider en statistieken heeft ingeschakeld.
ConnectionTime De hoeveelheid tijd (in milliseconden) die de verbinding heeft geopend nadat de statistieken zijn ingeschakeld (totale verbindingstijd als statistieken zijn ingeschakeld voordat de verbinding werd geopend).
CursorOpens Retourneert het aantal keren dat een cursor is geopend via de verbinding zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld.

Houd er rekening mee dat alleen-lezen/alleen-doorstuurresultaten die door SELECT-instructies worden geretourneerd, niet als cursors worden beschouwd en dus niet van invloed zijn op deze teller.
ExecutionTime Retourneert de cumulatieve hoeveelheid tijd (in milliseconden) die de provider heeft besteed aan verwerking zodra statistieken zijn ingeschakeld, inclusief de tijd die is besteed aan het wachten op antwoorden van de server en de tijd die is besteed aan het uitvoeren van code in de provider zelf.

De klassen met timingcode zijn:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Om prestatiekritieke leden zo klein mogelijk te houden, worden de volgende leden niet getimed:

SqlDataReader

deze[] operator (alle overbelastingen)

Booleaanse waarde ophalen

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 Retourneert het totale aantal INSERT-, DELETE- en UPDATE-instructies die via de verbinding worden uitgevoerd zodra de toepassing is gestart met de provider en statistieken heeft ingeschakeld.
IduRows Retourneert het totale aantal rijen dat wordt beïnvloed door INSERT-, DELETE- en UPDATE-instructies die via de verbinding worden uitgevoerd zodra de toepassing is gestart met de provider en statistieken heeft ingeschakeld.
NetworkServerTime Retourneert de cumulatieve hoeveelheid tijd (in milliseconden) die de provider heeft besteed aan het wachten op antwoorden van de server zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld.
PreparedExecs Retourneert het aantal voorbereide opdrachten dat via de verbinding wordt uitgevoerd zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld.
Prepares Retourneert het aantal instructies dat is voorbereid via de verbinding zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld.
SelectCount Retourneert het aantal SELECT-instructies dat via de verbinding wordt uitgevoerd zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld. Dit omvat FETCH-instructies voor het ophalen van rijen van cursors en het aantal voor SELECT-instructies wordt bijgewerkt wanneer het einde van een instructie SqlDataReader is bereikt.
SelectRows Retourneert het aantal rijen dat is geselecteerd zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld. Deze teller weerspiegelt alle rijen die zijn gegenereerd door SQL-instructies, zelfs rijen die niet daadwerkelijk door de aanroeper zijn gebruikt. Als u bijvoorbeeld een gegevenslezer sluit voordat u de volledige resultatenset leest, heeft dit geen invloed op het aantal. Dit omvat de rijen die zijn opgehaald uit cursors via FETCH-instructies.
ServerRoundtrips Retourneert het aantal keren dat de verbinding opdrachten naar de server heeft verzonden en een antwoord heeft ontvangen zodra de toepassing is begonnen met het gebruik van de provider en statistieken heeft ingeschakeld.
SumResultSets Retourneert het aantal resultatensets dat is gebruikt nadat de toepassing is begonnen met het gebruik van de provider en statistieken heeft ingeschakeld. Dit omvat bijvoorbeeld een resultatenset die wordt geretourneerd aan de client. Voor cursors wordt elke ophaal- of blok-fetch-bewerking beschouwd als een onafhankelijke resultatenset.
Transactions Retourneert het aantal gebruikerstransacties dat is gestart zodra de toepassing de provider heeft gebruikt en statistieken heeft ingeschakeld, inclusief terugdraaiacties. Als een verbinding wordt uitgevoerd met automatisch doorvoeren, wordt elke opdracht beschouwd als een transactie.

Met deze teller wordt het aantal transacties verhoogd zodra een BEGIN TRAN-instructie wordt uitgevoerd, ongeacht of de transactie later wordt doorgevoerd of teruggedraaid.
UnpreparedExecs Retourneert het aantal niet-voorbereide instructies dat via de verbinding wordt uitgevoerd zodra de toepassing is begonnen met het gebruik van de provider en statistieken heeft ingeschakeld.

Een waarde ophalen

In de volgende consoletoepassing ziet u hoe u statistieken voor een verbinding inschakelt, vier afzonderlijke statistiekwaarden ophaalt en deze naar het consolevenster schrijft.

Notitie

In het volgende voorbeeld wordt de voorbeelddatabase AdventureWorks gebruikt die is opgenomen in SQL Server. Bij de verbindingsreeks in de voorbeeldcode wordt ervan uitgegaan dat de database is geïnstalleerd en beschikbaar is op de lokale computer. Wijzig de verbindingsreeks indien nodig voor uw omgeving.

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 retrieve it from a configuration file.
    Return "..."
  End Function
End Module
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 retrieve it from a configuration file.
      return "...";
    }
  }
}

Alle waarden ophalen

In de volgende consoletoepassing ziet u hoe u statistieken voor een verbinding inschakelt, alle beschikbare statistische waarden ophaalt met behulp van de enumerator en deze naar het consolevenster schrijft.

Notitie

In het volgende voorbeeld wordt de voorbeelddatabase AdventureWorks gebruikt die is opgenomen in SQL Server. Bij de verbindingsreeks in de voorbeeldcode wordt ervan uitgegaan dat de database is geïnstalleerd en beschikbaar is op de lokale computer. Wijzig de verbindingsreeks indien nodig voor uw omgeving.

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 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 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 retrieve it from a configuration file.
      return "...";
    }
  }
}

Zie ook