Bahasa

Statistik penyedia untuk SQL Server

Microsoft. Data.SqlClient mendukung statistik runtime. Aktifkan statistik dengan mengatur properti StatisticsEnabled pada objek SqlConnection yang valid ke True.

Setelah Anda mengaktifkan statistik, panggil RetrieveStatistics untuk mendapatkan rekam jepret pada satu titik waktu di objek IDictionary. Enumerasikan pasangan nama/nilai yang tidak diurutkan untuk membaca penghitung. Untuk mengatur ulang penghitung, panggil ResetStatistics.

Jika Anda belum mengaktifkan statistik, RetrieveStatistics mengembalikan nilai awal setiap penghitung tanpa menimbulkan pengecualian. Setelah Anda menonaktifkan statistik, penghitung mempertahankan nilai yang dikumpulkan hingga titik tersebut.

Semua nilai statistik yang dikumpulkan berdasarkan per koneksi.

Nilai Statistik Tersedia

Penyedia Microsoft SQL Server mengekspos 18 nilai statistik. Baca properti kamus Count untuk mendapatkan jumlah entri yang tersedia. Semua penghitung menggunakan Int64, jenis 64-bit bernama long dalam C# dan Long di Visual Basic.

Nilai maksimum, Int64.MaxValue, adalah (2^63)-1. Pada batas itu, penghitung tidak lagi akurat. Nilai terbesar yang valid untuk statistik adalah Int64.MaxValue - 1, atau (2^63)-2.

Catatan

Kamus digunakan untuk mengembalikan statistik penyedia karena jumlah, nama, dan urutan statistik yang dikembalikan dapat berubah di masa mendatang. Aplikasi tidak boleh bergantung pada ditemukannya nilai tertentu dalam kamus, melainkan harus memeriksa apakah nilai tersebut ada dan mengambil tindakan yang sesuai.

Tabel berikut ini menjelaskan nilai statistik yang tersedia. Nama kunci untuk nilai individual tidak dilokalkan di seluruh versi regional .NET Framework.

Nama Kunci Deskripsi
BuffersReceived Mengembalikan jumlah paket aliran data tabular (TDS) yang diterima oleh penyedia dari SQL Server setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
BuffersSent Mengembalikan jumlah paket TDS yang dikirim ke SQL Server oleh penyedia setelah statistik diaktifkan. Perintah besar dapat memerlukan beberapa buffer. Misalnya, jika perintah besar dikirim ke server dan memerlukan enam paket, ServerRoundtrips ditambahkan satu dan BuffersSent ditambahkan enam.
BytesReceived Mengembalikan jumlah byte data dalam paket TDS yang diterima oleh penyedia dari SQL Server setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
BytesSent Mengembalikan jumlah byte data yang dikirim ke SQL Server dalam paket TDS setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
ConnectionTime Jumlah waktu (dalam milidetik) koneksi telah dibuka setelah statistik diaktifkan (total waktu koneksi jika statistik diaktifkan sebelum membuka koneksi).
CursorOpens Mengembalikan berapa kali kursor terbuka melalui koneksi setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.

Perhatikan bahwa hasil baca-saja/teruskan-saja yang dikembalikan oleh pernyataan SELECT tidak dianggap sebagai kursor dan dengan demikian tidak memengaruhi penghitung ini.
ExecutionTime Mengembalikan jumlah waktu kumulatif (dalam milidetik) yang telah dihabiskan penyedia untuk memproses setelah statistik diaktifkan, termasuk waktu yang dihabiskan untuk menunggu balasan dari server serta waktu yang dihabiskan untuk mengeksekusi kode di penyedia itu sendiri.

Kelas yang menyertakan kode waktu adalah:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Untuk menjaga komponen penting dalam kinerja sekecil mungkin, elemen berikut tidak diukur waktunya:

SqlDataReader

this[] operator (semua overload)

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 Mengembalikan jumlah total pernyataan INSERT, DELETE, dan UPDATE yang dijalankan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan mengaktifkan statistik.
IduRows Mengembalikan jumlah total baris yang dipengaruhi oleh pernyataan INSERT, DELETE, dan UPDATE yang dijalankan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan mengaktifkan statistik.
NetworkServerTime Mengembalikan jumlah waktu kumulatif (dalam milidetik) yang dihabiskan penyedia untuk menunggu balasan dari server setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
PreparedExecs Mengembalikan jumlah perintah yang disiapkan yang dijalankan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
Prepares Mengembalikan jumlah pernyataan yang disiapkan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
SelectCount Mengembalikan jumlah SELECT pernyataan yang dijalankan melalui koneksi setelah aplikasi mengaktifkan statistik. Menyertakan FETCH pernyataan yang mengambil baris dari kursor. Untuk statement SELECT, penyedia memperbarui hitungan saat SqlDataReader mencapai akhir hasil.
SelectRows Mengembalikan jumlah baris yang dipilih setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik. Penghitung ini mencerminkan semua baris yang dihasilkan oleh pernyataan SQL, bahkan yang sebenarnya tidak dikonsumsi oleh penelepon. Misalnya, menutup pembaca data sebelum membaca seluruh tataan hasil tidak akan memengaruhi hitungan. Ini termasuk baris yang diambil dari kursor melalui pernyataan FETCH.
ServerRoundtrips Mengembalikan berapa kali koneksi mengirim perintah ke server dan mendapatkan balasan kembali setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik.
SumResultSets Mengembalikan jumlah tataan hasil yang telah digunakan setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik. Misalnya ini akan mencakup kumpulan hasil apa pun yang dikembalikan ke klien. Untuk kursor, setiap operasi pengambilan data atau pengambilan data blok dianggap sebagai kumpulan hasil mandiri.
Transactions Mengembalikan jumlah transaksi pengguna yang dimulai setelah aplikasi mulai memakai penyedia layanan dan statistik telah diaktifkan, termasuk rollback. Jika koneksi berjalan dengan komit otomatis aktif, setiap perintah dianggap sebagai transaksi.

Penghitung ini menaikkan jumlah transaksi segera setelah pernyataan BEGIN TRAN dijalankan, terlepas dari apakah transaksi di-commit atau di-rollback nanti.
UnpreparedExecs Mengembalikan jumlah pernyataan tidak siap yang dieksekusi melalui koneksi setelah aplikasi mulai menggunakan penyedia dan mengaktifkan statistik.

Pengambilan Nilai

Aplikasi konsol berikut menunjukkan cara mengaktifkan statistik pada koneksi, mengambil empat nilai statistik individual, dan menulisnya ke jendela konsol.

Catatan

Contoh berikut menggunakan database sampel AdventureWorks yang disertakan dengan SQL Server. String koneksi yang disediakan dalam kode sampel mengasumsikan database diinstal dan tersedia di komputer lokal. Ubah string koneksi seperlunya untuk lingkungan Anda.

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

Mengambil Semua Nilai

Aplikasi konsol berikut menunjukkan cara mengaktifkan statistik pada koneksi, mengambil semua nilai statistik yang tersedia menggunakan enumerator, dan menulisnya ke jendela konsol.

Catatan

Contoh berikut menggunakan database sampel AdventureWorks yang disertakan dengan SQL Server. String koneksi yang disediakan dalam kode sampel mengasumsikan database diinstal dan tersedia di komputer lokal. Ubah string koneksi seperlunya untuk lingkungan Anda.

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

Lihat juga