JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Estadísticas de consultas SQL Server desde ADO.NET 2.0

La clase SqlConnection de ADO.NET 2.0 posee una característica que puede resultar de utilidad en cuertas ocasiones y que permite obtener información estadística sobre las consultas realizadas, de manera muy similar a la que ofrece el Analizador de consultas de SQL Server 2000 o el Management Studio de SQL Server 2005 (si bien no son las mismas).

Esta característica es muy fácil de gestionar gracias a la propiedad StatisticsEnabled de la clase SqlConnection, que sirve como es obvio para habilitar la recogida de estadísticas de las consultas lanzadas a través del objeto SqlConnection instanciado para la ocasión.

Una vez habilitadas las estadísticas se obtienen mediante el método RetrieveStatistics de la misma clase. Éste devuelve un objeto que implementa la interfaz IDictionary, aunque en realidad un poco de reflexión revela que realmente lo que se obtiene es un HashTable, así que es muy fácil de manejar (ahora lo veremos).

El método UpdateStatistics las actualiza al momento actual. Por fin el método ResetStatistics inicializa las estadísticas de esa conexión.

Veamos cómo funcionan y qué datos devuelven con un ejemplo. Para ello he creado rápidamente un proyecto de consola que lanza una consulta simple a la conocida base de datos Northwind y muestra las estadísticas por pantalla:

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;

public class EstadisticasSQL
{
    public static void Main()
    {
        SqlConnection conn = new SqlConnection(@"server=.\SQL2000;Integrated Security=SSPI;Database=Northwind;");
        conn.StatisticsEnabled = true;
        SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
        try
        {
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        
        //Recojo las estadísticas
        Hashtable htStats = (Hashtable) conn.RetrieveStatistics();

        Console.WriteLine("ESTADÍSTICAS DE LA CONSULTA:");
        Console.WriteLine();
        foreach (string stat in htStats.Keys)
        {
            Console.WriteLine("- " + stat + " = " + htStats[stat].ToString() );
        }

        conn.Close();
        Console.ReadLine();
    }
}

Lo que este código arroja por pantalla es lo siguiente:

Como vemos hay bastante información y tal vez la más interesante sea el tiempo que se ha esperado a la respuesta del servidor (NetworkServerTime), los bytes recibidos en forma de paquetes TDS (BytesReceived), el tiempo de ejecución (ExecutionTime) y el número de transacciones (Transactions), aunque cada uno en su caso sabrá qué le interesa.

Otra cosa: no es necesario estar atacando una base de datos SQL Server 2005 para que funciones, basta con usar ADo.NET 2.0. En el ejemplo como puedes comprobar por la cadena de conexión estoy usando un SQL Server 2000 y va estupendamente :-)

José Manuel Alarcón
Banner

Comentarios (1) -

Sí, esto funciona con cualquier herramienta de desarrollo .NET, incluso con el Bloc de notas ;-) ya que es una característica que viene con la propia plataforma en su versión 2.0.

SQL Server Express tiene herramientas de gestión muy potentes y gratuitas para descarga directa (se llaman SQL Sevrer Management Studio Express). Las puedes obtener en:

www.microsoft.com/.../details.aspx

Por supuesto también puedes gstionar las bases de datos desde el proio Visual Studio 2005, incluyendo desde las versiones Express del entorno.

Saludos

JM.

Responder

Agregar comentario