LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
30 janv. 2008 à 13:42
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
21 janv. 2009 à 11:36
Bonjour,
je debute en SQL, je precise avant tout!
je programme actuellement un petit logiciel sous VC++ et j'effectue quelques requetes SQL pour attaquer une base SQL SERVER EXPRESS
je me retrouve confronté à un probleme pour insérer ou faire un update d'une table avec un tableau 2dimensions tab[50][200]
je voudrais pouvoir insérer chaque élement de ce tableau dans ma table et ce ci en une seule requete
car actuellement je fais une requete pr chaque element : tab[0][0] puis tab[0][1] etc.... -->tab [50][200]
ce qui me donne enormement de requetes au final!
je voudrais donc savoir si il n'y a pas moyen de changer ma requete ou ma table pour insérer mon tableau entier en 1 seule requete...
Merci de votre aide !
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 31 janv. 2008 à 22:06
Salut
Si c'est la meme valeur, c'est un
update matable
set value = valeur
si c'est une plage
update matable
set value = valeur
where id = (select id from matable ...jointure where ..)
si toutes valeurs c'est different c'est 1 requete par valeur
mais il est possible de faire des :lots
en concatenant les requetes dans la meme commande ado
a la place de faire un update par commande
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 1 févr. 2008 à 09:37
Salut et merci,
je me situe dans ce cas la :
"si toutes valeurs c'est different c'est 1 requete par valeur
mais il est possible de faire des :lots
en concatenant les requetes dans la meme commande ado
a la place de faire un update par commande"
aurais tu un exemple pour un lot de requetes STP?
sinon,
Bulk INSERT j'avais trouver mais ca ne correspond pas car a priori ca permet d'insérer le contenu d'un fichier...
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 1 févr. 2008 à 15:23
C'est simple tu mets toutes les requetes à la queuleuleu séparé par un ;
Et apres tu lances tout dans la même commande
Attention, il faut eviter que ta commande sont trop grosse pour eviter d'engorger
SQL server (il faut pas je pense mettre 1 millions de update dans une commande par exemple) faire des lots de 1000 ou 2000 requetes doit etre intérressant.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 4 févr. 2008 à 10:57
Salut,
Bon apres tests j'ai réussi à effectuer un lot de 6000 requetes en 42secondes....
ce qui me parait assez performant, le probleme est que pour mon programme c'est bien trop lourd
car beaucoup de choses à gérer...
nhervagault
Messages postés6063Date d'inscriptiondimanche 13 avril 2003StatutMembreDernière intervention15 juillet 201137 4 févr. 2008 à 20:26
As-tu des index sur ta table dans laquelle tu inseres si oui tu les supprimes et tu les rejoutes apres?
As-tu des triggers sur les insertions?
Il y a surement une cause. Et ton temps est juste le test SQL, d'insertion, il y a pas de code avant et apres le code SQL.
Il y a pas d'opération de chaine de caracteres trop importante, car ca plombe la mémoire des fois.
dans des langages avec VM c#, java et autre les strings sont immuables et donc
reconstruites a chaque fois en c++ je ne sais pas comment, c'est géré.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 5 févr. 2008 à 11:00
alors non je n'ai pas d'index, ni de triggers la table est défini simplement avec 3 champs ...
le temps est au debut et a la fin de la fonction et non pas de la requete mais a mon avis c'est pareil...
les opérations de chaines de caracteres pour créer mes requetes ont l'air de se passer en moins d'une seconde...
a mon avis 6000 requetes en 45secondes c'est le mieux possible, non? ca fait 0.005sec par requete!
t'en penses quoi?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 5 févr. 2008 à 11:17
la requete en elle meme met environ 38 secondes a s'effectuer...
le probleme est que a chaque appel de cette fonction je dois reconstruire mes chaines
donc en gros faut qd mm compter 45sec a chaque appel
et dans mon cas ce n'est pas acceptable, malheureusement!
bekri_abd
Messages postés5Date d'inscriptionsamedi 29 juillet 2006StatutMembreDernière intervention21 janvier 2009 21 janv. 2009 à 11:32
utilise un procedure stockee dans la base avec autant de parammetres que dans le tableau
avec un insert into
puit dans ton prgramme tu appelle la procedure dans une boucle en parcourant le tableau
jusqu'a la fin en prenant comme parammetres les donnees du tableau