Perte de performance sur boucle Insert

Perte de performance sur boucle Insert - SQL/NoSQL - Programmation

Marsh Posté le 13-05-2005 à 12:29:53    

Bonjour,
 
Afin de remplir une table SQL comprenant 3 colonnes, je réalise une boucle (c#) avec un Insert
 
foreach(DataRow row in ds.Tables["temp"].Rows)
{
p1 = procédure de calcul simple dépendante du row en cours
p2 = procédure de calcul simple dépendante du row en cours
p3 = procédure de calcul simple dépendante du row en cours
 
SqlSelectCommand1.CommandText = "INSERT INTO MaTable VALUES ('" + p1 + "', '" + p2 + "', " + p3 + " );";
SqlSelectCommand1.ExecuteNonQuery();
}
 
les paramètres p1 p2 et p3 étant calulé dans cette même boucle
 
Cette boucle met 15 secondes pour insérer 800 lignes... c'est trés long compte tenu de l'opération réalisée.
 
Auriez vous un conseil ?
 
Merci d'avance !

Reply

Marsh Posté le 13-05-2005 à 12:29:53   

Reply

Marsh Posté le 13-05-2005 à 13:34:26    

a mon humble avis (je sens qu'il y aura encore qqun pr me rembarrer) le pb ne se situe pas au niveau des insert mais de ta boucle qui doit mettre du temps ..
as-tu fait des tests pour voir combien de temps met ta procédure sans exécuter la requête ?
sinon, une option pourrait être de concaténer tes insert et de ne lancer la suite d'insert qu'après la fin de ta boucle, mais je ne suis pas certain que ca améliorerait les perf ...

Reply

Marsh Posté le 13-05-2005 à 13:46:45    

Merci pour ta proposition,
 
En mettant en commentaire le slSelectCommand1.ExecuteNonQuery(); , c'est à dire en supprimant l'exécution de la requête, je passe à moins d'une seconde pour le traitement.
 
Donc je ne pense pas que cela vienne de la boucle ou des calculs (qui sont en fait une conversion de format de date et le remplacement d'un caractère dans une chaîne)
 
Je vais essayer de concatener mes insert pour n'envoyer qu'une seule requête.
En tout cas merci beaucoup !
 
D'autres idées ou propositions ?
 
Merci d'avance

Reply

Marsh Posté le 13-05-2005 à 15:47:02    

sinon, de gros pb de performances sur des insert peuvent être liés aux index mis en place sur ta table .....
certains types d'index entraînent en effet une réorganisation sur chaque insert.. et c donc très coûteux.. as-tu mis en place des index "perso" sur cette table ?

Reply

Marsh Posté le 13-05-2005 à 15:52:14    

Non c'est une table trés simple qui contiendra au + 1000 enregistrement et qui sera vidée avant chaque boucle d'insert...  

Reply

Marsh Posté le 13-05-2005 à 16:00:58    

Dans ce cas, le SGBD peut etre long à la detente. 15ms de latence, 5ms d'insertion + index, et les 15s sont là.


---------------
MZP est de retour
Reply

Marsh Posté le 13-05-2005 à 17:01:25    

ton SGDB ne possède-t-il pas de commande pour l'insertion par lot?

Reply

Marsh Posté le 13-05-2005 à 17:06:51    

Je ne connais pas ce principe d'insertion pas lot. Je travaille avec SQL Server 2000.
 
Peux tu m'en dire un peu plus STP ?
 
Merci

Reply

Marsh Posté le 13-05-2005 à 17:51:47    

bah je ne connais pas suffisament SQL Server, mais beaucoup de SGDB disposent d'un fonction pour faire toute une série d'insertion en une seule étape, pour éviter justement les boucles et les appels consécutifs à la DB. Il faut se renseigner pour voir si SQL Server le propose.

Reply

Marsh Posté le 13-05-2005 à 18:01:35    

Conclusion du post ici :
http://forum.hardware.fr/hardwaref [...] m#t1082518
 
Je suis passé à moins d'une seconde en utilisant des SELECT et des UNION ALL
 
Merci à tous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed