|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
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. |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
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
|
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
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.
|
|
|
00
|
|
|
#5 | ||
|
Membre confirmé
![]() |
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 :
REM: Il est plus facile de supprimer une table que de supprimer son contenu.
__________________
|
||
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
c'est bien ce que je propose
|
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
Sinon avec des fonctions analytiques:
http://www.oracle.com/technology/ora...o44asktom.html Removing Duplicates cdt |
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Oui, mais DELETE = gros rollback = perfs toute pourrie
|
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : février 2006 Messages : 139 ![]() |
en version create table as ... dans l'article
|
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
en effet, c'est une option qui est pas mal... probablement plus performante que le PL/SQL mais quid de la conso mémoire ?
|
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
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?
|
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
en effet
|
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
Bon bah ça tourne depuis une dizaine de minutes...
|
|
|
00
|
|
|
#14 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Ca va prendre un certain temps de toute façon puisqu'il va faire un FULL SCAN des 213 millions de lignes
|
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
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...
|
|
|
00
|
|
|
#16 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 519 ![]() |
Et en utilisant l'option COMPRESS pour la nouvelle table, il ne pourrait pas gagner suffisamment pour passer au niveau des disques ?
|
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
Sur la prod j'ai 2% de disque encore dispo sur une partition de 207Go, donc ça ne passera pas.
|
|
|
00
|
|
|
#18 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
le DELETE ne passera pas non plus à cause des rollbacks saut en traitant par lot mais alors là ça va prendre 15 ans
|
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 56 ![]() |
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.
|
|
|
00
|
|
|
#20 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Appelle un magicien alors parce que si les admins ne veulent pas t'ajouter de disque ce sera impossible
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com