Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2008, 11h23   #1
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
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.
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h19   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h26   #3
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
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
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h27   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 12h34   #5
Membre confirmé
 
Avatar de JerryMouse
 
Homme N'Guessan KOUAME
Inscription : avril 2002
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme N'Guessan KOUAME
Localisation : Côte d'Ivoire

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

Informations forums :
Inscription : avril 2002
Messages : 210
Points : 270
Points : 270
Envoyer un message via MSN à JerryMouse Envoyer un message via Yahoo à JerryMouse
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 :
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.
__________________
Très souvent, le plus difficile est de savoir ce que l'on veut.
JerryMouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h00   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est bien ce que je propose
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h01   #7
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
Sinon avec des fonctions analytiques:

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

cdt
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h04   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Oui, mais DELETE = gros rollback = perfs toute pourrie
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 14h19   #9
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
en version create table as ... dans l'article
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h12   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
en effet, c'est une option qui est pas mal... probablement plus performante que le PL/SQL mais quid de la conso mémoire ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h25   #11
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
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?
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h36   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
en effet
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 15h58   #13
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
Bon bah ça tourne depuis une dizaine de minutes...
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2008, 16h00   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Ca va prendre un certain temps de toute façon puisqu'il va faire un FULL SCAN des 213 millions de lignes
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 12h03   #15
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
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...
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 14h08   #16
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Et en utilisant l'option COMPRESS pour la nouvelle table, il ne pourrait pas gagner suffisamment pour passer au niveau des disques ?
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 14h31   #17
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
Sur la prod j'ai 2% de disque encore dispo sur une partition de 207Go, donc ça ne passera pas.
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 14h37   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
le DELETE ne passera pas non plus à cause des rollbacks saut en traitant par lot mais alors là ça va prendre 15 ans
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 14h42   #19
Invité de passage
 
Inscription : avril 2007
Messages : 56
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 56
Points : 4
Points : 4
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.
CaptainT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 14h49   #20
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Appelle un magicien alors parce que si les admins ne veulent pas t'ajouter de disque ce sera impossible
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h19.


 
 
 
 
Partenaires

Hébergement Web