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 :

Suppression de doublons sur une grosse table


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut Suppression de doublons sur une grosse table
    Bonjour à tous,

    J'ai actuellement une table dans une base oracle (9i)avec 213 millions d'enregistrements, qui devrait en contenir environ 40-50. il y'a donc environ 80% de doublons


    Cela est du au fait que cette table est alimentée par le biais de fichiers plats d'export venant d'une base as400 et qu'il n'y a pas de contrainte d'unicité.

    L'identification d'une entrée unique se fait sur 6 champs ().

    Vu la taille de la table, j'aimerai savoir qu'elle serait la méthode la plus efficace pour éliminer les doublons:

    - extraire les positions qui ont des doublons dans une table temporaire et les supprimer dans ma grosse table. (déja essayé mais trooooooop long)
    - faire un create table as select en sélectionnant les entrées uniques (et dans ce cas je vais avoir besoin d'aide)
    - lancer un delete directement sur la table?
    - rajouter une contrainte d'unicité?


    Merci d'avance, car nous n'avons pas d'admin oracle, et que l'espace disque devient tres problématique sur notre serveur. J'ai à ma disposition un clone de mon serveur, sur lequel je peux effectuer tous les tests que je veux.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Selon moins, le plus performant ce serait probablement un INSERT AS SELECT dans une table ayant une contrainte unique, drop de la table d'origine et renommage de la nouvelle table.

    Surtout pas de DELETE ce sera beaucoup trop long (consommation des rollbacks) et le tri doit être fait sur la table la plus petite... donc à l'insert et pas au select

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Donc un insert as select * ,sur l'ensemble de mes lignes et une contrainte sur la table de destination?

    Je vais essayer ça, merci pour le tuyau. Je te tiens au courant

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    en revanche, tu devras probablement passé par du PL/SQL pour insérer ligne à ligne et gérer l'exception de violation de clé unique. Utilise BULK COLLECT pour améliorer les perfs.

  5. #5
    Membre actif Avatar de JerryMouse
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 215
    Points : 295
    Points
    295
    Par défaut
    Moi, j'aurai créé une table "Table2" à l'image de ma table avec la contrainte d'unicité sur les 6 colonnes et executé cette procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Begin
      For Ng in (Select * from Table1)
      Loop
        Begin
          Insert INto Table2 Values(Ng.col1, Ng.Col2.....);
        Exception
          When Dupp_Val_On_Index Then Null;
        End;
      End Loop;
      Commit;
    End;
    Tu Drop ensuite ta premiere table.
    REM: Il est plus facile de supprimer une table que de supprimer son contenu.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est bien ce que je propose

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Points : 152
    Points
    152
    Par défaut
    Sinon avec des fonctions analytiques:

    http://www.oracle.com/technology/ora...o44asktom.html
    Removing Duplicates

    cdt

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Oui, mais DELETE = gros rollback = perfs toute pourrie

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Points : 152
    Points
    152
    Par défaut
    en version create table as ... dans l'article

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    en effet, c'est une option qui est pas mal... probablement plus performante que le PL/SQL mais quid de la conso mémoire ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Je suis en train de me pencher sur la solution proposée par kervoaz, je ne me suis jmais servi du partition by, je suppose que c'est au niveau de cette clause que je dois indiquer les champs rendant une position unique?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    en effet

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bon bah ça tourne depuis une dizaine de minutes...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Ca va prendre un certain temps de toute façon puisqu'il va faire un FULL SCAN des 213 millions de lignes

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bon bah comme je m'en doutais, j'ai pas assez d'espace sur le disque pour la création de la nouvelle table, je vais voir si je peux faire ajouter temporairement un disque...

  16. #16
    Membre éclairé Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Points : 773
    Points
    773
    Par défaut
    Et en utilisant l'option COMPRESS pour la nouvelle table, il ne pourrait pas gagner suffisamment pour passer au niveau des disques ?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Sur la prod j'ai 2% de disque encore dispo sur une partition de 207Go, donc ça ne passera pas.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    le DELETE ne passera pas non plus à cause des rollbacks saut en traitant par lot mais alors là ça va prendre 15 ans

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    J'avais déja essayé par bloc , mais là je dois faire du one shot, je ne peux pas arréter le service très longtemps.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Appelle un magicien alors parce que si les admins ne veulent pas t'ajouter de disque ce sera impossible

Discussions similaires

  1. Création d'un index sur une grosse table
    Par Jester dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/04/2008, 12h44
  2. Requête lente sur une grosse table
    Par mr_keyser dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 12/12/2007, 19h15
  3. Quellue interface pour travailler sur une grosse table ?
    Par grinder59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/12/2006, 16h25
  4. [Oracle 8i]Recherche doublon sur une même table
    Par fmoriet dans le forum Oracle
    Réponses: 3
    Dernier message: 01/08/2006, 10h09
  5. Update trés lent sur une grosse table
    Par neo.51 dans le forum Oracle
    Réponses: 21
    Dernier message: 14/12/2005, 11h06

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