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

Oracle Discussion :

[Oracle SQL toutes versions] UPDATE massif


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut [Oracle SQL toutes versions] UPDATE massif
    Bonjour,

    Comment faire un UPDATE massif optimisé (donc le plus rapidement possible) sous Oracle?

    Prenons un cas d'école :

    J'ai deux tables A et B qui contiennent ces données :

    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
     
     
         A
    +----+-----+
    | Id | Val |
    +----+-----+
    | 1  | 50  |
    | 2  | 60  |
    | 3  | 10  |
    | 4  | 20  |
    +----+-----+
     
         B
    +----+-----+
    | Id | Val |
    +----+-----+
    | 1  | 70  |
    | 2  | 10  |
    | 3  | 60  |
    | 4  | 40  |
    +----+-----+
    Je souhaite que dans A, Val devienne Val de A + Val de B.

    Sous Sybase, cette syntaxe EST autorisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE A
    SET val = A.val + B.val
    FROM A, B
    WHERE A.Id = B.Id
    Sous Oracle, cette syntaxe est interdite (ce qui est bien dommage, car elle permet de n'ouvrir qu'un seul curseur....).
    Si j'ai bien compris, sous Oracle, je dois donc faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE A
    SET val = val + (SELECT B.val FROM B WHERE B.Id = A.Id)
    Ici, on se rend bien compte que Oracle va ouvrir un curseur sur B pour chaque row de A.... Pour des petites tables, aucune incidence, mais je suis intimement convaincu que si les tables A et B sont grosses, Oracle mettre beaucoup plus de temps à exécuter la requête que Sybase....

    Toute suggestion est la bienvenue...

    Merci d'avance.

    Nico'

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Points : 166
    Points
    166
    Par défaut
    mais je suis intimement convaincu que si les tables A et B sont grosses, Oracle mettre beaucoup plus de temps à exécuter la requête que Sybase....
    Avant de tirer une conclusion, je préfèrerais faire un test! Oracle est systématiquement développé pour faire des jointures...

    Généralement, il est vrai qu'il n'est pas des plus performant de faire un update de la sorte. Une solution est de recréer la table souvent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table a2 as select a.id id, a.val + b.val
    from a, b
    where a.id = b.id
    et de remplacer l'ancienne table par la nouvelle... Je te garantie que cette solution est performante, mais parfois, il est impossible de le faire, à cause de packages qui pointent sur la table, de foreign key etc... Souvent, pour les packages, une simple recompilation suffit...

    Il n'y a pas de solutions miracles s'il y a une charge a exécuter et qu'elle doit l'être, elle doit l'être!

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/07/2014, 02h11
  2. Versioning avec Oracle SQL Developer
    Par Invité dans le forum Sql Developer
    Réponses: 0
    Dernier message: 30/09/2008, 16h24
  3. [Oracle 9.1] Plantage update SQL et Timestamp
    Par ftrifiro dans le forum Oracle
    Réponses: 6
    Dernier message: 06/10/2005, 15h34
  4. Connexion SGBD Oracle-SQL langage C/C++
    Par K2004 dans le forum Interfaces de programmation
    Réponses: 4
    Dernier message: 10/02/2004, 20h01
  5. SQL SERVER version gratuite ?
    Par Kcintim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/09/2003, 15h03

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