Sdílet prostřednictvím


Statistika zprostředkovatele pro SQL Server

Počínaje rozhraním .NET Framework verze 2.0 podporuje rozhraní .NET Framework Zprostředkovatel dat pro SQL Server statistiky za běhu. Statistiky je nutné povolit nastavením StatisticsEnabled vlastnosti objektu SqlConnection po True vytvoření platného objektu připojení.

Jakmile jsou statistiky povolené, můžete je zkontrolovat jako "snímek v čase" načtením IDictionary odkazu prostřednictvím RetrieveStatistics metody objektu SqlConnection . Seznam provedete výčet jako sadu položek slovníku páru název/hodnota. Tyto páry název/hodnota nejsou seřazené. Kdykoli můžete volat metodu ResetStatistics objektu SqlConnection pro resetování čítačů.

Pokud shromažďování statistik není povolené, nevygeneruje se výjimka. Kromě toho, pokud RetrieveStatistics je volána bez StatisticsEnabled zavolání první, načtené hodnoty jsou počáteční hodnoty pro každou položku. Pokud povolíte statistiky, nějakou dobu spustíte aplikaci a pak zakážete statistiky, načtené hodnoty budou odrážet hodnoty shromážděné až do bodu, kdy byly statistiky zakázány.

Všechny shromážděné statistické hodnoty jsou založené na jednotlivých připojeních.

Dostupné statistické hodnoty

