Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft. Data.SqlClient поддерживает статистику среды выполнения. Включите статистику, задав свойству StatisticsEnabled допустимого объекта SqlConnection значение True.
После включения статистики вызовите RetrieveStatistics для получения моментального снимка на определенный момент времени в объекте IDictionary. Перечислить его неупорядоченные пары "имя-значение", чтобы считывать счетчики. Чтобы сбросить счетчики, вызовите ResetStatistics.
Если статистика не включена, RetrieveStatistics возвращает начальное значение каждого счетчика, не вызывая исключения. После отключения статистики счетчики сохраняют значения, собранные до этой точки.
Все статистические значения собираются отдельно для каждого подключения.
Доступные статистические значения
Поставщик Microsoft SQL Server предоставляет 18 статистических значений. Прочитайте свойство Count словаря, чтобы получить количество доступных записей. Все счетчики используют Int64, 64-разрядный тип, названный long в C# и Long в Visual Basic.
Максимальное значение, Int64.MaxValueравно (2^63)-1. На этом пределе счетчики больше не являются точными. Поэтому наибольшим допустимым значением для статистики является Int64.MaxValue - 1, или (2^63)-2.
Примечание.
Словарь используется для возврата статистики поставщика, так как число, имена и порядок возвращаемой статистики могут измениться в будущем. Приложения не должны полагаться на наличие конкретного значения в словаре, но должны проверять, присутствует ли значение, и действовать соответственно.
В следующей таблице описываются доступные статистические значения. Имена ключей для отдельных значений не локализованы в региональных версиях платформа .NET Framework.
| Имя ключа | Описание |
|---|---|
BuffersReceived |
Возвращает число пакетов потока табличных данных (TDS), полученных поставщиком из SQL Server после начала использования приложением поставщика и включения статистики. |
BuffersSent |
Возвращает число пакетов TDS, отправленных в SQL Server поставщиком после включения статистики. Для больших команд может потребоваться несколько буферов. Например, если на сервер отправляется большая команда и требуется шесть пакетов, ServerRoundtrips увеличивается на единицу, а BuffersSent — на шесть. |
BytesReceived |
Возвращает число байтов данных в пакетах TDS, полученных поставщиком от SQL Server после начала использования приложением поставщика и включения статистики. |
BytesSent |
Возвращает число байтов данных, отправленных в SQL Server в пакетах TDS после начала использования приложением поставщика и включения статистики. |
ConnectionTime |
Время в миллисекундах, в течение которого было открыто соединение после включения статистики (или полное время соединения, если статистика была включена до открытия соединения). |
CursorOpens |
Возвращает количество раз, когда курсор открывался через подключение после того, как приложение начало использовать поставщика и включило статистику. Обратите внимание, что результаты только для чтения и только прямого чтения, возвращаемые операторами SELECT, не считаются курсорами и поэтому не влияют на этот счетчик. |
ExecutionTime |
Возвращает совокупное количество времени в миллисекундах, которое поставщик потратил на обработку после включения статистики, с учетом того времени, которое потрачено на ожидание ответов от сервера, а также времени, потраченного на выполнение кода самим поставщиком. К классам, включающим код времени, относятся: SqlConnectionSqlCommandSqlDataReaderSqlDataAdapterSqlTransactionSqlCommandBuilderЧтобы критические для производительности элементы были максимально мелкими, для следующих элементов не фиксируется время: SqlDataReaderthis[] оператор (все перегрузки)GetBooleanGetCharGetDateTimeGetDecimalGetDoubleGetFloatGetGuidGetInt16GetInt32GetInt64GetNameGetOrdinalGetSqlBinaryGetSqlBooleanGetSqlByteGetSqlDateTimeGetSqlDecimalGetSqlDoubleGetSqlGuidGetSqlInt16GetSqlInt32GetSqlInt64GetSqlMoneyGetSqlSingleGetSqlStringGetStringIsDBNull |
IduCount |
Возвращает общее число операторов INSERT, DELETE и UPDATE, выполненных в данном подключении после того, как приложение начало использовать поставщик и включило сбор статистики. |
IduRows |
Возвращает общее количество строк, затронутых операторами INSERT, DELETE и UPDATE, выполненными через соединение после того, как приложение начало использовать поставщик и включило сбор статистики. |
NetworkServerTime |
Возвращает совокупное количество времени в миллисекундах, которое поставщик потратил на ожидание ответов от сервера после начала использования приложением поставщика и включения статистики. |
PreparedExecs |
Возвращает число подготовленных команд, выполненных через подключение после начала использования приложением поставщика и включения статистики. |
Prepares |
Возвращает число инструкций, подготовленных через подключение после начала использования приложением поставщика и включения статистики. |
SelectCount |
Возвращает количество инструкций, выполненных SELECT через подключение после того, как приложение включило сбор статистики. Включает FETCH инструкции, которые извлекают строки из курсоров. Для инструкций SELECT поставщик обновляет количество, когда SqlDataReader достигает конца результатов. |
SelectRows |
Возвращает число строк, выбранных после начала использования приложением поставщика и включения статистики. Этот счетчик отражает все строки, формируемые инструкциями SQL, даже те, которые фактически не использовались вызывающим объектом. Например, закрытие читателя данных до считывания всего результирующего набора не повлияет на число. К ним относятся строки, полученные из курсоров с помощью операторов FETCH. |
ServerRoundtrips |
Возвращает число раз, когда подключение отправило команды серверу и получило ответ после того, как приложение начало использовать провайдера и включило статистику. |
SumResultSets |
Возвращает количество результирующих наборов, которые применялись после начала использования приложением поставщика и включения статистики. Например, это может быть любой результирующий набор, возвращаемый клиенту. Для курсоров каждая операция извлечения данных или пакетного получения рассматривается как отдельный независимый результирующий набор. |
Transactions |
Возвращает количество пользовательских транзакций, которые начались после того, как приложение начало использовать данного поставщика и включило сбор статистики, включая откаты. Если подключение работает с включенной автоматической фиксацией, каждая команда рассматривается как транзакция. Этот счетчик увеличивает число транзакций, как только выполняется инструкция BEGIN TRAN, независимо от того, фиксируется ли транзакция или откатывается позже. |
UnpreparedExecs |
Возвращает количество неподготовленных инструкций, выполненных через подключение после того, как приложение начало использовать поставщика и включило статистику. |
Получение значения
В следующем консольном приложении показано, как включить статистику для подключения, получить четыре отдельных статистических значения и записать их в окно консоли.
Примечание.
В следующем примере используется пример AdventureWorks базы данных, включенной в SQL Server. В строке подключения в примере кода предполагается, что база данных установлена и доступна на локальном компьютере. При необходимости измените строку подключения для вашей среды.
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 "...";
}
}
}
Получение всех значений
В следующем консольном приложении показано, как включить статистику для подключения, получить все доступные статистические значения с помощью перечислителя и записать их в окно консоли.
Примечание.
В следующем примере используется пример AdventureWorks базы данных, включенной в SQL Server. В строке подключения в примере кода предполагается, что база данных установлена и доступна на локальном компьютере. При необходимости измените строку подключения для вашей среды.
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 "...";
}
}
}