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 tillgängliga statistiska värden. Nyckelnamnen för de enskilda värdena lokaliseras inte i regionala versioner av .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: SqlConnection 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 "..."
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 "...";
}
}
}
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 "..."
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 "...";
}
}
}