Partilhar via


Estatísticas do provedor para o SQL Server

A partir do .NET Framework versão 2.0, o Provedor de Dados do .NET Framework para SQL Server oferece suporte a estatísticas em tempo de execução. Você deve habilitar as estatísticas definindo a StatisticsEnabled propriedade do objeto para True depois de ter um objeto de SqlConnection conexão válido criado.

Depois que as estatísticas são habilitadas, você pode revisá-las como um "instantâneo no tempo" recuperando uma IDictionary referência através do RetrieveStatistics método do SqlConnection objeto. Você enumera através da lista como um conjunto de entradas de dicionário de par nome/valor. Esses pares nome/valor não estão ordenados. A qualquer momento, você pode chamar o ResetStatistics SqlConnection método do objeto para redefinir os contadores.

Se a coleta de estatísticas não tiver sido habilitada, uma exceção não será gerada. Além disso, se RetrieveStatistics for chamado sem StatisticsEnabled ter sido chamado primeiro, os valores recuperados são os valores iniciais para cada entrada. Se você habilitar estatísticas, executar seu aplicativo por um tempo e, em seguida, desabilitar estatísticas, os valores recuperados refletirão os valores coletados até o ponto em que as estatísticas foram desabilitadas.

Todos os valores estatísticos recolhidos são obtidos por ligação.

Valores estatísticos disponíveis

Atualmente, há 18 itens diferentes disponíveis no provedor do Microsoft SQL Server. O número de itens disponíveis pode ser acessado por meio da propriedade Count da referência de interface retornada IDictionary por RetrieveStatistics. Todos os contadores para estatísticas do provedor usam o tipo Common Language Runtime Int64 (longo em C# e Visual Basic), que tem 64 bits de largura. O valor máximo do tipo de dados int64 , conforme definido pelo int64. Campo MaxValue , é ((2^63)-1)). Quando os valores dos contadores atingem esse valor máximo, eles não devem mais ser considerados precisos. Isto significa que int64. MaxValue-1((2^63)-2) é efetivamente o maior valor válido para qualquer estatística.

Nota

Um dicionário é usado para retornar estatísticas do provedor porque o número, os nomes e a ordem das estatísticas retornadas podem mudar no futuro. Os aplicativos não devem confiar em um valor específico encontrado no dicionário, mas devem verificar se o valor está lá e ramificar de acordo.

A tabela seguinte descreve os valores estatísticos disponíveis. Os nomes de chave para os valores individuais não estão localizados em versões regionais do .NET Framework.

Nome da chave Description
BuffersReceived Retorna o número de pacotes de fluxo de dados tabulares (TDS) recebidos pelo provedor do SQL Server depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
BuffersSent Retorna o número de pacotes TDS enviados ao SQL Server pelo provedor após a habilitação das estatísticas. Comandos grandes podem exigir vários buffers. Por exemplo, se um comando grande é enviado para o servidor e requer seis pacotes, ServerRoundtrips é incrementado em um e BuffersSent é incrementado em seis.
BytesReceived Retorna o número de bytes de dados nos pacotes TDS recebidos pelo provedor do SQL Server depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
BytesSent Retorna o número de bytes de dados enviados ao SQL Server em pacotes TDS depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
ConnectionTime A quantidade de tempo (em milissegundos) que a conexão foi aberta após as estatísticas terem sido habilitadas (tempo total de conexão se as estatísticas foram habilitadas antes de abrir a conexão).
CursorOpens Retorna o número de vezes que um cursor foi aberto através da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.

Observe que os resultados somente leitura/encaminhamento retornados pelas instruções SELECT não são considerados cursores e, portanto, não afetam esse contador.
ExecutionTime Retorna a quantidade acumulada de tempo (em milissegundos) que o provedor gastou processando depois que as estatísticas foram habilitadas, incluindo o tempo gasto aguardando respostas do servidor, bem como o tempo gasto executando código no próprio provedor.

As classes que incluem código de temporização são:

SqlConnection

SqlCommand

SqlDataReader

SqlDataAdapter

SqlTransaction

SqlCommandBuilder

Para manter os membros críticos de desempenho o menor possível, os seguintes membros não são cronometrados:

SqlDataReader

este[] operador (todas as 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 Retorna o número total de instruções INSERT, DELETE e UPDATE executadas por meio da conexão depois que o aplicativo começa a usar o provedor e habilita as estatísticas.
IduRows Retorna o número total de linhas afetadas pelas instruções INSERT, DELETE e UPDATE executadas por meio da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
NetworkServerTime Retorna a quantidade acumulada de tempo (em milissegundos) que o provedor gastou aguardando respostas do servidor depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
PreparedExecs Retorna o número de comandos preparados executados através da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
Prepares Retorna o número de instruções preparadas através da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.
SelectCount Retorna o número de instruções SELECT executadas através da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas. Isso inclui instruções FETCH para recuperar linhas de cursores, e a contagem de instruções SELECT é atualizada quando o final de um SqlDataReader é atingido.
SelectRows Retorna o número de linhas selecionadas depois que o aplicativo começou a usar o provedor e habilitou as estatísticas. Esse contador reflete todas as linhas geradas pelas instruções SQL, mesmo aquelas que não foram realmente consumidas pelo chamador. Por exemplo, fechar um leitor de dados antes de ler todo o conjunto de resultados não afetaria a contagem. Isso inclui as linhas recuperadas de cursores por meio de instruções FETCH.
ServerRoundtrips Retorna o número de vezes que a conexão enviou comandos para o servidor e obteve uma resposta de volta assim que o aplicativo começou a usar o provedor e habilitou as estatísticas.
SumResultSets Retorna o número de conjuntos de resultados que foram usados depois que o aplicativo começou a usar o provedor e habilitou as estatísticas. Por exemplo, isso incluiria qualquer conjunto de resultados devolvido ao cliente. Para cursores, cada operação de busca ou block-fetch é considerada um conjunto de resultados independente.
Transactions Retorna o número de transações de usuário iniciadas depois que o aplicativo começou a usar o provedor e habilitou estatísticas, incluindo reversões. Se uma conexão estiver sendo executada com confirmação automática ativada, cada comando será considerado uma transação.

Esse contador incrementa a contagem de transações assim que uma instrução BEGIN TRAN é executada, independentemente de a transação ser confirmada ou revertida posteriormente.
UnpreparedExecs Retorna o número de instruções não preparadas executadas por meio da conexão depois que o aplicativo começou a usar o provedor e habilitou as estatísticas.

Recuperando um valor

O aplicativo de console a seguir mostra como habilitar estatísticas em uma conexão, recuperar quatro valores estatísticos individuais e gravá-los na janela do console.

Nota

O exemplo a seguir usa o banco de dados AdventureWorks de exemplo incluído no SQL Server. A cadeia de conexão fornecida no código de exemplo pressupõe que o banco de dados esteja instalado e disponível no computador local. Modifique a cadeia de conexão conforme necessário para seu ambiente.

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

Recuperando todos os valores

O aplicativo de console a seguir mostra como habilitar estatísticas em uma conexão, recuperar todos os valores estatísticos disponíveis usando o enumerador e gravá-los na janela do console.

Nota

O exemplo a seguir usa o banco de dados AdventureWorks de exemplo incluído no SQL Server. A cadeia de conexão fornecida no código de exemplo pressupõe que o banco de dados esteja instalado e disponível no computador local. Modifique a cadeia de conexão conforme necessário para seu ambiente.

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

Consulte também