Jazyk

Statistika poskytovatele pro SQL Server

Microsoft.Data.SqlClient podporuje statistiky za běhu. Povolte statistiky nastavením StatisticsEnabled vlastnosti platného objektu SqlConnection na hodnotu True.

Po povolení statistiky zavolejte RetrieveStatistics pro snímek k určitému bodu v čase v objektu IDictionary. Vyjmenujte jeho neseřazené páry název/hodnota a přečtěte čítače. Chcete-li resetovat čítače, zavolejte ResetStatistics.

Pokud jste nepovolili statistiku, RetrieveStatistics vrátí počáteční hodnotu každého čítače, aniž by vyvolal výjimku. Po zakázání statistiky budou čítače uchovávat hodnoty shromážděné do té chvíle.

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

Dostupné statistické hodnoty

Poskytovatel Microsoft SQL Server zpřístupňuje 18 statistických hodnot. Přečtěte si slovníkovou vlastnost Count a získejte počet dostupných položek. Všechny čítače používají Int64, 64bitový typ pojmenovaný long v jazyce C# a Long v Visual Basic.

Maximální hodnota, Int64.MaxValueje (2^63)-1. Při dosažení tohoto limitu už nejsou čítače přesné. Nejvyšší platná hodnota statistiky je tedy Int64.MaxValue - 1, nebo (2^63)-2.

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ěly by místo toho zkontrolovat, zda hodnota existuje, a podle toho se rozhodnout.

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í nebo forward-only 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 byly výkonově kritické prvky co nejmenší, následující prvky nejsou měřeny:

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 INSERTpříkazů a DELETEUPDATE příkazů spuštěných prostřednictvím připojení, jakmile aplikace začne používat poskytovatele a povolí statistiky.
IduRows Vrátí celkový počet řádků ovlivněných parametrem INSERT, DELETEa UPDATE příkazy spuštěné 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 SELECT příkazů SQL spuštěných prostřednictvím připojení, jakmile aplikace povolí statistiky. Obsahuje FETCH příkazy, které načítají řádky z kurzorů. U SELECT statementů poskytovatel aktualizuje počet, když SqlDataReader dosáhne konce výsledků.
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 nepoužil. 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ů SQL FETCH.
ServerRoundtrips Vrátí počet, kolikrát připojení odeslalo příkazy na server a obdrželo odpověď poté, co aplikace začala používat poskytovatele a povolila statistiky.
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í BEGIN TRAN statementu 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 AdventureWorks databázi, 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 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 "...";
    }
  }
}

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 AdventureWorks databázi, 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 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 "...";
    }
  }
}

Viz také