V současné době je od poskytovatele Microsoft SQL Serveru k dispozici 18 různých položek. Počet dostupných položek lze získat přístup prostřednictvím vlastnosti IDictionary Count odkazu rozhraní vráceného RetrieveStatistics. Všechny čítače pro statistiky zprostředkovatele používají typ modulu CLR Int64 (dlouhý v jazyce C# a Visual Basic), který je široký 64 bitů. Maximální hodnota datového typu int64 definovaná int64 . Pole MaxValue , je ((2^63)-1)). Pokud hodnoty čítačů dosáhnou této maximální hodnoty, neměly by se už považovat za přesné. To znamená, že int64. MaxValue-1((2^63)-2) je v podstatě největší platná hodnota pro jakoukoli statistiku.

Poznámka:

Slovník se používá k vrácení statistiky poskytovatele, protože počet, názvy a pořadí vrácených statistik se mohou v budoucnu změnit. Aplikace by se neměly spoléhat na konkrétní hodnotu, která se nachází ve slovníku, ale měla by místo toho zkontrolovat, jestli hodnota existuje, a odpovídajícím způsobem větev.

Následující tabulka popisuje dostupné statistické hodnoty. Názvy klíčů pro jednotlivé hodnoty nejsou lokalizovány napříč regionálními verzemi rozhraní .NET Framework.

Název klíče Popis
BuffersReceived Vrátí počet paketů TDS (tabulkových datových proudů) přijatých poskytovatelem z SQL Serveru po spuštění aplikace pomocí zprostředkovatele a povolí statistiky.
BuffersSent Vrátí počet paketů TDS odesílaných na SQL Server poskytovatelem po povolení statistiky. Velké příkazy můžou vyžadovat více vyrovnávacích pamětí. Pokud je například na server odeslán velký příkaz a vyžaduje šest paketů, ServerRoundtrips zvýší se o jeden a BuffersSent zvýší se o šest.
BytesReceived Vrátí počet bajtů dat v paketech TDS přijatých poskytovatelem z SQL Serveru, jakmile aplikace začne používat zprostředkovatele a povolí statistiky.
BytesSent Vrátí počet bajtů dat odesílaných na SQL Server v paketech TDS po spuštění aplikace pomocí zprostředkovatele a povolí statistiky.
ConnectionTime Doba otevření připojení (v milisekundách), po povolení statistiky (celková doba připojení, pokud byla před otevřením připojení povolena statistika).
CursorOpens Vrátí počet otevření kurzoru přes připojení, jakmile aplikace začne používat poskytovatele a povolila statistiky.

Všimněte si, že výsledky jen pro čtení a předávání vrácené příkazy SELECT nejsou považovány za kurzory, a proto nemají vliv na tento čítač.
ExecutionTime Vrátí kumulativní dobu (v milisekundách), kterou poskytovatel strávil zpracováním, jakmile je povolená statistika, včetně času stráveného čekáním na odpovědi ze serveru a času stráveného spuštěním kódu v samotném poskytovateli.

Třídy, které zahrnují kód časování, jsou:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Aby byl výkon kritických členů co nejmenší, následující členové nejsou načasovány:

SqlDataReader

this[] – operátor (všechna přetížení)

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 Vrátí celkový počet příkazů INSERT, DELETE a UPDATE spuštěných prostřednictvím připojení, jakmile aplikace začne používat zprostředkovatele a povolí statistiky.
IduRows Vrátí celkový počet řádků ovlivněných příkazy INSERT, DELETE a UPDATE provedené prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky.
NetworkServerTime Vrátí kumulativní dobu (v milisekundách), kterou poskytovatel strávil čekáním na odpovědi ze serveru, jakmile aplikace začne používat poskytovatele a povolila statistiky.
PreparedExecs Vrátí počet připravených příkazů spuštěných prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky.
Prepares Vrátí počet příkazů připravených prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky.
SelectCount Vrátí počet příkazů SELECT spuštěných prostřednictvím připojení, jakmile aplikace začne používat zprostředkovatele a povolí statistiky. To zahrnuje příkazy FETCH pro načtení řádků z kurzorů a počet příkazů SELECT se aktualizuje při dosažení konce SqlDataReader příkazu.
SelectRows Vrátí počet řádků vybraných po spuštění aplikace pomocí zprostředkovatele a povolí statistiky. Tento čítač odráží všechny řádky vygenerované příkazy SQL, i ty, které volající ve skutečnosti nespotřebovávaly. Zavření čtečky dat před přečtením celé sady výsledků by například nemělo vliv na počet. To zahrnuje řádky načtené z kurzorů prostřednictvím příkazů FETCH.
ServerRoundtrips Vrátí počet odeslaných příkazů připojení k serveru a odpověď se vrátí, jakmile aplikace začne používat poskytovatele a povolí statistiku.
SumResultSets Vrátí počet sad výsledků, které se použily, jakmile aplikace začne používat zprostředkovatele, a povolí statistiky. To by například zahrnovalo jakoukoli sadu výsledků vrácenou klientovi. U kurzorů se každá operace načtení nebo blokového načtení považuje za nezávislou sadu výsledků.
Transactions Vrátí počet uživatelských transakcí spuštěných po spuštění aplikace pomocí zprostředkovatele a má povolené statistiky, včetně vrácení zpět. Pokud je připojení spuštěné s automatickým potvrzením, každý příkaz se považuje za transakci.

Tento čítač zvýší počet transakcí ihned po provedení příkazu BEGIN TRAN bez ohledu na to, zda je transakce potvrzena nebo vrácena zpět později.
UnpreparedExecs Vrátí počet nepreparovaných příkazů spuštěných prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky.

Načtení hodnoty

Následující konzolová aplikace ukazuje, jak povolit statistiky připojení, načíst čtyři jednotlivé statistické hodnoty a zapisovat je do okna konzoly.

Poznámka:

Následující příklad používá ukázkovou databázi AdventureWorks , která je součástí SQL Serveru. Připojovací řetězec poskytnuté v ukázkovém kódu předpokládá, že je databáze nainstalovaná a dostupná v místním počítači. Upravte připojovací řetězec podle potřeby pro vaše prostředí.

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

Načítání všech hodnot

Následující konzolová aplikace ukazuje, jak povolit statistiky připojení, načíst všechny dostupné statistické hodnoty pomocí enumerátoru a zapisovat je do okna konzoly.

Poznámka:

Následující příklad používá ukázkovou databázi AdventureWorks , která je součástí SQL Serveru. Připojovací řetězec poskytnuté v ukázkovém kódu předpokládá, že je databáze nainstalovaná a dostupná v místním počítači. Upravte připojovací řetězec podle potřeby pro vaše prostředí.

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

Viz také