2009-02-05 8 views
1

Lorsque vous accédez à des valeurs d'un SqlDataReader est-il une différence de performance entre ces deux:SqlDataReader différences de performance dans l'accès aux valeurs?

string key = reader.GetString("Key"); 

ou

string key = reader["Key"].ToString(); 

Dans cet exemple de code:

string key; 

using (SqlDataReader reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     key = reader.GetString("Key"); 
     // or 
     key = reader["Key"].ToString(); 
    } 
} 

Répondre

3

Je viens de jeter un coup d'œil dans le code source .NET, et les deux méthodes d'accès sont essentiellement les mêmes. La seule différence est que la seconde fait une boxe supplémentaire. Ainsi, le premier correspond à quelque chose comme (dans le cas des types élémentaires):

int key = GetInternalSQLDataAsInt32("Key"); 

tandis que le second serait:

int key = (int)(object)GetInternalSQLDataAsInt32("Key"); 

La fonction GetInternalSQLDataAsInt32 (...) représente la bibliothèque de données SQL machines de rassemblement des données de SQL vers .NET. Mais, comme indiqué plus haut, une différence plus importante peut être attendue entre les clés basées sur des chaînes et les clés ordinales.

1

Même s'il est , il est peu probable que ce soit significatif par rapport au coût d'obtention des données tabase en premier lieu.

Personnellement, je préfère la première version - cela montre que je m'attends à ce que la colonne soit une colonne de chaîne, plutôt que de prendre un nombre et de le convertir en une chaîne.

0

Bien que votre code ait besoin d'être modifié; L'utilisation de l'ordinal est la méthode la plus rapide.

3

MVP Microsoft a écrit une entrée de blog à ce sujet: http://jeffbarnes.net/portal/blogs/jeff_barnes/archive/2006/08/09/Maximize-Performance-with-SqlDataReader.aspx

Voici ses conclusions:

        .NET 1.1 .NET 2.0 
Ordinal Position:     8.47  9.33 
Get Methods:      11.36  8.07 
Case Sensitive:      14.51  12.53 
Case Insensitive (All Upper):  13.93 12.23 
Case Insensitive (All Lower):  14.47 12.48 
Case Insensitive (Mixed):   14.48 12.57 

Mais vraiment, à moins que vous avez affaire à un nombre important de lignes, il est Cela vaut la peine de s'inquiéter.