Az SQL Server szolgáltatói statisztikái

A .NET-keretrendszer 2.0-s verziójától kezdve az SQL Serverhez készült .NET-keretrendszer adatszolgáltatója támogatja a futtatókörnyezeti statisztikákat. Miután létrehozott egy érvényes kapcsolatobjektumot, a statisztikákat úgy kell engedélyeznie, hogy beállítja a SqlConnection objektum StatisticsEnabled tulajdonságát True értékre.

Miután a statisztikákat engedélyezte, „pillanatképként” tekintheti át őket az RetrieveStatistics hivatkozás beolvasásával az SqlConnection objektum IDictionary metódusán keresztül. A listában a neveket és értékeket párokként, szótárbejegyzésekként kell felsorolni. Ezek a név-érték párok rendezetlenek. Bármikor meghívhatja az ResetStatistics objektum metódusát a SqlConnection számlálók alaphelyzetbe állításához.

Ha a statisztikai adatgyűjtés nincs engedélyezve, a rendszer nem hoz létre kivételt. Emellett, ha RetrieveStatistics hívják meg anélkül, hogy először StatisticsEnabled-t hívták volna meg, a lekért értékek az egyes bejegyzések kezdeti értékei. Ha engedélyezi a statisztikákat, futtassa az alkalmazást egy ideig, majd tiltsa le a statisztikákat, a lekért értékek a statisztikák letiltásának idejéig gyűjtött értékeket tükrözik.

Minden összegyűjtött statisztikai érték kapcsolatonkénti alapon történik.

Elérhető statisztikai értékek

