Statistiques du fournisseur pour SQL Server
À partir de .NET Framework version 2.0, le fournisseur de données .NET Framework pour SQL Server prend en charge des statistiques d’exécution. Vous devez activer les statistiques en affectant à la propriété StatisticsEnabled de l’objet SqlConnection la valeur True
une fois que vous avez créé un objet de connexion valide.
Une fois les statistiques activées, vous pouvez les examiner comme un « instantané dans le temps » en extrayant une référence IDictionary via la méthode RetrieveStatistics de l’objet SqlConnection. Vous énumérez la liste sous la forme d’un ensemble d’entrées de dictionnaire avec des paires nom/valeur. Ces paires nom/valeur ne sont pas ordonnées. À tout moment, vous pouvez appeler la méthode ResetStatistics de l’objet SqlConnection pour réinitialiser les compteurs.
Si la collecte de statistiques n’a pas été activée, aucune exception n’est générée. En outre, si RetrieveStatistics est appelé sans que StatisticsEnabled ait été appelé au préalable, les valeurs récupérées sont les valeurs initiales de chaque entrée. Si vous activez les statistiques, exécutez votre application pendant un certain temps, puis désactivez les statistiques, les valeurs récupérées reflètent les valeurs collectées jusqu’au point où les statistiques ont été désactivées.
Toutes les valeurs statistiques rassemblées sont basées sur une connexion individuelle.
Valeurs statistiques disponibles
Actuellement, il existe 18 éléments différents disponibles auprès du fournisseur Microsoft SQL Server. Le nombre d’éléments disponibles est accessible par le biais de la propriété Count de la référence d’interface IDictionary retournée par RetrieveStatistics. Tous les compteurs relatifs aux statistiques de fournisseur utilisent le type Common Language Runtime Int64 (long en C# et Visual Basic), dont la taille est de 64 bits. La valeur maximale du type de données int64, telle que définie par le champ int64.MaxValue, est ((2^63)-1)). Lorsque les valeurs des compteurs atteignent cette valeur maximale, elles ne doivent plus être considérées comme exactes. Cela signifie que int64.MaxValue-1((2^63)-2) est effectivement la valeur valide la plus élevée pour toute statistique.
Notes
Un dictionnaire est utilisé pour renvoyer les statistiques du fournisseur, car le nombre, le nom et l’ordre des statistiques renvoyées sont susceptibles de changer à l’avenir. Les applications ne doivent pas s’appuyer sur une valeur spécifique trouvée dans le dictionnaire, mais doivent plutôt vérifier si la valeur existe et créer une branche en conséquence.
Le tableau suivant décrit les valeurs statistiques disponibles. Les noms clés pour les valeurs individuelles ne sont pas localisés dans les versions régionales de .NET Framework.
Nom de la clé | Description |
---|---|
BuffersReceived |
Renvoie le nombre de paquets Tabular Data Stream (TDS) reçus par le fournisseur à partir de SQL Server après que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
BuffersSent |
Renvoie le nombre de paquets TDS envoyés à SQL Server par le fournisseur une fois que les statistiques ont été activées. Les commandes de grande taille peuvent nécessiter plusieurs mémoires tampons. Par exemple, si une commande de grande taille est envoyée au serveur et nécessite six paquets, ServerRoundtrips est incrémenté d’une unité et BuffersSent est incrémenté de six. |
BytesReceived |
Renvoie le nombre d’octets de données dans les paquets TDS reçus par le fournisseur à partir de SQL Server une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
BytesSent |
Renvoie le nombre d’octets de données envoyés à SQL Server dans les paquets TDS une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
ConnectionTime |
La durée (en millisecondes) pendant laquelle les connexions ont été ouvertes après que les statistiques ont été activées (temps de connexion total si les statistiques ont été activées avant l’ouverture de la connexion). |
CursorOpens |
Retourne le nombre de fois qu’un curseur a été ouvert via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. Notez que les résultats en lecture seule/avant uniquement renvoyés par les instructions SELECT ne sont pas considérés comme des curseurs et n’affectent donc pas ce compteur. |
ExecutionTime |
Retourne la durée cumulée (en millisecondes) que le fournisseur a consacré au traitement une fois les statistiques activées, y compris le temps passé à attendre des réponses du serveur, ainsi que le temps passé à exécuter du code dans le fournisseur proprement dit. Les classes qui incluent le code de minutage sont les suivantes : SqlConnection SqlCommand SqlDataReader SqlDataAdapter SqlTransaction SqlCommandBuilder Pour maintenir le plus petit nombre possible de membres critiques en matière de performances, les membres suivants ne sont pas chronométrés : SqlDataReader Opérateur this[] (toutes les surcharges) 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 |
Retourne le nombre total d’instructions INSERT, DELETE et UPDATE exécutées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
IduRows |
Retourne le nombre total de lignes affectées par les instructions INSERT, DELETE et UPDATE exécutées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
NetworkServerTime |
Retourne la durée cumulée (en millisecondes) que le fournisseur a passé à attendre des réponses du serveur après que l’application a démarré à l’aide du fournisseur et a activé les statistiques. |
PreparedExecs |
Retourne le nombre de commandes préparées exécutées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
Prepares |
Retourne le nombre d’instructions préparées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
SelectCount |
Retourne le nombre d’instructions SELECT exécutées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. Cela comprend les instructions FETCH permettant d’extraire des lignes de curseurs, et le nombre d’instructions SELECT est mis à jour lorsque la fin d’un SqlDataReader est atteinte. |
SelectRows |
Retourne le nombre de lignes sélectionnées une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. Ce compteur reflète toutes les lignes générées par les instructions SQL, y compris celles qui n'ont pas été consommées réellement par l'appelant. Par exemple, la fermeture d’un lecteur de données avant la lecture du jeu de résultats entier n’affecte pas le compteur. Cela comprend les lignes extraites des curseurs à l’aide d’instructions FETCH. |
ServerRoundtrips |
Retourne le nombre de fois que la connexion a envoyé des commandes au serveur et reçu une réponse une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
SumResultSets |
Retourne le nombre de jeux de résultats utilisés une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. Par exemple, cela inclut tous les jeux de résultats renvoyés au client. Pour les curseurs, chaque opération d’extraction ou de récupération de bloc est considérée comme un jeu de résultats indépendant. |
Transactions |
Retourne le nombre de transactions utilisateur démarrées une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques, y compris les restaurations. Si une connexion est en cours d’exécution avec la validation automatique activée, chaque commande est considérée comme une transaction. Ce compteur incrémente le nombre de transactions dès qu’une instruction BEGIN TRAN est exécutée, que la transaction soit validée ou annulée ultérieurement. |
UnpreparedExecs |
Retourne le nombre d’instructions non préparées exécutées via la connexion une fois que l’application a démarré à l’aide du fournisseur et activé les statistiques. |
Extraction d'une valeur
L’application console suivante montre comment activer les statistiques sur une connexion, récupérer quatre valeurs de statistiques individuelles et les écrire dans la fenêtre de la console.
Notes
L’exemple suivant utilise l’exemple de base de données AdventureWorks inclus dans SQL Server. La chaîne de connexion fournie dans l’exemple de code suppose que la base de données est installée et disponible sur l’ordinateur local. Modifiez la chaîne de connexion en fonction des besoins de votre environnement.
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 "...";
}
}
}
Extraction de toutes les valeurs
L’application console suivante montre comment activer les statistiques sur une connexion, récupérer toutes les valeurs statistiques disponibles à l’aide de l’énumérateur et les écrire dans la fenêtre de la console.
Notes
L’exemple suivant utilise l’exemple de base de données AdventureWorks inclus dans SQL Server. La chaîne de connexion fournie dans l’exemple de code suppose que la base de données est installée et disponible sur l’ordinateur local. Modifiez la chaîne de connexion en fonction des besoins de votre environnement.
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 "...";
}
}
}