Estadísticas del proveedor para SQL Server
Desde .NET Framework versión 2.0, el proveedor de datos .NET Framework para servidor SQL Server admite estadísticas en tiempo de ejecución. Debe habilitar las estadísticas estableciendo la propiedad StatisticsEnabled del objeto SqlConnection en True
después de haber creado un objeto de conexión válido.
Una vez habilitadas las estadísticas, puede revisarlas como una "instantánea en el tiempo" recuperando una referencia IDictionary a través del método RetrieveStatistics del objeto SqlConnection. Se enumeran a través de la lista como un conjunto de entradas de diccionario de pares nombre-valor. Estos pares nombre-valor están desordenados. En cualquier momento, puede llamar al método ResetStatistics del objeto SqlConnection para restablecer los contadores.
Si no se ha habilitado la recopilación de estadísticas, no se genera una excepción. Además, si se llama a RetrieveStatistics sin haber llamado a StatisticsEnabled primero, los valores recuperados son los valores iniciales de cada entrada. Si habilita las estadísticas, ejecuta la aplicación durante un tiempo y, a continuación, deshabilita las estadísticas, los valores recuperados reflejarán los valores recopilados hasta el momento en que se deshabilitaron las estadísticas.
Todos los valores estadísticos se recopilan por conexión.
Valores estadísticos disponibles
Actualmente hay 18 elementos diferentes disponibles en el proveedor de Microsoft SQL Server. Se puede acceder al número de elementos disponibles mediante la propiedad Count de la referencia de la interfaz IDictionary devuelta por RetrieveStatistics. Todos los contadores de las estadísticas de proveedor usan el tipo Int64 de Common Language Runtime (long en C# y Visual Basic), que tiene un ancho de 64 bits. El valor máximo del tipo de datos int64, como se define en el campo int64.MaxValue, es ((2^63)-1)). Cuando los valores de los contadores alcanzan este valor máximo, ya no se deben considerar precisos. Esto significa que int64.MaxValue-1((2^63)-2) es realmente el valor válido más alto de cualquier estadística.
Nota:
Se usa un diccionario para devolver las estadísticas del proveedor porque el número, los nombres y el orden de las estadísticas devueltas pueden cambiar en el futuro. Las aplicaciones no deben depender de que haya un valor específico en el diccionario, sino que, en su lugar, deben comprobar si el valor está ahí y, en ese caso, crear una rama.
En la tabla siguiente se describen los valores estadísticos disponibles. Los nombres de claves de cada uno de los valores no vienen localizados en las versiones regionales de .NET Framework.
Nombre de clave | Descripción |
---|---|
BuffersReceived |
Devuelve el número de paquetes de flujo TDS recibidos por el proveedor de SQL Server después de que la aplicación se haya iniciado con el proveedor y haya habilitado las estadísticas. |
BuffersSent |
Devuelve el número de paquetes TDS enviados a SQL Server por el proveedor una vez que se han habilitado las estadísticas. Los comandos grandes pueden requerir varios búferes. Por ejemplo, si se envía un comando grande al servidor y se requieren seis paquetes, ServerRoundtrips se incrementa en uno y BuffersSent se incrementa en seis. |
BytesReceived |
Devuelve el número de bytes de datos de los paquetes TDS recibidos por el proveedor de SQL Server una vez que la aplicación se ha iniciado con el proveedor y ha habilitado las estadísticas. |
BytesSent |
Devuelve el número de bytes de datos enviados a SQL Server en paquetes TDS después de que la aplicación se haya iniciado con el proveedor y haya habilitado las estadísticas. |
ConnectionTime |
Cantidad de tiempo (en milisegundos) que se ha abierto la conexión después de habilitarse las estadísticas (el tiempo total de conexión si las estadísticas se han habilitado antes de abrir la conexión). |
CursorOpens |
Devuelve el número de veces que se abrió un cursor a través de la conexión una vez que la aplicación se ha iniciado con el proveedor y ha habilitado las estadísticas. Tenga en cuenta que los resultados de solo lectura y solo avance devueltos por las instrucciones SELECT no se consideran cursores y, por tanto, no afectan a este contador. |
ExecutionTime |
Devuelve la cantidad acumulada de tiempo (en milisegundos) que ha invertido el proveedor en el procesamiento una vez que se han habilitado las estadísticas, lo que incluye el tiempo dedicado a esperar una respuesta del servidor, así como el tiempo dedicado a ejecutar código en el propio proveedor. Las clases que incluyen código de tiempo son: SqlConnection SqlCommand SqlDataReader SqlDataAdapter SqlTransaction SqlCommandBuilder Para que el tamaño de los miembros esenciales para el rendimiento sea lo más reducido posible, no se cronometran los siguientes miembros: SqlDataReader Este operador [] (todas las sobrecargas) 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 |
Devuelve el número total de instrucciones INSERT, DELETE y UPDATE ejecutadas a través de la conexión una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. |
IduRows |
Devuelve el número total de filas afectadas por las instrucciones INSERT, DELETE y UPDATE ejecutadas a través de la conexión una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. |
NetworkServerTime |
Devuelve la cantidad acumulada de tiempo (en milisegundos) que el proveedor ha dedicado a esperar una respuesta del servidor una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. |
PreparedExecs |
Devuelve el número de comandos preparados que se ejecutan a través de la conexión una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. |
Prepares |
Devuelve el número de instrucciones preparadas a través de la conexión una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. |
SelectCount |
Devuelve el número de instrucciones SELECT ejecutadas a través de la conexión una vez que la aplicación se ha iniciado con el proveedor y se han habilitado las estadísticas. Esto incluye las instrucciones FETCH para recuperar las filas de los cursores, y el recuento de las instrucciones SELECT se actualiza cuando se alcanza el final de un objeto SqlDataReader. |
SelectRows |
Devuelve el número de filas seleccionadas una vez que se ha iniciado la aplicación con el proveedor y se han habilitado las estadísticas. Este contador refleja todas las filas generadas por las instrucciones SQL, incluso las que el autor de la llamada no usó realmente. Por ejemplo, cerrar un lector de datos antes de leer todo el conjunto de resultados no afectaría al recuento. Esto incluye las filas recuperadas de los cursores a través de las instrucciones FETCH. |
ServerRoundtrips |
Devuelve el número de veces que la conexión envió comandos al servidor y recibió una respuesta una vez que la aplicación se ha iniciado con el proveedor y se han habilitado las estadísticas. |
SumResultSets |
Devuelve el número de conjuntos de resultados que se han utilizado una vez que la aplicación se ha iniciado con el proveedor y se han habilitado las estadísticas. Por ejemplo, esto incluiría cualquier conjunto de resultados devuelto al cliente. En el caso de los cursores, cada operación de captura o bloqueo se considera un conjunto de resultados independiente. |
Transactions |
Devuelve el número de transacciones de usuario que se inician una vez que la aplicación se ha iniciado con el proveedor y se han habilitado las estadísticas, incluidas las reversiones. Si una conexión se ejecuta con la confirmación automática activada, cada comando se considera una transacción. Este contador incrementa el recuento de transacciones en cuanto se ejecuta una instrucción BEGIN TRAN, independientemente de si la transacción se confirma o se revierte más tarde. |
UnpreparedExecs |
Devuelve el número de instrucciones no preparadas que se ejecutan a través de la conexión una vez que la aplicación se ha iniciado con el proveedor y ha habilitado las estadísticas. |
Recuperación de un valor
La siguiente aplicación de consola muestra cómo habilitar las estadísticas en una conexión, recuperar cuatro valores de estadística individuales y escribirlos en la ventana de la consola.
Nota:
En el siguiente ejemplo se usa la base de datos de ejemplo AdventureWorks que se incluye con SQL Server. La cadena de conexión proporcionada en el código de ejemplo da por sentado que la base de datos está instalada y disponible en el equipo local. Modifique la cadena de conexión según sea necesario para el entorno.
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 "...";
}
}
}
Recuperación de todos los valores
La siguiente aplicación de consola muestra cómo habilitar las estadísticas en una conexión, recuperar todos los valores de estadística disponibles mediante el enumerador y escribirlos en la ventana de la consola.
Nota:
En el siguiente ejemplo se usa la base de datos de ejemplo AdventureWorks que se incluye con SQL Server. La cadena de conexión proporcionada en el código de ejemplo da por sentado que la base de datos está instalada y disponible en el equipo local. Modifique la cadena de conexión según sea necesario para el entorno.
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 "...";
}
}
}