Поделиться через


Статистика поставщика для SQL Server (ADO.NET)

Начиная с .NET Framework 2.0, поставщик данных .NET Framework для SQL Server поддерживает получение статистики во время выполнения. После создания допустимого объекта соединения необходимо включить статистику путем присвоения свойству StatisticsEnabled объекта SqlConnection значения True. После включения статистики ее можно просмотреть в виде «моментального снимка во времени» путем получения ссылки IDictionary через метод RetrieveStatistics объекта SqlConnection. Для обработки списка может использоваться набор элементов словаря, представленных в виде пар «имя/значение». Эти пары «имя/значение» являются неупорядоченными. Для сброса счетчиков можно в любое время вызвать метод ResetStatistics объекта SqlConnection. Если сбор статистики не был включен, исключение не формируется. Кроме того, если RetrieveStatistics вызывается перед вызовом StatisticsEnabled, полученные значения являются первоначальными для каждой записи. Если статистика включена, запустите приложение и через некоторое время отключите статистику. Полученные значения будут отражать значения, собранные до момента отключения статистики. Все собранные статистические значения относятся к конкретному соединению.

Доступные статистические значения

На данный момент существует 18 различных элементов, доступ к которым предоставляется поставщиком Microsoft SQL Server. Доступ к множеству элементов производится через свойство Count ссылки интерфейса IDictionary, возвращенной RetrieveStatistics. Для всех счетчиков статистики поставщика используется тип среды CLR Int64 (long в C# и Visual Basic) с внутренним представлением длиной 64 бита. Максимальное значение типа данных int64, определенное полем nt64.MaxValue, равно ((2^63)-1)). После достижения значениями счетчиков этого максимального значения их больше нельзя считать точными. Это означает, что int64.MaxValue-1 ((2^63)-2) по существу является максимальным действительным значением любого статистического показателя.

ПримечаниеПримечание

Для возврата статистики поставщика используется словарь, поскольку количество, имена и последовательность возвращаемых статистических данных в будущем может измениться.Функционирование приложений не должно зависеть от того, будет ли найдено в словаре какое-то определенное значение; вместо этого следует проверять наличие значения и с учетом результатов этой проверки переходить в ту или иную часть приложения.

В следующей таблице описаны доступные текущие статистические значения. Обратите внимание, что имена ключей для отдельных значений в региональных версиях Microsoft .NET Framework не локализованы.

Имя ключа

Описание

BuffersReceived

Возвращает число пакетов TDS, полученных поставщиком от SQL Server после начала использования приложением поставщика и включения статистики.

BuffersSent

Возвращает число пакетов TDS, отправленных на SQL Server поставщиком после включения статистики. Для больших по размеру команд может потребоваться несколько буферов. Например, если на сервер отправляется команда, состоящая из большого объема текста, и для ее передачи требуется шесть пакетов, то значение ServerRoundtrips увеличивается на единицу, а значение BuffersSent — на шесть.

BytesReceived

Возвращает число байтов данных в пакетах TDS, полученных поставщиком от SQL Server после начала использования приложением поставщика и включения статистики.

BytesSent

Возвращает число байтов данных, отправленных на SQL Server в пакетах TDS после начала использования приложением поставщика и включения статистики.

ConnectionTime

Время, в течение которого было открыто соединение после включения статистики (или полное время соединения, если статистика была включена до открытия соединения).

CursorOpens

Возвращает число операций открытия курсора в соединении после начала использования приложением поставщика и включения статистики.

Обратите внимание, что однопроходные результаты только для чтения, возвращаемые инструкциями SELECT, не рассматриваются как курсоры, поэтому не влияют на значение этого счетчика.

ExecutionTime

Возвращает совокупное количество времени, которое поставщик потратил на обработку после включения статистики, с учетом того времени, которое потрачено на ожидание ответов от сервера, а также времени, потраченного на выполнение кода самим поставщиком.

Код учета времени входит в следующие классы:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Для следующих членов учет времени не предусмотрен, что позволяет свести к минимуму число членов, функционирование которых может быть нарушено в условиях низкой производительности:

SqlDataReader

оператор this[] (все перегруженные варианты)

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

Возвращает общее число инструкций 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 2005.Представленная в образце кода строка соединения предполагает, что база данных установлена и доступна на локальном компьютере.Измените строку соединения при необходимости в соответствии с вашей средой.

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 retrive it from a configuration file.
    Return "Data Source=localhost;Integrated Security=SSPI;" & _
      "Initial Catalog=AdventureWorks"
  End Function
End Module

[C#]

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 retrive it from a configuration file.
      return "Data Source=localhost;Integrated Security=SSPI;" + 
        "Initial Catalog=AdventureWorks";
    }
  }
}

Получение всех значений

Следующее приложение командной строки показывает включение статистики при соединении, получение всех доступных статистических значений с помощью перечислителя и их запись в окно консоли.

ПримечаниеПримечание

В следующем примере используется образец базы данных AdventureWorks, входящий в состав SQL Server 2005.Представленная в образце кода строка соединения предполагает, что база данных установлена и доступна на локальном компьютере.Измените строку соединения при необходимости в соответствии с вашей средой.

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 retrive it from a configuration file.
    Return "Data Source=localhost;Integrated Security=SSPI;" & _
      "Initial Catalog=AdventureWorks"
  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 retrive it from a configuration file.
      return "Data Source=localhost;Integrated Security=SSPI;" + 
        "Initial Catalog=AdventureWorks";
    }
  }
}

См. также

Другие ресурсы

SQL Server и ADO.NET