2008-12-05 5 views
0

J'ai utilisé cmd.Parameters.AddWithValue, et ne spécifiant pas DBType (int, varchar, ...) pour exécuter des requêtes. Après avoir regardé SQL Profiler, il semble que les requêtes exécutées avec cette méthode s'exécutent beaucoup plus lentement que lorsque vous spécifiez le type de données.AddWithValue sans DBType provoquant l'exécution lente des requêtes

Pour vous donner une idée de la lenteur, voici un exemple. La requête est une recherche simple sur une seule table et la colonne dans l'instruction where est indexée. Lors de la spécification du type de données, une certaine requête s'exécute dans environ 0 MS (trop petite pour le serveur SQL sur mesure), et nécessite 41 lectures. Lorsque je supprime le DBType, cela peut prendre environ 200 ms et 10000 lectures pour que la requête se termine. Je ne suis pas sûr si ce n'est que des valeurs de rapport incorrect de SQL Profiler, ou si ces valeurs sont correctes, mais il est reproductible, en ce que je peux ajouter et supprimer le DBType, et il produira les valeurs données dans SQL Profiler .

Quelqu'un d'autre a rencontré ce problème, et un moyen simple de le réparer. Je me rends compte que je pourrais ajouter du type de données partout dans mon code, mais cela semble être un tas de choses à ajouter, et s'il y a un moyen plus simple de le résoudre, ce serait très apprécié.

[EDIT]

Après quelques tests initiaux (les deux scénarios en cours d'exécution dans une boucle), il semble que les valeurs qui profileur donne sont exactes.

Tout comme les informations ajoutées, j'utilise .Net 2.0 sous Windows XP Pro et SQL Server 2000 sous Windows 2000 pour la base de données.

[UPDATE]

Après quelques creuser autour, j'ai pu trouver ce blog post, qui peut être liée. Semble que les valeurs de chaîne dans .Net (puisqu'elles sont unicode) sont automatiquement créées en tant que paramètres nvarchar. Je devrai attendre jusqu'à lundi quand je me mettrai au travail pour voir si je peux faire quelque chose autour de cela qui résout le problème. Pourtant, il semble que je devrais définir le type de données, ce que j'essayais d'éviter. Ce problème ne se présente pas avec toutes les requêtes que j'ai faites, mais seulement quelques-uns, donc je peux toujours utiliser le DBType dans les requêtes avec des problèmes, mais je cherche une solution plus généralisée à la question. problème.

Répondre

0

Quelle est l'instruction SQL générée dans les deux cas?

Je soupçonne qu'il prend la valeur de varchar lorsque vous ne le spécifiez pas explicitement.

par exemple. SELECT OrderId FROM Orders WHERE OrderId = 1001
vs SELECT OrderId FROM Orders WHERE OrderId = '1001'

+0

Le paramètre en question est en fait un champ varchar , donc je ne pense pas que ce serait le problème. – Kibbee

5

Le problème est lié à la façon dont le serveur SQL ne conversions de type implicites. Si vous filtrez une colonne VARCHAR à l'aide d'une valeur NVARCHAR (par exemple N'some text '), SQL n'a pas d'autre choix que de convertir la colonne en NVARCHAR car NVARCHAR ne peut pas être implicitement converti en VARCHAR.

Votre meilleure solution consiste à spécifier le type ou à remplacer votre colonne de base de données par NVARCHAR.

2

Je viens de rencontrer ce problème EXACT. J'ai une base de données héritée avec beaucoup de colonnes de caractères. Sans spécifier le type de colonne, les résultats ont pris quelques minutes sur l'une de mes requêtes. (Il est par défaut nvarchar.) Spécifier le type de colonne a provoqué des résultats en secondes.

cmd.Parameters.AddWithValue("charcolumn", "stringvalue"); 
cmd.Parameters[0].SqlDbType = SqlDbType.Char; 

Je pense que je vais essayer d'avoir chaque requête de chaîne comme un type de char et de voir comment cela se passe.

[modifier]

En fait ... après avoir lu ceci: http://www.u2u.info/Blogs/U2U/Lists/Posts/Post.aspx?ID=11

J'ai décidé d'aller avec cette solution:

cmd.Parameters.AddWithValue(colName, val); 
if(val is string) 
    cmd.Parameters[i].DbType = DbType.AnsiString; 
+0

le lien que vous avez posté n'existe pas. Est-il possible pour vous de le mettre à jour? –

+0

@LuisFilipe: 'DbType' est agnostique pour la base de données, donc il fonctionnerait avec d'autres méthodes de sauvegarde. Au moins, je suppose que c'est de cela qu'il parle. – Guvante

+0

@Guvante: Je demandais juste rasoir pour mettre à jour le lien, si possible. –

Questions connexes