Jelenleg 18 különböző elem érhető el a Microsoft SQL Server szolgáltatójától. A rendelkezésre álló elemek száma a Count interfész IDictionary hivatkozásának tulajdonságán keresztül érhető el, amelyet a RetrieveStatistics ad vissza. A szolgáltatói statisztikák összes számlálója a közös nyelvi futtatókörnyezettípust Int64 használja (hosszú C# és Visual Basic nyelven), amely 64 bites. Az int64 adattípus maximális értéke az int64 által meghatározottak szerint. MaxValue mező: ((2^63)-1)). Ha a számlálók értékei elérik ezt a maximális értéket, a továbbiakban nem tekinthetők pontosnak. Ez azt jelenti, hogy int64 . A MaxValue-1((2^63)-2) gyakorlatilag minden statisztika legnagyobb érvényes értéke.

Megjegyzés

Egy szótárat használnak a szolgáltatói statisztikák visszaadására, mert a visszaadott statisztikák száma, neve és sorrendje a jövőben változhat. Az alkalmazásoknak nem szabad a szótárban található adott értékre támaszkodniuk, hanem ellenőriznie kell, hogy az érték létezik-e, és ennek megfelelően ágaznak-e el.

Az alábbi táblázat a rendelkezésre álló statisztikai értékeket ismerteti. Az egyes értékek kulcsnevei nem honosítva vannak a .NET-keretrendszer regionális verzióiban.

Név kulcs Leírás
BuffersReceived A szolgáltató által az SQL Serverről fogadott táblázatos adatfolyam-(TDS-) csomagok számát adja vissza, miután az alkalmazás megkezdte a szolgáltató használatát, és engedélyezte a statisztikákat.
BuffersSent A statisztikai adatok engedélyezése után a szolgáltató által az SQL Servernek küldött TDS-csomagok számát adja vissza. A nagy parancsok több puffert is igényelhetnek. Ha például egy nagy parancsot küldenek a kiszolgálónak, és hat csomagra van szükség, ServerRoundtrips a rendszer eggyel növeli, és BuffersSent hattal növeli.
BytesReceived A szolgáltató által az SQL Serverről fogadott TDS-csomagokban lévő adatok bájtjainak számát adja vissza, miután az alkalmazás használatba vette a szolgáltatót, és engedélyezte a statisztikákat.
BytesSent Az SQL Servernek TDS-csomagokban küldött adatok bájtjainak számát adja vissza, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat.
ConnectionTime Az az idő (ezredmásodpercben), amelyet a kapcsolat a statisztikák engedélyezése után nyitott meg (teljes kapcsolati idő, ha a statisztikát engedélyezték a kapcsolat megnyitása előtt).
CursorOpens Azt adja vissza, hogy a kurzor hányszor volt megnyitva a kapcsolaton keresztül, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat.

Vegye figyelembe, hogy a SELECT utasítások által visszaadott csak olvasható/előre haladott eredmények nem kezelhetők kurzorként, ezért nem befolyásolják ezt a számlálót.
ExecutionTime Azt az összesített időt adja vissza (ezredmásodpercben), amelyet a szolgáltató a statisztikák engedélyezése után töltött feldolgozással, beleértve a kiszolgálótól érkező válaszokra való várakozást, valamint a kódnak a szolgáltatóban való végrehajtásával töltött időt.

Az időzítési kódot tartalmazó osztályok a következők:

Sql-kapcsolat

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

A teljesítmény szempontjából kritikus tagok lehető legkisebb számának megtartása érdekében a következő tagok nem időznek:

SqlDataReader

ez[] operátor (minden túlterhelés)

GetBoolean

Karakter lekérése

GetDateTime

GetDecimal

GetDouble

GetFloat

GetGuid

GetInt16

GetInt32

GetInt64

GetName

GetOrdinal

GetSqlBinary

GetSqlBoolean

GetSqlByte

SzerezdMegAzSqlDátumIdőt

SqlTizedecimális értéklekérése

GetSqlDouble

GetSqlGuid

GetSqlInt16

GetSqlInt32

GetSqlInt64

GetSqlMoney

GetSqlSingle

GetSqlString

GetString

IsDBNull
IduCount A kapcsolaton keresztül végrehajtott INSERT, DELETE és UPDATE utasítások teljes számát adja vissza, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat.
IduRows A kapcsolaton keresztül végrehajtott INSERT, DELETE és UPDATE utasítások által érintett sorok teljes számát adja vissza, miután az alkalmazás használatba vette a szolgáltatót, és engedélyezte a statisztikákat.
NetworkServerTime Azt az összesített időt adja vissza (ezredmásodpercben), amelyet a szolgáltató a kiszolgálótól kapott válaszokra való várakozással töltött, miután az alkalmazás használatba vette a szolgáltatót, és engedélyezte a statisztikákat.
PreparedExecs A kapcsolaton keresztül végrehajtott előkészített parancsok számát adja vissza, miután az alkalmazás megkezdte a szolgáltató használatát, és engedélyezte a statisztikákat.
Prepares A kapcsolaton keresztül készített utasítások számát adja vissza, miután az alkalmazás megkezdte a szolgáltató használatát, és engedélyezte a statisztikákat.
SelectCount A kapcsolaton keresztül végrehajtott SELECT-utasítások számát adja vissza, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat. Ide tartoznak a sorokat a kurzorokból lekérni kívánt FETCH utasítások, a SELECT utasítások száma pedig a végérték SqlDataReader elérésekor frissül.
SelectRows A kiválasztott sorok számát adja vissza, miután az alkalmazás megkezdte a szolgáltató használatát, és engedélyezte a statisztikákat. Ez a számláló az SQL-utasítások által létrehozott összes sort tükrözi, még azokat is, amelyeket a hívó ténylegesen nem használt fel. Az adatolvasó bezárása például a teljes eredményhalmaz elolvasása előtt nem befolyásolja a darabszámot. Ide tartoznak a kurzorokból a FETCH utasításokon keresztül lekért sorok is.
ServerRoundtrips Azt adja vissza, hogy a kapcsolat hányszor küldött parancsokat a kiszolgálónak, és kapott választ, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat.
SumResultSets Azoknak az eredményhalmazoknak a számát adja vissza, amelyeket az alkalmazás a szolgáltató használatának megkezdése és a statisztikák engedélyezése után használt. Ilyen például az ügyfélnek visszaküldött eredményhalmaz. A kurzorok esetében minden beolvasási vagy blokklehívási művelet független eredményhalmaznak minősül.
Transactions Azon felhasználói tranzakciók számát adja vissza, amelyek akkor kezdődtek, amikor az alkalmazás használatba vette a szolgáltatót, és engedélyezte a statisztikákat, beleértve a visszaállításokat is. Ha egy kapcsolat automatikus véglegesítéssel fut, az egyes parancsok tranzakciónak minősülnek.

Ez a számláló a BEGIN TRAN utasítás végrehajtása után azonnal növeli a tranzakció számát, függetlenül attól, hogy a tranzakció véglegesítése vagy későbbi visszaállítása történik-e.
UnpreparedExecs A kapcsolaton keresztül végrehajtott nem előkészített utasítások számát adja vissza, miután az alkalmazás elkezdte használni a szolgáltatót, és engedélyezte a statisztikákat.

Érték beolvasása

Az alábbi konzolalkalmazás bemutatja, hogyan engedélyezheti a statisztikát egy kapcsolaton, hogyan kérdezhet le négy egyedi statisztikai értéket, és hogyan írhatja ki őket a konzolablakba.

Megjegyzés

Az alábbi példa az SQL Serverhez mellékelt mintaadatbázist AdventureWorks használja. A mintakódban megadott kapcsolati sztring feltételezi, hogy az adatbázis telepítve van, és elérhető a helyi számítógépen. Szükség szerint módosítsa a kapcsolati karakterláncot a környezethez.

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

Az összes érték lekérdezése

Az alábbi konzolalkalmazás bemutatja, hogyan engedélyezheti a statisztikát egy kapcsolaton, hogyan kérdezheti le az összes elérhető statisztikai értéket az enumerátor használatával, és hogyan írhatja őket a konzolablakba.

Megjegyzés

Az alábbi példa az SQL Serverhez mellékelt mintaadatbázist AdventureWorks használja. A mintakódban megadott kapcsolati sztring feltételezi, hogy az adatbázis telepítve van, és elérhető a helyi számítógépen. Szükség szerint módosítsa a kapcsolati karakterláncot a környezethez.

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

Lásd még