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

MS SQL Server Discussion :

Optimisation d'un curseur [Sql Server 2000]


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut Optimisation d'un curseur [Sql Server 2000]
    Bonjour à tous, je suis autodidacte depuis peu en SQL, et j'ai un soucis sur un curseur qui est censé updater un tres grand nombre d'enregistrements (qq chose comme 100 000).
    Voyez vous comment je pourrais optimiser ca ? (moins de 30sec si possible)
    Merci d'avance !

    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
     
     DECLARE
    @UserCountryCode varchar(30), --Juste pour test
    @Version SMALLINT, -- Juste pour test
       @so0Tel2 VARCHAR(30),
       @so0Var19 VARCHAR(30),
       @so0Tel1 VARCHAR(30),
       @so0Fax VARCHAR(30),
       @pe0Tel_prive VARCHAR(30),
       @sp0Fax VARCHAR(30),
       @sp0Tel VARCHAR(30),
       @sp0Mobile_phone VARCHAR(30),
       @NRID DECIMAL
     
    set @UserCountryCode='ES' --Juste pour test
    set @Version=1 --Juste pour test
     
     DECLARE curs_So0PhNbr CURSOR FOR SELECT nrid, tel2, var19, tel1, fax FROM SYSADM.so0 WHERE var2 = @UserCountryCode and template IS null 
     DECLARE curs_pe0PhNbr CURSOR FOR SELECT pe0.nrid, pe0.tel_prive, sp0.fax, sp0.tel, sp0.mobile_phone FROM SYSADM.pe0 pe0 LEFT OUTER JOIN SYSADM.sp0 sp0 ON pe0.nrid=sp0.pe0_nrid WHERE var1 = @UserCountryCode and pe0.template IS null and sp0.template IS null
     
     OPEN curs_So0PhNbr
     FETCH curs_So0PhNbr INTO @NRID , @so0Tel2, @so0Var19, @so0Tel1, @So0Fax 
     WHILE @@FETCH_STATUS = 0
     BEGIN
        UPDATE SYSADM.so0 SET tel2=SYSADM.fct_FormatNbr(@so0Tel2,@Version),
    			  var19=SYSADM.fct_FormatNbr(@so0Var19,@Version),
    			  tel1=SYSADM.fct_FormatNbr(@so0Tel1,@Version),
    			  fax=SYSADM.fct_FormatNbr(@so0Fax,@Version) 
    	              WHERE nrid=@NRID
        FETCH curs_So0PhNbr INTO @NRID , @so0Tel2, @so0Var19, @so0Tel1, @So0Fax
     END
     
     CLOSE curs_So0PhNbr
     DEALLOCATE curs_So0PhNbr
     
      OPEN curs_Pe0PhNbr
     FETCH curs_Pe0PhNbr INTO @NRID, @pe0Tel_prive, @sp0Fax, @sp0Tel, @sp0Mobile_phone
     WHILE @@FETCH_STATUS = 0
     BEGIN	
        UPDATE SYSADM.pe0 SET tel_prive=SYSADM.fct_FormatNbr(@pe0Tel_prive,@Version) 
    		      WHERE nrid=@NRID
        UPDATE SYSADM.sp0 SET fax=SYSADM.fct_FormatNbr(@sp0Fax,@Version), 
    			  tel=SYSADM.fct_FormatNbr(@sp0Tel,@Version),
    			  mobile_phone=SYSADM.fct_FormatNbr(@sp0Mobile_phone,@Version)
    		      WHERE pe0_nrid=@NRID
        FETCH curs_Pe0PhNbr INTO @NRID, @pe0Tel_prive, @sp0Fax, @sp0Tel, @sp0Mobile_phone
     END
     
     CLOSE curs_Pe0PhNbr
     DEALLOCATE curs_Pe0PhNbr
    On m'a dit par exemple que c'était possible de faire des opérations sur l'enregistrement courant au lieu d'un update...pensez vous que ca résoudrait mon probleme ? et comment faire ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 404
    Points
    28 404
    Par défaut
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Conseils à lire avant de poster sur ce forum

  3. #3
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Le mieux est d'oublier de faire cette requête avec un curseur mais de la faire en SQL pur qui est beaucoup plus adapté.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Merci de vos réponses.
    al1_24 j'ai ajouté l'information dans le titre (c'est suffisant ?)

    phili_b : mais dans ce cas comment faire ? je ne peux pas faire un mass-update et il faut bien que je traite mes enregistrements un par un.
    A quelle solution penses-tu ?

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par nox75 Voir le message
    je ne peux pas faire un mass-update
    si. ou alors en plusieurs requête mais en pur SQL.
    Citation Envoyé par nox75 Voir le message
    il faut bien que je traite mes enregistrements un par un.
    non

    Le souci c'est que ta requête a l'air bien compliquée alors qu'elle fait appel à une seule table. Il faudrait que tu expliques en français, et non en SQL, ce que tu veux. Ce qui ne dispense pas de la structure de la table, structure que tu as indirectement décrite.

    Donc je te propose une requête avec le principe ci-dessous. Mais je pense qu'on peut faire beaucoup beaucoup plus simple, en effet je soupçonne que ton besoin est très simple en fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE S 
    SET tel2=S.fct_FormatNbr(s1.Tel2,@Version),
    			  var19=S.fct_FormatNbr(s1.Var19,@Version),
    			  tel1=S.fct_FormatNbr(s1.Tel1,@Version),
    			  fax=S.fct_FormatNbr(s1.Fax,@Version) 
    FROM SYSADM S
    	  INNER OUTER JOIN SYSADM.sp0 S1 
    ON s.nrid=s1.pe0_nrid AND  var2 = @UserCountryCode AND template IS NULL
    	  LEFT OUTER JOIN SYSADM.sp0 S2 
    ON s.nrid=s2.pe0_nrid AND var1 = @UserCountryCode AND s.template IS NULL AND s2.template IS NULL

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Merci je vais regarder ta solution tout de suite !

    Et au temps pour moi c'est vrai qu'une description en francais ca n'aurait pas fait de mal.

    J'ai une table so0 contentant des sociétés et une table pe0 contenant des personnes, plus une table de lien sp0.
    Je veux, pour toutes les sociétés ayant le code pays @UserCountryCode, updater les champs correspondants à des numéros de téléphone en enlevant tous les caracteres autres que des chiffres (réalisé par la fonction fct_FormatNbr)

  7. #7
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    good.
    Par contre c'est le principe de ma requête qu'il faut suivre et non faire un copier coller. En effet je me suis emmêlé les pinceaux et j'ai repris la même table alors qu'en fait ce sont des tables différentes.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Oui mais je crois que j'ai saisi le principe
    Je vais essayer de remettre ca en forme et je posterai le résultat !
    merci !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Ca a l'air de marcher !

    Merci beaucoup !

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

Discussions similaires

  1. Optimisation base de données SQL Server 2000: Indexation
    Par Mouckson dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/05/2012, 01h39
  2. [SQL SERVER 2000]Comment éviter l'utilisation de curseur
    Par TiteCoCo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/04/2008, 09h13
  3. [SQL Server 2000] Optimisation traitement
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/02/2008, 11h22
  4. Optimisation Update sur SQL SERVER 2000
    Par Hansen69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/12/2007, 22h17
  5. Réponses: 1
    Dernier message: 06/08/2007, 11h02

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