Bonjour,
je reviens vers vous pour une question d'optimisation.
J'ai une table temporaire remplie avec environ 12 000 données, le but est de vérifier dans chaque donnée si elle est déjà enregistrée dans la table A (correspondance d'id), dans ce cas on fait un update, sinon on fait un insert.
Le soucis est que la procédure stockée que je fais pour le moment prend énormément de temps je trouve environ 3-4mn en local et plus sur le serveur de production.
Voici la partie qui prend du temps, si vous avez une idée, j'ai essayé d'éviter les curseurs (même si j'ai essayé pour voir si c'était plus rapide) :
Il y a sûrement quelque chose de choquant... Mais je ne vois pas où.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 SELECT *, 0 AS OK INTO ##UPDSTAT FROM ##TABLE_TEMP where tiersID not in (select tiersID from ##TABLE_TEMP_Erreurs) -- on commence les verifications, et les insertions while exists(SELECT * FROM ##UPDSTAT WHERE OK = 0) begin -- on démarre une transaction par occurence begin transaction @nomTransaction set @errors=0; -- dans un premier temps, on recupere l'ensemble des informations de la table temporaire SELECT TOP 1 @tiersID = tiersID, raison_sociale = @raisonsociale FROM ##UPDSTAT WHERE OK = 0 ORDER BY 1; print 'On traite : '+cast(@tiersID as varchar(50)); if exists(select * from TABLE_A where tiersID = @tiersID) begin -- maj de la table update TABLE_A set raison_sociale = @raisonsociale where tiersID = @tiersID; set @errors = @errors + @@ERROR --On additionne l'erreur liée à la dernière requête SQL dans notre variable end else begin -- creation de l'info insert into TABLE_A(tiersID, raison_sociale) values (@tiersID, @raisonsociale); set @errors = @errors + @@ERROR --On additionne l'erreur liée à la dernière requête SQL dans notre variable end UPDATE ##UPDSTAT SET OK = 1 WHERE tiersID = @tiersID set @errors = @errors + @@ERROR --On additionne l'erreur liée à la dernière requête SQL dans notre variable -- on verifie si l'on a eu des erreurs ou non, si oui on exporte un fichier d'erreurs sinon on commit les modifications -- si errors est égale à 0, il n'y a eu aucune erreur, on commit la transaction if @errors = 0 begin commit transaction @nomTransaction end else begin -- on annule tous les changements de cette transaction rollback transaction @nomTransaction -- on insère toutes les donnees de la table temporaire dans la table temporaire d'erreurs insert into ##TABLE_TEMP_Erreurs(tiersID,raison_sociale) values (@tiersID,@raisonsociale) end end --fin boucle
Merci de votre aide.
Partager