Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 03/12/2007, 17h59   #1
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Par défaut Suppression de masse

Bonjour à tous,

Je reprends une vieille discussion de l'année dernière, mais toujours d'actualité.

Je souhaiterai faire une suppression de masse > 1'000'000.

Plusieurs choix se proposent :
1. Découper en multiples requêtes "delete" (lourd)
2. Faire un Create AS + truncate après avoir fait une copie des données à conserver (lourd)
3. Faire une partition et dropper cette partition (la question est : peut-on faire une partition à une table qui n'est pas déjà partitionnée ?)
4. Désactiver l'utilisation des rollbacks segments
5. autre chose ?

En fait je suis sur la 3ème mais je ne sais pas comment partitionner ma table, avez-vous une idée ?

A savoir que c'est un traitement batch Java et que je peux attaquer n'importe quelle table de mon schéma de base de données.

Merci de votre collaboration.

Boutss
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h10   #2
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
1. Pourquoi pas...
2. quelle est la proportion à garder / à jeter ?
3. Non, pas possible, sauf à manipuler toutes les données pour les partitionner puis ensuite truncater la partition. Pas mieux que le 2 donc si la table n'est pas pré-partitionnée.
4. Non, pas possible.
5. Non pas de solution miracle

Concernant le filtrage, se fera-t-il sur des colonnes indexées ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h21   #3
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Merci de tes réponses.

Oui cela sera sur une colonne indexée car c'est la clé primaire.
En fait les ID de la table sont stockées dans une table temporaire et je fais la liaison pour effectuer le delete.

Oui car il y a 2 choses couteuses dans la suppression, les rollbacks segments et le recalcul des indexs, c'est bien ça ?
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h25   #4
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Si la table est utilisée par un seul traitement, vous pouvez essayer de recréer la table avec un CREATE TABLE ... AS SELECT (CTAS) qui va sélectionner les données à garder. Ceci peut être d'autant plus rapide que vous gardez peu de lignes dans la table. L'inconvénient c'est qu'il faut ensuite recréer les contraintes sur la table, recréer les index, redonner les privilèges liés à la table et renommer la table ...
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h28   #5
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Citation:
Envoyé par pifor Voir le message
Si la table est utilisée par un seul traitement, vous pouvez essayer de recréer la table avec un CREATE TABLE ... AS SELECT (CTAS) qui va sélectionner les données à garder. Ceci peut être d'autant plus rapide que vous gardez peu de lignes dans la table. L'inconvénient c'est qu'il faut ensuite recréer les contraintes sur la table, recréer les index, redonner les privilèges liés à la table et renommer la table ...
pas forcément :
1. CTAS A --> B
2. TRUNCATE
3. INSERT SELECT B --> A
mais ça peut prendre beaucoup de temps là aussi, donc ça dépend du ratio je pense...
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h33   #6
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
Oui ça sera le seul traitement.
C'est une bonne solution mais risquée à mon goût, car je dois être sûr que je redonne exactement les mêmes caractéristiques à la table.

Si en java (via les Métadata) je peux avoir une liste exhaustive et tout recréer, si les privilèges m'en permettent, alors ok.

@LeoAnderson:
Oui avec le
"create select as" + "truncate" + "insert" ça peut être long :
Ex : table de 15M et 3M à supprimer
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h35   #7
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Envoyé par LeoAnderson Voir le message
pas forcément :
1. CTAS A --> B
2. TRUNCATE
3. INSERT SELECT B --> A
mais ça peut prendre beaucoup de temps là aussi, donc ça dépend du ratio je pense...
Dans mon scénario, il n'y a pas besoin des étapes 2 et 3 mais il faut supprimer A et renommer B en A avec RENAME (et recréer les contraintes, index, grants).
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h37   #8
Membre actif
 
Homme Vincent
Ingénieur développement logiciels
Inscription : août 2002
Messages : 237
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 34
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2002
Messages : 237
Points : 151
Points : 151
C'est ce qu'il disait.
boutss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h41   #9
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Non ce n'est pas exactement la même chose du point de vues des performances:
TRUNCATE+ INSERT INTO .. SELECT FROM n'est pas équivalent à DROP TABLE + RENAME + CREATE CONSTRAINTS + CREATE INDEXES + GRANT .

Tout dépend du ratio "ce que je supprime"/"ce que je garde", des index et des contraintes.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2007, 18h54   #10
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Citation:
Envoyé par pifor Voir le message
Non ce n'est pas exactement la même chose du point de vues des performances:
TRUNCATE+ INSERT INTO .. SELECT FROM n'est pas équivalent à DROP TABLE + RENAME + CREATE CONSTRAINTS + CREATE INDEXES + GRANT .

Tout dépend du ratio "ce que je supprime"/"ce que je garde", des index et des contraintes.
de toute façon, soit vous réinjecter les données, soit vous recalculez des indexes, ce qui n'est pas transparent, ni l'un ni l'autre...

là, cette situation, qui découle d'une lacune de conception n'est pas aisée à rattraper...
LeoAnderson 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 02h10.


 
 
 
 
Partenaires

Hébergement Web