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 :

delete ou truncate


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut delete ou truncate
    Bonjour,

    J'ai une table dans laquelle je souhaite supprimer env 45000 lignes.
    Comment dois je proceder ?
    Je sais que faire un delete est tres couteux mais pourquoi ?
    parcequ'oracle est obliger de garder une sauvegarde des lignes pour pouvoir faire un rollback.
    supposons que je fasse un delete, mis a part que cela prenne des heures,
    je risque quoi ?de saturer un tablespace et que ma base soit hs ?


    comment pourrai je faire?
    sachant que je souhaite supprimer des données qui sont arrivé
    entre le 10/07/2009 à 08:00:00 et le 11/07/2009 à 11:00:00?


    Merci a tous pour vos réponses.

  2. #2
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    A partir du moment ou toutes les lignes ne doivent pas etre supprimees, TRUNCATE n'est pas une option.

    Combien en pourcent representent les lignes supprimees ?

    Nicolas.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    cela represente environ 1% de la table

  4. #4
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par donny Voir le message
    cela represente environ 1% de la table
    Alors le DELETE est probablement l'option la plus raisonnable.

    Nicolas.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    ok
    et il va prendre combien de temps ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ma boule de cristal me dit neuf minutes.
    Les autres ?

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    je pense pas que sa prendra 9 minutes
    je pense plus que sa prendra plus d'une heure voir plus.
    j'ai du mal a saisir en quoi c'est plus optimal

  8. #8
    Membre émérite Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Par défaut
    9 minutes dis-tu Waldar, moi je dirais...voyons ... 45 000 lignes x un bloc de 8K + l'undo_retention / high water mark de la table, j'y ajoute log_buffer + redo_log/128... allez, à vue de nez... 1/100 du temps d'un delete complet de la table.

    @donny : sans vider complètement la table, tu n'as pas d'autres option que le delete.
    Si tu veux l'accélérer :
    - tu met la table et ses index en mode nologging => bien moins de redo générés
    - tu drop les index de la table (hors clé primaire)

    Et tu fais l'inverse après le commit;

    Ce qui va être long c'est : génération d'undo, de redo, check des foreign key et déclenchement des triggers.

  9. #9
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    9 minutes pour supprimer 45000 lignes... hmmm... pas gegene ta becanne... moi je dirais... heu... j'en sais rien !

    Plus serieusement, personne ne peut repondre a ce genre de question.
    Beaucoup trop de parametres a prendre en compte comme la version d'Oracle, l'OS, le(s) CPU(s), les indexes, les disques et types d'arrays....

    Mais bon, ceci dit 45000 lignes c'est rien du tout en terme de rollback segment (quoique ca depends pas du nombre de lignes mais de la taille, on va supposer que ca reste raisonnable). Enfin si ce n'est que 1%, ca veut dire que ta table fait 4,5 millions de lignes, ce qui, encore une fois, n'est pas grands chose (meme si, encore une fois, le nombre de lignes ne fait pas tout). Donc si le DELETE est bien ecrit, que t'as un index bien place, que tu n'est pas sur un vieux pentium II 350Mhz, supprimer 45000 lignes sur les 4,5 millions devrait se faire dans un temps "raisonnable", s'il ne l'est pas, alors t'as du boulot pour voir pourquoi.

    Nicolas.

  10. #10
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par 13thFloor Voir le message
    @donny : sans vider complètement la table, tu n'as pas d'autres option que le delete.
    Si tu veux l'accélérer :
    - tu met la table et ses index en mode nologging => bien moins de redo générés
    - tu drop les index de la table (hors clé primaire)...
    Ca fait quand meme beaucoup de choses pour un delete, tout compte fait pour un petit delete (45000/4,5 millions), c'est rien. Tu risque de passer bien plus de temps a recreer les index apres la suppression de ce 1% de lignes qu'a les supprimer direct.
    Enfin, nologging peut avoir d'autre consequences... par ex. si standby database, mais bon.


    1/100 du temps d'un delete complet de la table.
    Pas si sur ;-)

    Nicolas.

  11. #11
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par donny Voir le message
    ...j'ai du mal a saisir en quoi c'est plus optimal
    Plus optimal que quoi ?

    Nicolas.

  12. #12
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    je connais pas trop tout ce qui est administration Oracle,les performances,j'apprends ...

    ce qui me tracasse, c'est que si je fais un delete de ses lignes en faisant
    delete from matable where madate between datedeb et datefin,
    j'ai peur que la log soit trop grosse et que je me retrouve avec une erreur oracle qui me dise que le redo ou l archive log est saturé....

  13. #13
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Pour ce qui est de l'UNDO tablespace, si ca arrive, alors c'est pas grave, tes modif ne seront pas pris en compte, demande au DBA de l'agrandir et re-executes ton DELETE.
    Pour ce qui est des archives log (en mode archive), Oracle attendra gentillement que l'espace disque du filesystem contenant les fichiers archives soit libere.

    Donc pas vraiment de soucis de ces cotes-la.

    Nicolas.

  14. #14
    Membre émérite Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Par défaut
    Citation Envoyé par NGasparotto Voir le message
    Enfin, nologging peut avoir d'autre consequences... par ex. si standby database, mais bon.
    Oui mais je pars de l'hypothèse qu'il est avec un base "ordinaire" (pas de rac, de dg, de réplication...) sinon il l'aurait précisé.

    C'est beaucoup de choses, certes, mais il craint que son delete se passe mal.
    Il y aura beaucoup à faire ensuite s'il met en nologing+drop index.
    Et pour 45 000 lignes, ça n'en vaudra surement pas la peine.

  15. #15
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Juste une correction sur:
    Citation Envoyé par 13thFloor Voir le message
    @donny : sans vider complètement la table, tu n'as pas d'autres option que le delete.
    Si tu veux l'accélérer :
    - tu met la table et ses index en mode nologging => bien moins de redo générés
    nologging n'a pas d'incidence sur un delete. Le logging ne peut être évité que sur les opérations en direct-path (qui écrivent directement dans les datafiles, donc pas de perte en cas de crash serveur) et ce n'est pas le case du delete.

    Cordialement,
    Franck.

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

Discussions similaires

  1. [9.2.0.6] VM Delete au lieu de truncate
    Par Débéa dans le forum Administration
    Réponses: 0
    Dernier message: 02/07/2008, 09h54
  2. Truncate vs Delete
    Par Débéa dans le forum Administration
    Réponses: 2
    Dernier message: 21/05/2007, 16h51
  3. TRUNCATE vs. DELETE
    Par Sakalam dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/11/2006, 18h25
  4. Réponses: 2
    Dernier message: 06/12/2004, 14h43
  5. [Tuning] truncate ou delete
    Par phig dans le forum Administration
    Réponses: 10
    Dernier message: 17/06/2004, 16h41

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