Bagikan melalui


Statistik Penyedia untuk SQL Server

Dimulai dengan .NET Framework versi 2.0, Penyedia Data .NET Framework untuk SQL Server mendukung statistik run-time. Anda harus mengaktifkan statistik dengan menyetel properti StatisticsEnabled dari objek SqlConnection ke True setelah Anda membuat objek koneksi yang valid. Setelah statistik diaktifkan, Anda dapat meninjaunya sebagai "snapshot in time" dengan mengambil referensi IDictionary melalui metode RetrieveStatistics dari objek SqlConnection. Anda menghitung melalui daftar sebagai sekumpulan entri kamus pasangan nama/nilai. Pasangan nama/nilai ini tidak diurutkan. Kapan saja, Anda dapat memanggil metode ResetStatistics dari objek SqlConnection untuk menyetel ulang penghitung. Jika pengumpulan statistik belum diaktifkan, pengecualian tidak dihasilkan. Selain itu, jika RetrieveStatistics dipanggil tanpa StatisticsEnabled dipanggil terlebih dahulu, nilai yang diambil adalah nilai awal untuk setiap entri. Jika Anda mengaktifkan statistik, jalankan aplikasi Anda untuk sementara waktu, lalu nonaktifkan statistik, nilai yang diambil akan mencerminkan nilai yang dikumpulkan hingga titik di mana statistik dinonaktifkan. Semua nilai statistik yang dikumpulkan berdasarkan per koneksi.

Nilai Statistik Tersedia

Saat ini ada 18 item berbeda yang tersedia dari penyedia Microsoft SQL Server. Jumlah item yang tersedia dapat diakses melalui properti Hitungan referensi antarmuka yang IDictionary dikembalikan oleh RetrieveStatistics. Semua penghitung untuk statistik penyedia menggunakan bahasa umum runtime Int64 jenis (panjang dalam C# dan Visual Basic), yang lebarnya 64 bit. Nilai maksimum tipe data int64, seperti yang ditentukan oleh bidang int64.MaxValue, adalah ((2^63)-1)). Ketika nilai untuk penghitung mencapai nilai maksimum ini, nilai tersebut seharusnya tidak lagi dianggap akurat. Ini berarti bahwa int64. MaxValue-1((2^63)-2) secara efektif merupakan nilai valid terbesar untuk statistik apa pun.

Catatan

Kamus digunakan untuk mengembalikan statistik penyedia karena jumlah, nama, dan urutan statistik yang dikembalikan dapat berubah di masa mendatang. Aplikasi tidak boleh mengandalkan nilai tertentu yang ditemukan dalam kamus, tetapi harus memeriksa apakah nilai ada dan cabang yang sesuai.

Tabel berikut ini menjelaskan nilai statistik saat ini yang tersedia. Perhatikan bahwa nama kunci untuk nilai individual tidak dilokalkan di seluruh versi regional Microsoft .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 ditahapkan oleh satu dan BuffersSent bertambah enam paket.
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 anggota kritis performa sesingkat mungkin, anggota berikut tidak diberi waktu:

SqlDataReader

operator [] ini (semua kelebihan beban)

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 telah mengaktifkan statistik.
IduRows Mengembalikan jumlah total baris yang terpengaruh oleh pernyataan INSERT, DELETE, dan UPDATE yang dijalankan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan telah 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 pernyataan SELECT yang dijalankan melalui koneksi setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik. Ini termasuk pernyataan FETCH untuk mengambil baris dari kursor, dan hitungan untuk pernyataan SELECT diperbarui saat akhir SqlDataReader tercapai.
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 atau pengambilan blok dianggap sebagai kumpulan hasil independen.
Transactions Mengembalikan jumlah transaksi pengguna yang dimulai setelah aplikasi mulai menggunakan penyedia dan telah mengaktifkan statistik, termasuk pembatalan. Jika koneksi berjalan dengan penerapan otomatis aktif, setiap perintah dianggap sebagai transaksi.

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

Mengambil Nilai

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

Catatan

Contoh berikut menggunakan contoh database 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 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 "Data Source=localhost;Integrated Security=SSPI;" & _  
      "Initial Catalog=AdventureWorks"  
  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 "Data Source=localhost;Integrated Security=SSPI;" +
        "Initial Catalog=AdventureWorks";  
    }  
  }  
}  

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 contoh database 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 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 "Data Source=localhost;Integrated Security=SSPI;" & _  
      "Initial Catalog=AdventureWorks"  
  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 "Data Source=localhost;Integrated Security=SSPI;" +
        "Initial Catalog=AdventureWorks";  
    }  
  }  
}  

Lihat juga