C# SQL insert de commande
Quelqu'un peut me dire les 2 façons de l'insertion d'enregistrement crée de meilleures performances?
Cas 1
SqlCommand cmd = new SqlCommand();
for (int i = 0; i < 10000; i++)
{
cmd = new SqlCommand("insert into test(id, name) value('" + i + "', '" + i + "')");
cmd.ExecuteNonQuery();
}
Cas 2
string sql = null;
for (int i = 0; i < 10000; i++)
{
sql += "insert into test(id, name) value('" + i + "', '" + i + "')";
}
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
Avez-vous l'exécution d'un simple test de chronométrage? Exécuter chacun de 10 000 fois, et de voir celui qui s'exécute plus rapidement.
De même, mais le cas est préférée. Même parce que vous allez utiliser le regroupement de connexion.
Tout d'abord: STOP la concaténation de votre code SQL!! C'est une invitation à hacker de vous attaquer avec injection SQL! Utiliser les requêtes paramétrées à la place!
vraiment?!?!?? Vous pensez que la création de 10'000
Vous avez raison, il serait plus rapide.
De même, mais le cas est préférée. Même parce que vous allez utiliser le regroupement de connexion.
Tout d'abord: STOP la concaténation de votre code SQL!! C'est une invitation à hacker de vous attaquer avec injection SQL! Utiliser les requêtes paramétrées à la place!
vraiment?!?!?? Vous pensez que la création de 10'000
SqlCommand
instances et de leur exécution, un par un, est tout aussi rapide que la création d'une instance unique et l'exécution par juste une fois???Vous avez raison, il serait plus rapide.
OriginalL'auteur RoyT | 2011-11-21
Vous devez vous connecter pour publier un commentaire.
Tout d'abord: ARRÊTER la concaténation de votre code SQL!! C'est un invitation aux pirates partout à vous attaquer à injection SQL! Utilisation requêtes paramétrées, à la place!
Je voudrais utiliser cette solution: créer un unique
SqlCommand
avec une requête paramétrée, et les exécuter:ou de l'utilisation
SqlBulkCopy
, surtout si vous êtes l'insertion de même plus de 10'000 lignes.Alors que j'ai l'habitude d'accord que le passage en unsanitized directement des paramètres de SQL concaténée est mauvais - dans le cadre de ce code, il est littéralement à couvert. Il n'y a aucune Entrée d'Utilisateur valeurs à être concernés par l' - il ressemble à une petite opération.
OriginalL'auteur marc_s
La deuxième approche semble plus rapide que le #1 parce que vous envoyer les commandes INSÉRER à la fois. Dans la première, il y a un aller-retour vers le serveur SQL pour chaque ExecuteNonQuery.
Mais vous devriez essayer d'insertion en bloc de commande: BULK INSERT (Transact-SQL), je suppose que vous allez obtenir un meilleur rendement que les options que vous avez fournis.
[]
Je pense que la réponse est beaucoup approprié. Il n'a pas directement répondu à la question parce que l'OP est à l'aide d'un processus inefficace. J'ai un pressentiment que l'OP n'est pas à la recherche d'exactement qui consiste à utiliser de moins en moins de cycles de PROCESSEUR (comme qu'ils pouvaient facilement se tester eux-mêmes si c'était exactement ce qu'ils voulaient savoir). Au lieu de cela, je crois que l'OP est d'essayer de comprendre ce qui est plus efficace, et Fabio a fourni une solution meilleure que l'autre de l'OP.
Il n'a pas. Comme vous l'avez dit, c'est une troisième option. Parfois, nous n'avons pas exactement la réponse que nous voulons, mais nous avons eu somwthing qui nous font voir les choses d'un autre point de vue. []
J'ai vraiment hate de voir les réponses upvoted quand ils ne réponds pas à une question très précise qui a été demandé.
Si c'est une troisième option, c'est bien d'ajouter une note de bas de page à la réponse qui répond vraiment à la question posée, ou en commentaire à la question d'origine. Ce n'est pas une réponse à la question posée, et ne devrait pas être affiché comme tel. Je pouvais avoir juste downvoted ou marqués comme "ne répond pas"; je n'ai pas. J'ai donné l'affiche ainsi l'occasion d'élargir la réponse ou de l'effacer. Les réponses devraient effectivement faire - répondre à la question posée. D'autres conseils ou d'informations sur les solutions de remplacement peuvent être fournies.
OriginalL'auteur Fabio
Il convient de noter exactement ce que fait, ni en cas de travail.
Cas n ° 1 nécessite une connexion à préciser.
Cas n ° 2 vous oblige à la fin de vos déclarations avec un point-virgule dans le but d'exécuter plusieurs commandes, comme suit:
En fin de compte la meilleure façon serait pour vous de le tester vous-même sur plusieurs milliers de lignes. Mon deviner serait que le Cas n ° 2 serait mieux pour les performances, car non seulement serait-il exiger la mise en place d'un seul
SqlCommand
objet, mais elle ne touche que la base de données qu'une seule fois.OriginalL'auteur Kiley Naro
Je ne pense pas que le deuxième on va travailler.
Il y a cependant une syntaxe de SQL Server 2008 pour insertion de plusieurs lignes en une seule instruction INSERT et je pense que ce sera plus rapide que les deux options vous est proposé:
Mais si vous voulez vraiment de haute performance, l'utilisation de la
SqlBulkCopy
classe.OriginalL'auteur Mark Byers
Le second est probablement plus rapide, parce que vous vous retrouvez avec un seul aller-retour. Les deux sont tout aussi terrible, parce que vous n'utilisez pas les requêtes paramétrées.
OriginalL'auteur dasblinkenlight