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

SQL Oracle Discussion :

Validité d'un curseur si des commit sont fait ?


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut Validité d'un curseur si des commit sont fait ?
    Bonjour,

    Alors voila mon problème. Je dois reprendre un code qui fait la purge d'une table (de très grande taille), parce qu'il est trop lent.
    La requete supprime les x premieres lignes, puis si le nombre de ligne supprimée est égal a x, on recommence, jusqu'a ce qu'il n'y ait plus de ligne a supprimer.
    Il n'est pas possible de faire le delete en une seule passe, parce que sinon, vu la taille de la table, on explose la taille du rollback segment.

    Le problème de performance vient apparament du fait que la requete qui fait la suppression des x premieres lignes, reexecute a chaque fois sa clause where qui est assez complexe.
    Si je fait le select (pour avoir tous les id des lignes à supprimer) une seule fois dans un curseur, et que je parcours ce curseur pour faire mes suppressions, et toutes les x suppressions, je fait mon commit.
    Est-ce que le fait de faire un commit va "perturber" le contenu de mon curseur ou pas ?

    En d'autres termes, est-ce qu'un curseur est viable d'un bout a l'autre alors qu'on fait des commits sur la table d'où est tirée le curseur ?

    Accesoirement, si vous avez d'autres solutions simples pour faire ce vidage de table, je suis preneur ^^

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par Rakken Voir le message
    Alors voila mon problème. Je dois reprendre un code qui fait la purge d'une table (de très grande taille), parce qu'il est trop lent.
    La requete supprime les x premieres lignes, puis si le nombre de ligne supprimée est égal a x, on recommence, jusqu'a ce qu'il n'y ait plus de ligne a supprimer.
    Il n'est pas possible de faire le delete en une seule passe, parce que sinon, vu la taille de la table, on explose la taille du rollback segment.
    La table est vidée totalement ? Si non, dans quelle proportion : un tiers est supprimé, la moité ?

    Citation Envoyé par Rakken Voir le message
    Est-ce que le fait de faire un commit va "perturber" le contenu de mon curseur ou pas ?

    En d'autres termes, est-ce qu'un curseur est viable d'un bout a l'autre alors qu'on fait des commits sur la table d'où est tirée le curseur ?
    Le curseur est ouvert, il est ouvert... un commit ne touche en rien son contenu.


    Accesoirement, si vous avez d'autres solutions simples pour faire ce vidage de table, je suis preneur ^^[/QUOTE]

    BULK COLLECT, LIMIT et DELETE par paquet.

    http://sheikyerbouti.developpez.com/...age=Chap5#L5.5

  3. #3
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Le curseur est ouvert, il est ouvert... un commit ne touche en rien son contenu.
    Une exception, la clause "FOR UPDATE" - on peut obtenir ORA-01002.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create table t (a number);
     
    insert into t (a) values (1);
    insert into t (a) values (2);
     
    begin
      for r in (select a from t for update) loop
        commit;
        dbms_output.put_line (to_char (r.a));
      end loop;
    end;
    /

  4. #4
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Ok, merci beaucoup !

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

Discussions similaires

  1. Savoir si des données sont écrites sur un flux
    Par zapatta dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 12h27
  2. Réponses: 3
    Dernier message: 02/03/2006, 21h54
  3. [Data] Où sont fait les commit ?
    Par joseph_p dans le forum Spring
    Réponses: 2
    Dernier message: 10/01/2006, 17h05
  4. verifier si des user sont connéctés à une base Paradox
    Par JCDC dans le forum Bases de données
    Réponses: 1
    Dernier message: 28/11/2005, 13h28

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