Statystyki dostawcy dla programu SQL Server
Począwszy od programu .NET Framework w wersji 2.0, program .NET Framework Dostawca danych dla programu SQL Server obsługuje statystyki czasu wykonywania. Należy włączyć statystyki, ustawiając StatisticsEnabled właściwość SqlConnection obiektu na True
wartość po utworzeniu prawidłowego obiektu połączenia.
Po włączeniu statystyk możesz przejrzeć je jako "migawkę w czasie", pobierając IDictionary odwołanie za pośrednictwem RetrieveStatistics metody SqlConnection obiektu. Lista jest wyliczana jako zestaw wpisów słownika par nazw/wartości. Te pary nazw/wartości nie są uporządkowane. W dowolnym momencie można wywołać metodę ResetStatistics SqlConnection obiektu, aby zresetować liczniki.
Jeśli zbieranie statystyk nie zostało włączone, wyjątek nie zostanie wygenerowany. Ponadto, jeśli RetrieveStatistics jest wywoływany bez StatisticsEnabled wywołania jako pierwszy, pobrane wartości są wartościami początkowymi dla każdego wpisu. Jeśli włączysz statystyki, uruchom aplikację przez jakiś czas, a następnie wyłączysz statystyki, pobrane wartości będą odzwierciedlać wartości zebrane do punktu, w którym statystyki zostały wyłączone.
Wszystkie zebrane wartości statystyczne są oparte na połączeniu.
Dostępne wartości statystyczne
Obecnie dostępnych jest 18 różnych elementów od dostawcy programu Microsoft SQL Server. Dostęp do liczby dostępnych elementów można uzyskać za pośrednictwem właściwości Count odwołania interfejsu IDictionary zwróconego przez RetrieveStatisticselement . Wszystkie liczniki statystyk dostawcy używają typu środowiska uruchomieniowego Int64 języka wspólnego (długie w językach C# i Visual Basic), który ma szerokość 64 bitów. Maksymalna wartość typu danych int64 zdefiniowana przez int64. Pole MaxValue to ((2^63)-1)). Gdy wartości liczników osiągną tę maksymalną wartość, nie powinny być już brane pod uwagę jako dokładne. Oznacza to, że int64. MaxValue-1((2^63)-2) jest skutecznie największą prawidłową wartością dla każdej statystyki.
Uwaga
Słownik jest używany do zwracania statystyk dostawcy, ponieważ liczba, nazwy i kolejność zwróconych statystyk mogą ulec zmianie w przyszłości. Aplikacje nie powinny polegać na określonej wartości znalezionej w słowniku, ale zamiast tego należy sprawdzić, czy wartość istnieje i odpowiednio rozgałęzić.
W poniższej tabeli opisano dostępne wartości statystyczne. Nazwy kluczy poszczególnych wartości nie są zlokalizowane w regionalnych wersjach programu .NET Framework.
Nazwa klucza | opis |
---|---|
BuffersReceived |
Zwraca liczbę pakietów strumienia danych tabelarycznych (TDS) odebranych przez dostawcę z programu SQL Server po rozpoczęciu korzystania z dostawcy i włączeniu statystyk przez aplikację. |
BuffersSent |
Zwraca liczbę pakietów TDS wysyłanych do programu SQL Server przez dostawcę po włączeniu statystyk. Duże polecenia mogą wymagać wielu. Jeśli na przykład do serwera jest wysyłane duże polecenie i wymaga sześciu pakietów, ServerRoundtrips zwiększa się o jeden i BuffersSent zwiększa się o sześć. |
BytesReceived |
Zwraca liczbę bajtów danych w pakietach TDS odebranych przez dostawcę z programu SQL Server po rozpoczęciu korzystania z dostawcy i włączeniu statystyk. |
BytesSent |
Zwraca liczbę bajtów danych wysyłanych do programu SQL Server w pakietach TDS po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. |
ConnectionTime |
Czas (w milisekundach), który został otwarty po włączeniu statystyk (łączny czas połączenia, jeśli statystyki zostały włączone przed otwarciem połączenia). |
CursorOpens |
Zwraca liczbę otwartych kursorów za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. Należy pamiętać, że wyniki tylko do odczytu/przesyłania dalej zwracane przez instrukcje SELECT nie są traktowane jako kursory, dlatego nie mają wpływu na ten licznik. |
ExecutionTime |
Zwraca skumulowany czas (w milisekundach), który dostawca spędził na przetwarzaniu po włączeniu statystyk, w tym czas spędzony na czekaniu na odpowiedzi z serwera, a także czas spędzony na wykonywaniu kodu w samym dostawcy. Klasy, które zawierają kod chronometrażu, to: SqlConnection SqlCommand SqlDataReader SqlDataAdapter SqlTransaction SqlCommandBuilder Aby zachować możliwie najmniejsze elementy członkowskie o krytycznym znaczeniu dla wydajności, następujące elementy członkowskie nie są upłynął limit czasu: SqlDataReader this[] operator (wszystkie przeciążenia) 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 |
Zwraca łączną liczbę instrukcji INSERT, DELETE i UPDATE wykonywanych za pośrednictwem połączenia, gdy aplikacja zaczęła korzystać z dostawcy i włączyła statystyki. |
IduRows |
Zwraca łączną liczbę wierszy, na które mają wpływ instrukcje INSERT, DELETE i UPDATE wykonywane za pośrednictwem połączenia, gdy aplikacja zaczęła korzystać z dostawcy i włączyła statystyki. |
NetworkServerTime |
Zwraca skumulowany czas (w milisekundach), przez który dostawca czekał na odpowiedzi z serwera po rozpoczęciu korzystania z dostawcy przez aplikację i włączył statystyki. |
PreparedExecs |
Zwraca liczbę przygotowanych poleceń wykonywanych za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. |
Prepares |
Zwraca liczbę instrukcji przygotowanych za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. |
SelectCount |
Zwraca liczbę instrukcji SELECT wykonanych za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. Obejmuje to instrukcje FETCH służące do pobierania wierszy z kursorów, a liczba instrukcji SELECT jest aktualizowana po osiągnięciu końca elementu SqlDataReader . |
SelectRows |
Zwraca liczbę wierszy wybranych po rozpoczęciu korzystania z dostawcy przez aplikację i ma włączone statystyki. Ten licznik odzwierciedla wszystkie wiersze wygenerowane przez instrukcje SQL, nawet te, które nie były rzeczywiście używane przez obiekt wywołujący. Na przykład zamknięcie czytnika danych przed odczytaniem całego zestawu wyników nie wpłynie na liczbę. Obejmuje to wiersze pobierane z kursorów za pomocą instrukcji FETCH. |
ServerRoundtrips |
Zwraca liczbę razy, gdy połączenie wysłało polecenia do serwera i otrzymało odpowiedź zwrotną po rozpoczęciu korzystania z dostawcy przez aplikację i włączono statystyki. |
SumResultSets |
Zwraca liczbę zestawów wyników, które zostały użyte po rozpoczęciu korzystania z dostawcy przez aplikację i ma włączone statystyki. Na przykład obejmuje to dowolny zestaw wyników zwrócony klientowi. W przypadku kursorów każda operacja pobierania lub pobierania bloków jest uznawana za niezależny zestaw wyników. |
Transactions |
Zwraca liczbę transakcji użytkownika uruchomionych po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk, w tym wycofywania. Jeśli połączenie jest uruchomione z automatycznym zatwierdzaniem, każde polecenie jest uznawane za transakcję. Ten licznik zwiększa liczbę transakcji natychmiast po wykonaniu instrukcji BEGIN TRAN, niezależnie od tego, czy transakcja została zatwierdzona, czy wycofana później. |
UnpreparedExecs |
Zwraca liczbę nieprzygotowanych instrukcji wykonanych za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. |
Pobieranie wartości
Poniższa aplikacja konsolowa pokazuje, jak włączyć statystyki dotyczące połączenia, pobrać cztery poszczególne wartości statystyk i zapisać je w oknie konsoli.
Uwaga
W poniższym przykładzie użyto przykładowej bazy danych AdventureWorks dołączonej do programu SQL Server. Parametry połączenia podany w przykładowym kodzie zakłada, że baza danych jest zainstalowana i dostępna na komputerze lokalnym. Zmodyfikuj parametry połączenia zgodnie z potrzebami dla środowiska.
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 "...";
}
}
}
Pobieranie wszystkich wartości
Poniższa aplikacja konsolowa pokazuje, jak włączyć statystyki dotyczące połączenia, pobrać wszystkie dostępne wartości statystyk przy użyciu modułu wyliczającego i zapisać je w oknie konsoli.
Uwaga
W poniższym przykładzie użyto przykładowej bazy danych AdventureWorks dołączonej do programu SQL Server. Parametry połączenia podany w przykładowym kodzie zakłada, że baza danych jest zainstalowana i dostępna na komputerze lokalnym. Zmodyfikuj parametry połączenia zgodnie z potrzebami dla środowiska.
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 "...";
}
}
}