Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Microsoft.Data.SqlClient obsługuje statystyki czasu wykonywania. Włącz statystyki, ustawiając właściwość StatisticsEnabled prawidłowego obiektu SqlConnection na True.
Po włączeniu statystyk wywołaj IDictionary, aby uzyskać migawkę stanu z danego momentu w obiekcie RetrieveStatistics. Wylicz jego nieuporządkowane pary nazwa/wartość w celu odczytania liczników. Aby zresetować liczniki, wywołaj metodę ResetStatistics.
Jeśli nie włączono statystyk, RetrieveStatistics zwraca początkową wartość każdego licznika, nie zgłaszając wyjątku. Po wyłączeniu statystyk liczniki zachowują wartości zebrane do tego momentu.
Wszystkie zebrane wartości statystyczne są oparte na podstawie każdego połączenia.
Dostępne wartości statystyczne
Dostawca Microsoft SQL Server udostępnia 18 wartości statystycznych. Przeczytaj właściwość słownika Count , aby uzyskać liczbę dostępnych wpisów. Wszystkie liczniki używają Int64, 64-bitowego typu o nazwie long w języku C# i Long w Visual Basic.
Maksymalna wartość, Int64.MaxValue, to (2^63)-1. Po osiągnięciu tego limitu liczniki nie są już dokładne. Największą prawidłową wartością statystyki jest zatem Int64.MaxValue - 1, lub (2^63)-2.
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 buforów. 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), przez jaki połączenie było otwarte po włączeniu statystyk (całkowity 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/tylko do przewijania do przodu 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: SqlConnectionSqlCommandSqlDataReaderSqlDataAdapterSqlTransactionSqlCommandBuilderAby zachować możliwie najmniejsze elementy o krytycznym znaczeniu dla wydajności, następujące elementy nie są mierzone czasowo: SqlDataReaderthis[] operator (wszystkie przeciążenia)GetBooleanGetCharGetDateTimeGetDecimalGetDoubleGetFloatGetGuidGetInt16GetInt32GetInt64GetNameGetOrdinalGetSqlBinaryGetSqlBooleanGetSqlByteGetSqlDateTimeGetSqlDecimalGetSqlDoubleGetSqlGuidGetSqlInt16GetSqlInt32GetSqlInt64GetSqlMoneyGetSqlSingleGetSqlStringGetStringIsDBNull |
IduCount |
Zwraca łączną liczbę instrukcji INSERT, DELETEi UPDATE wykonywanych za pośrednictwem połączenia po rozpoczęciu korzystania z dostawcy przez aplikację i włączeniu statystyk. |
IduRows |
Zwraca łączną liczbę wierszy, których dotyczą instrukcje INSERT, DELETE i UPDATE wykonane za pośrednictwem połączenia, od momentu 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, gdy aplikacja zaczyna używać dostawcy i włącza statystyki. |
SelectCount |
Zwraca liczbę SELECT instrukcji wykonanych za pośrednictwem połączenia po włączeniu statystyk przez aplikację. Zawiera FETCH instrukcje pobierające wiersze z kursorów. W przypadku SELECT instrukcji dostawca aktualizuje liczbę, gdy SqlDataReader dotrze do końca wyników. |
SelectRows |
Zwraca liczbę wierszy wybranych, gdy aplikacja rozpocznie używanie dostawcy i włączy 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 zaraz po BEGIN TRAN wykonaniu instrukcji, 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 AdventureWorks bazy danych 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 łańcuch połączenia zgodnie z potrzebami środowiska.
Option Strict On
Imports System
Imports System.Collections
Imports System.Data
Imports Microsoft.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 Microsoft.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 AdventureWorks bazy danych 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 łańcuch połączenia zgodnie z potrzebami środowiska.
Option Strict On
Imports System
Imports System.Collections
Imports System.Data
Imports Microsoft.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 Microsoft.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 "...";
}
}
}