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 :

[9i] Instruction FORALL


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Par défaut [9i] Instruction FORALL
    Bonjour,

    J'effectue un update sur une table en utilisant l'instruction FORALL.

    Les valeurs de clauses sont définies dans des collections.

    Je fais

    FORALL i in tab1.First..tab1.Last
    update table set champ=1
    where condition1 = tab1(i);

    A noter que le tableau tab1 comporte 1 800 000 occurrences.

    Lorsque j'exécute l'ordre via SQLPlus j'obtiens un temps de 1 minute.

    Lorsque l'ordre est exécuté dans un batch, il prend au moins 7 heures avec un volume de buffer reads de 50 000 000 !.

    Quelqu'un pourrait-il me donner un tuyau sur l'origine du problème et de sa solution ?

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Les infos que vous donnez sont insuffisante.

    le code exécuté sous Sql*Plus est-il le même que dans votre "batch" ?

    comment pouvez-vous dire que c'est l'instruction FORALL qui justifie un tel écart ?

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Par défaut
    Le code SQLPlus effectue les opérations suivantes :

    <SQL>

    cursor curDoss is
    select * from Table_Dossier;

    type grTab is table of varchar2(10) index by binary_integer;
    tab_doss grTab;
    i integer;
    j integer;

    begin

    -- initialisation du tableau
    for doss in curSoss loop
    tab_doss(i):=doss.champ;
    i:=i+1;
    end loop;

    --mise à jour
    forall j in tab_doss.first..tab_doss.last
    update table_dossier
    set champ2=4
    where champ=tab_doss(j);

    end;

    </SQL>

    Le code exécuté dans le batch correspond exactement à la partie de mise à jour. Par contre le tableau tab_doss est alimenté dans une boucle en amont.

    La différence est donc qu'il n'y a pas de select sur la table Table_Dossier.

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Bizarre...

    au passage, tant qu'à utiliser les collections, vous gagneriez encore du temps en valorisant votre collection avec le BULK COLLECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Declare
    cursor curDoss is 
      select Champs from Table_Dossier; 
    Begin
    -- initialisation du tableau 
    Open  curSoss ;
    Fetch curSoss BULK COLLECT Into tab_doss ;
    Close curSoss ;
    ...
    End;

Discussions similaires

  1. Instructions ROL et ROR
    Par bigbang dans le forum Assembleur
    Réponses: 13
    Dernier message: 01/03/2003, 02h06
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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