Udostępnij za pośrednictwem


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

Zobacz też