Statistika zprostředkovatele pro SQL Server
Počínaje rozhraním .NET Framework verze 2.0 podporuje rozhraní .NET Framework Zprostředkovatel dat pro SQL Server statistiky za běhu. Statistiky je nutné povolit nastavením StatisticsEnabled vlastnosti objektu SqlConnection po True
vytvoření platného objektu připojení.
Jakmile jsou statistiky povolené, můžete je zkontrolovat jako "snímek v čase" načtením IDictionary odkazu prostřednictvím RetrieveStatistics metody objektu SqlConnection . Seznam provedete výčet jako sadu položek slovníku páru název/hodnota. Tyto páry název/hodnota nejsou seřazené. Kdykoli můžete volat metodu ResetStatistics objektu SqlConnection pro resetování čítačů.
Pokud shromažďování statistik není povolené, nevygeneruje se výjimka. Kromě toho, pokud RetrieveStatistics je volána bez StatisticsEnabled zavolání první, načtené hodnoty jsou počáteční hodnoty pro každou položku. Pokud povolíte statistiky, nějakou dobu spustíte aplikaci a pak zakážete statistiky, načtené hodnoty budou odrážet hodnoty shromážděné až do bodu, kdy byly statistiky zakázány.
Všechny shromážděné statistické hodnoty jsou založené na jednotlivých připojeních.
Dostupné statistické hodnoty
V současné době je od poskytovatele Microsoft SQL Serveru k dispozici 18 různých položek. Počet dostupných položek lze získat přístup prostřednictvím vlastnosti IDictionary Count odkazu rozhraní vráceného RetrieveStatistics. Všechny čítače pro statistiky zprostředkovatele používají typ modulu CLR Int64 (dlouhý v jazyce C# a Visual Basic), který je široký 64 bitů. Maximální hodnota datového typu int64 definovaná int64 . Pole MaxValue , je ((2^63)-1)). Pokud hodnoty čítačů dosáhnou této maximální hodnoty, neměly by se už považovat za přesné. To znamená, že int64. MaxValue-1((2^63)-2) je v podstatě největší platná hodnota pro jakoukoli statistiku.
Poznámka:
Slovník se používá k vrácení statistiky poskytovatele, protože počet, názvy a pořadí vrácených statistik se mohou v budoucnu změnit. Aplikace by se neměly spoléhat na konkrétní hodnotu, která se nachází ve slovníku, ale měla by místo toho zkontrolovat, jestli hodnota existuje, a odpovídajícím způsobem větev.
Následující tabulka popisuje dostupné statistické hodnoty. Názvy klíčů pro jednotlivé hodnoty nejsou lokalizovány napříč regionálními verzemi rozhraní .NET Framework.
Název klíče | Popis |
---|---|
BuffersReceived |
Vrátí počet paketů TDS (tabulkových datových proudů) přijatých poskytovatelem z SQL Serveru po spuštění aplikace pomocí zprostředkovatele a povolí statistiky. |
BuffersSent |
Vrátí počet paketů TDS odesílaných na SQL Server poskytovatelem po povolení statistiky. Velké příkazy můžou vyžadovat více vyrovnávacích pamětí. Pokud je například na server odeslán velký příkaz a vyžaduje šest paketů, ServerRoundtrips zvýší se o jeden a BuffersSent zvýší se o šest. |
BytesReceived |
Vrátí počet bajtů dat v paketech TDS přijatých poskytovatelem z SQL Serveru, jakmile aplikace začne používat zprostředkovatele a povolí statistiky. |
BytesSent |
Vrátí počet bajtů dat odesílaných na SQL Server v paketech TDS po spuštění aplikace pomocí zprostředkovatele a povolí statistiky. |
ConnectionTime |
Doba otevření připojení (v milisekundách), po povolení statistiky (celková doba připojení, pokud byla před otevřením připojení povolena statistika). |
CursorOpens |
Vrátí počet otevření kurzoru přes připojení, jakmile aplikace začne používat poskytovatele a povolila statistiky. Všimněte si, že výsledky jen pro čtení a předávání vrácené příkazy SELECT nejsou považovány za kurzory, a proto nemají vliv na tento čítač. |
ExecutionTime |
Vrátí kumulativní dobu (v milisekundách), kterou poskytovatel strávil zpracováním, jakmile je povolená statistika, včetně času stráveného čekáním na odpovědi ze serveru a času stráveného spuštěním kódu v samotném poskytovateli. Třídy, které zahrnují kód časování, jsou: SqlConnection SqlCommand SqlDataReader SqlDataAdapter SqlTransaction SqlCommandBuilder Aby byl výkon kritických členů co nejmenší, následující členové nejsou načasovány: SqlDataReader this[] – operátor (všechna přetížení) 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 |
Vrátí celkový počet příkazů INSERT, DELETE a UPDATE spuštěných prostřednictvím připojení, jakmile aplikace začne používat zprostředkovatele a povolí statistiky. |
IduRows |
Vrátí celkový počet řádků ovlivněných příkazy INSERT, DELETE a UPDATE provedené prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky. |
NetworkServerTime |
Vrátí kumulativní dobu (v milisekundách), kterou poskytovatel strávil čekáním na odpovědi ze serveru, jakmile aplikace začne používat poskytovatele a povolila statistiky. |
PreparedExecs |
Vrátí počet připravených příkazů spuštěných prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky. |
Prepares |
Vrátí počet příkazů připravených prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky. |
SelectCount |
Vrátí počet příkazů SELECT spuštěných prostřednictvím připojení, jakmile aplikace začne používat zprostředkovatele a povolí statistiky. To zahrnuje příkazy FETCH pro načtení řádků z kurzorů a počet příkazů SELECT se aktualizuje při dosažení konce SqlDataReader příkazu. |
SelectRows |
Vrátí počet řádků vybraných po spuštění aplikace pomocí zprostředkovatele a povolí statistiky. Tento čítač odráží všechny řádky vygenerované příkazy SQL, i ty, které volající ve skutečnosti nespotřebovávaly. Zavření čtečky dat před přečtením celé sady výsledků by například nemělo vliv na počet. To zahrnuje řádky načtené z kurzorů prostřednictvím příkazů FETCH. |
ServerRoundtrips |
Vrátí počet odeslaných příkazů připojení k serveru a odpověď se vrátí, jakmile aplikace začne používat poskytovatele a povolí statistiku. |
SumResultSets |
Vrátí počet sad výsledků, které se použily, jakmile aplikace začne používat zprostředkovatele, a povolí statistiky. To by například zahrnovalo jakoukoli sadu výsledků vrácenou klientovi. U kurzorů se každá operace načtení nebo blokového načtení považuje za nezávislou sadu výsledků. |
Transactions |
Vrátí počet uživatelských transakcí spuštěných po spuštění aplikace pomocí zprostředkovatele a má povolené statistiky, včetně vrácení zpět. Pokud je připojení spuštěné s automatickým potvrzením, každý příkaz se považuje za transakci. Tento čítač zvýší počet transakcí ihned po provedení příkazu BEGIN TRAN bez ohledu na to, zda je transakce potvrzena nebo vrácena zpět později. |
UnpreparedExecs |
Vrátí počet nepreparovaných příkazů spuštěných prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky. |
Načtení hodnoty
Následující konzolová aplikace ukazuje, jak povolit statistiky připojení, načíst čtyři jednotlivé statistické hodnoty a zapisovat je do okna konzoly.
Poznámka:
Následující příklad používá ukázkovou databázi AdventureWorks , která je součástí SQL Serveru. Připojovací řetězec poskytnuté v ukázkovém kódu předpokládá, že je databáze nainstalovaná a dostupná v místním počítači. Upravte připojovací řetězec podle potřeby pro vaše prostředí.
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 "...";
}
}
}
Načítání všech hodnot
Následující konzolová aplikace ukazuje, jak povolit statistiky připojení, načíst všechny dostupné statistické hodnoty pomocí enumerátoru a zapisovat je do okna konzoly.
Poznámka:
Následující příklad používá ukázkovou databázi AdventureWorks , která je součástí SQL Serveru. Připojovací řetězec poskytnuté v ukázkovém kódu předpokládá, že je databáze nainstalovaná a dostupná v místním počítači. Upravte připojovací řetězec podle potřeby pro vaše prostředí.
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 "...";
}
}
}