Dela via


Providerstatistik för SQL Server

Från och med .NET Framework version 2.0 stöder .NET Framework Data Provider för SQL Server körningsstatistik. Du måste aktivera statistik genom att ange StatisticsEnabled egenskapen för SqlConnection objektet till True när du har skapat ett giltigt anslutningsobjekt. När statistik har aktiverats kan du granska dem som en "ögonblicksbild i tid" genom att hämta en IDictionary referens via RetrieveStatistics -metoden för SqlConnection objektet. Du räknar upp listan som en uppsättning namn-/värdeparordlisteposter. Dessa namn/värdepar är osorterade. När som helst kan du anropa ResetStatistics -metoden för SqlConnection objektet för att återställa räknarna. Om statistikinsamling inte har aktiverats genereras inget undantag. Om RetrieveStatistics anropas utan StatisticsEnabled att ha anropats först är dessutom de värden som hämtas de första värdena för varje post. Om du aktiverar statistik kör du programmet ett tag och inaktiverar sedan statistik, värdena som hämtas återspeglar de värden som samlats in fram till den punkt där statistik inaktiverades. Alla statistiska värden som samlas in sker per anslutning.

Tillgängliga statistiska värden

För närvarande finns det 18 olika objekt tillgängliga från Microsoft SQL Server-providern. Antalet tillgängliga objekt kan nås via egenskapen Count för gränssnittsreferensen IDictionary som returneras av RetrieveStatistics. Alla räknare för providerstatistik använder den vanliga språkkörningstypen Int64 (lång i C# och Visual Basic), som är 64 bitar bred. Det maximala värdet för int64-datatypen , enligt definitionen i int64. MaxValue-fältet är ((2^63)-1)). När värdena för räknarna når det här maximala värdet bör de inte längre anses vara korrekta. Det innebär att int64. MaxValue-1((2^63)-2) är i praktiken det största giltiga värdet för all statistik.

Kommentar

En ordlista används för att returnera providerstatistik eftersom antalet, namnen och ordningen för den returnerade statistiken kan ändras i framtiden. Program bör inte förlita sig på att ett specifikt värde hittas i ordlistan, utan bör i stället kontrollera om värdet finns där och förgrenas därefter.

I följande tabell beskrivs de aktuella tillgängliga statistiska värdena. Observera att nyckelnamnen för de enskilda värdena inte är lokaliserade i regionala versioner av Microsoft .NET Framework.

Nyckelnamn beskrivning
BuffersReceived Returnerar antalet TDS-paket (Tabular Data Stream) som tas emot av providern från SQL Server när programmet har börjat använda providern och har aktiverat statistik.
BuffersSent Returnerar antalet TDS-paket som skickas till SQL Server av providern när statistik har aktiverats. Stora kommandon kan kräva flera buffertar. Om ett stort kommando till exempel skickas till servern och det kräver sex paket ökas ServerRoundtrips det med ett och BuffersSent ökas med sex.
BytesReceived Returnerar antalet byte med data i de TDS-paket som tas emot av providern från SQL Server när programmet har börjat använda providern och har aktiverat statistik.
BytesSent Returnerar antalet byte med data som skickas till SQL Server i TDS-paket när programmet har börjat använda providern och har aktiverat statistik.
ConnectionTime Den tid (i millisekunder) som anslutningen har öppnats efter att statistik har aktiverats (total anslutningstid om statistik aktiverades innan anslutningen öppnades).
CursorOpens Returnerar antalet gånger en markör var öppen via anslutningen när programmet har börjat använda providern och har aktiverat statistik.

Observera att skrivskyddade/endast framåtriktade resultat som returneras av SELECT-instruktioner inte betraktas som markörer och därför inte påverkar den här räknaren.
ExecutionTime Returnerar den kumulativa tid (i millisekunder) som providern har ägnat åt att bearbeta när statistiken har aktiverats, inklusive den tid som har lagts på att vänta på svar från servern samt den tid som ägnas åt att köra kod i själva providern.

Klasserna som innehåller tidskod är:

Sql Anslut ion

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

För att hålla prestandakritiska medlemmar så små som möjligt är följande medlemmar inte tidsberäknade:

SqlDataReader

den här[]-operatorn (alla överlagringar)

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 Returnerar det totala antalet INSERT-, DELETE- och UPDATE-instruktioner som körs via anslutningen när programmet har börjat använda providern och har aktiverat statistik.
IduRows Returnerar det totala antalet rader som påverkas av INSERT-, DELETE- och UPDATE-instruktioner som körs via anslutningen när programmet har börjat använda providern och har aktiverat statistik.
NetworkServerTime Returnerar den kumulativa tid (i millisekunder) som providern spenderade på att vänta på svar från servern när programmet har börjat använda providern och har aktiverat statistik.
PreparedExecs Returnerar antalet förberedda kommandon som körs via anslutningen när programmet har börjat använda providern och har aktiverat statistik.
Prepares Returnerar antalet instruktioner som förberetts via anslutningen när programmet har börjat använda providern och har aktiverat statistik.
SelectCount Returnerar antalet SELECT-instruktioner som körs via anslutningen när programmet har börjat använda providern och har aktiverat statistik. Detta inkluderar FETCH-instruktioner för att hämta rader från markörer, och antalet för SELECT-instruktioner uppdateras när slutet av en SqlDataReader har nåtts.
SelectRows Returnerar det antal rader som valts när programmet har börjat använda providern och har aktiverat statistik. Den här räknaren återspeglar alla rader som genereras av SQL-instruktioner, även de som inte faktiskt förbrukades av anroparen. Om du till exempel stänger en dataläsare innan du läser hela resultatuppsättningen påverkas inte antalet. Detta inkluderar de rader som hämtats från markörer via FETCH-instruktioner.
ServerRoundtrips Returnerar antalet gånger anslutningen skickade kommandon till servern och fick ett svar tillbaka när programmet har börjat använda providern och har aktiverat statistik.
SumResultSets Returnerar antalet resultatuppsättningar som har använts när programmet har börjat använda providern och har aktiverat statistik. Detta skulle till exempel innehålla alla resultatuppsättningar som returneras till klienten. För markörer betraktas varje hämtnings- eller blockhämtningsåtgärd som en oberoende resultatuppsättning.
Transactions Returnerar antalet användarinköp som startats när programmet har börjat använda providern och har aktiverat statistik, inklusive återställningar. Om en anslutning körs med automatisk incheckning på betraktas varje kommando som en transaktion.

Den här räknaren ökar transaktionsantalet så snart en BEGIN TRAN-instruktion körs, oavsett om transaktionen checkas in eller återställs senare.
UnpreparedExecs Returnerar antalet oförberedda instruktioner som körs via anslutningen när programmet har börjat använda providern och har aktiverat statistik.

Hämtar ett värde

Följande konsolprogram visar hur du aktiverar statistik på en anslutning, hämtar fyra enskilda statistikvärden och skriver ut dem till konsolfönstret.

Kommentar

I följande exempel används exempeldatabasen AdventureWorks som ingår i SQL Server. Den anslutningssträng som anges i exempelkoden förutsätter att databasen är installerad och tillgänglig på den lokala datorn. Ändra anslutningssträng efter behov för din miljö.

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 "Data Source=localhost;Integrated Security=SSPI;" & _  
      "Initial Catalog=AdventureWorks"  
  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 "Data Source=localhost;Integrated Security=SSPI;" +
        "Initial Catalog=AdventureWorks";  
    }  
  }  
}  

Hämtar alla värden

Följande konsolprogram visar hur du aktiverar statistik för en anslutning, hämtar alla tillgängliga statistikvärden med hjälp av uppräknaren och skriver dem till konsolfönstret.

Kommentar

I följande exempel används exempeldatabasen AdventureWorks som ingår i SQL Server. Den anslutningssträng som anges i exempelkoden förutsätter att databasen är installerad och tillgänglig på den lokala datorn. Ändra anslutningssträng efter behov för din miljö.

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

Se även