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 de requete


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut Optimisation de requete
    Bonjour,
    Je possède deux tables T1 et T2, je souhaite copier certaines informations de la table T2 dans ma table T1 (utilisation d'un Update)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T1
    SET T1.val1 = SELECT T2.val1 FROM T2 WHERE T2.guide = T1.guide
    WHERE "ma condition sur T1"
    Le problème, c'est que dans le cas ci-dessus, je ne mets à jour qu'une seule valeur, hors je souhaite en mettre plusieurs car je peux en récupérer plusieurs avec la même requete de sélection...

    En gros je voudrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T1
    SET T1.val1,T1.val2,... = SELECT T2.val1,T2.val2,... FROM T2 WHERE T2.guide = T1.guide
    WHERE "ma condition sur T1"
    Mais il me jette à la virgule après "T1.val1"

    Donc d'après ce que j'ai compris, il faudrait que je fasse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE T1
    SET T1.val1 = SELECT T2.val1 FROM T2 WHERE T2.guide = T1.guide
     , T1.val2 = SELECT T2.val2 FROM T2 WHERE T2.guide = T1.guide
     , T1.*** = SELECT T2.*** FROM T2 WHERE T2.guide = T1.guide
    WHERE "ma condition sur T1"
    Le problème c'est que je souhaite updater 16valeurs alors ça me gêne de devoir faire 16 requete SELECT (identiques, excepté la valeur retournée) d'autant plus que cette requête SELECT est plus compliquée que ci-dessus...

    QQn aurait-il une idée ou un conseil ?

  2. #2
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Est-ce que tes 16 valeurs appartiennent à chaque fois au même enregistrement (à la même ligne) ?

    Dans ce cas, il devrait suffire de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T1
    SET T1.val1 = T2.val1, T1.val2 = T2.val2, T1.val3 = T2.val3,  ...
    WHERE ...
    sinon, je pense que t'as pas le choix et il faudra que tu fasses une requête pour chaque valeur

  3. #3
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut
    Merci pour l'aide...

    En fait j'ai réussi en utilisant des curseurs...

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 554
    Points
    19 554
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par Scorff
    Merci pour l'aide...

    En fait j'ai réussi en utilisant des curseurs...
    Mauvaise idée
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut
    Peut etre mauvaise idée, mais qu'on on est débutant qu'on trouve quelquechose qui marche et qui simplifie la requete... on l'utilise...

    Au lieu de critiquer, propose alors ! Explique pourquoi c'est une mauvaise idée, la critique est facile...

  6. #6
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 554
    Points
    19 554
    Billets dans le blog
    25
    Par défaut
    L'update vous a déjà été fourni par drinkmilk. Le T-SQL permet l'utilisation de la clause FROM dans un UPDATE, ce qui est fort pratique, mais pas possible sous d'autre SGBDR tels que DB2 ou Oracle, où il faut passer par des sous-select (comme ceux appraissant dans votre premier post)

    Le curseur est une mauvaise idée pour des raisons de performances énumérées de nombreuses fois sous ce même forum. Il bufferise souvent plus de données qu'il n'en faut, est lent à "fetcher", pose trop de verrous lents... et surtout est utilisé à mauvais essient : traitement séquenciel dans un language ensembliste.

    Voilà pour ce qui est de la critique facile
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  7. #7
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par fadace
    Le curseur est une mauvaise idée pour des raisons de performances énumérées de nombreuses fois sous ce même forum.
    Quels sont ces performances ?
    Pour info, la requete que je fais passe toutes les nuits, je n'ai donc aucune contrainte horaire.
    De plus actuellement, et ce malgrès la taille conséquente des tables que je manipule le traitement ne dure pas plus de 1min... et cela me convient très bien!
    Pourquoi m'embeter alors à modifier une nouvelle fois ma requête ?

    Surtout que je ne vois pas comment faire d'autre...

  8. #8
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 554
    Points
    19 554
    Billets dans le blog
    25
    Par défaut
    Pour vote premire question, un fetch d'une table est approximativement (ça dépend des versions) 5 fois plus lent qu'un table scan.

    A vous de voir votre façon de programmer ! J'attire juste votre attention que de mauvais plis pris sur de petits traitements sont la cause majeure de près de 80% des demande de tuning sur gros volumes par la suite.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  9. #9
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 91
    Points : 53
    Points
    53
    Par défaut
    Et bien merci pour le conseille...
    Je pense que j'irais faire une petite modif de ma requete dès que j'en aurais le temps.

    En tout cas, merci pour les infos.

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

Discussions similaires

  1. AIdez moi à optimiser cette requete MySQL SVP
    Par petozak dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/09/2005, 15h16
  2. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  3. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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