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