Język

Statystyki dostawcy dla programu SQL Server

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:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Aby zachować możliwie najmniejsze elementy o krytycznym znaczeniu dla wydajności, następujące elementy nie są mierzone czasowo:

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, 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 "...";
    }
  }
}

Zobacz też