Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1028 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Perte de performance sur boucle Insert

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Perte de performance sur boucle Insert

n°1082100
lordkoko
Posté le 13-05-2005 à 12:29:53  profilanswer
 

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 !

mood
Publicité
Posté le 13-05-2005 à 12:29:53  profilanswer
 

n°1082174
denzz
huhuuuuu ! (désolé )
Posté le 13-05-2005 à 13:34:26  profilanswer
 

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 ...

n°1082189
lordkoko
Posté le 13-05-2005 à 13:46:45  profilanswer
 

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

n°1082446
denzz
huhuuuuu ! (désolé )
Posté le 13-05-2005 à 15:47:02  profilanswer
 

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 ?

n°1082456
lordkoko
Posté le 13-05-2005 à 15:52:14  profilanswer
 

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

n°1082469
cinocks
Posté le 13-05-2005 à 16:00:58  profilanswer
 

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
n°1082551
gizmo
Posté le 13-05-2005 à 17:01:25  profilanswer
 

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

n°1082574
lordkoko
Posté le 13-05-2005 à 17:06:51  profilanswer
 

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

n°1082622
gizmo
Posté le 13-05-2005 à 17:51:47  profilanswer
 

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.

n°1082635
lordkoko
Posté le 13-05-2005 à 18:01:35  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Perte de performance sur boucle Insert

 

Sujets relatifs
insert incompletboucle for
Ecriture données provenant d'une bouclePerformance du bench vmark de volano
BOUCLE[JAVA] Boucle de dessin...
Boucle "for" qui ne fonctionne pas totalement ( panier )requete boucle dans plan de salle
Je voudrais utilisé une boucle whileBOUCLE
Plus de sujets relatifs à : Perte de performance sur boucle Insert


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR