IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Optimisation d'un UPSERT


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut Optimisation d'un UPSERT
    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) :
    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
    Il y a sûrement quelque chose de choquant... Mais je ne vois pas où.
    Merci de votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par Marty000 Voir le message
    Bonjour,
    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.
    Si vous travaillez avec une version de SQL SERVER >= 2005 alors utiliser
    MERGE. ici une petite démo de MERGE

    De + il me semble que l'utilisation de variable table @table est plus conseillé (performant) que l'utilisation de table temporaire ##table .
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut
    Merci pour votre réponse,
    malheureusement j'ai oublié de le préciser je suis sous SQL Server 2005, je vais essayer de modifier les tables temporaires.
    Si vous avez d'autres idées, merci.

  4. #4
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par Marty000 Voir le message
    Merci pour votre réponse,
    malheureusement j'ai oublié de le préciser je suis sous SQL Server 2005, je vais essayer de modifier les tables temporaires.
    Si vous avez d'autres idées, merci.
    Tu peux donc utiliser MERGE et les variables table sous SQL 2005.
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut
    D'après le lien http://technet.microsoft.com/fr-fr/l.../bb510625.aspx, je vois qu'il n'est disponible sous SQL Server 2008, pareil pour ce lien : http://www.developpez.net/forums/d90...ql-server2005/

    Il ne me reconnait pas le mot clé MERGE

  6. #6
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    dsl
    Etienne ZINZINDOHOUE
    Billets-Articles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 12h49
  2. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 09h54
  3. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 14h27
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 09h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo