[ORACLE] Suppression gd nombre enregistrements

Suppression gd nombre enregistrements [ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 29-08-2002 à 13:09:30    

Bonjour à toutes et à tous,  
 
J'ai une application VB qui appelle une procédure stockée pour supprimer un grand nombre d'enregistrement dans une table (un peu plus d'un million de lignes). Le problème est que cette opération est vraiment trop longue et je voudrais savoir quel(s) moyen(s) je pourrais utiliser pour accélérer l'exécution.  
Dans la procédure stockée, j'affecte un gros rollback segment spécialement pour la requête DELETE. J'ai essayé de découper la requête en plusieurs sous-requêtes mais ça ne change pas grand chose.  
 
Merci pour vos lumières ...
 
PS : pas de TRUNCATE car je ne dois pas supprimer tous les enregistrements de la table

Reply

Marsh Posté le 29-08-2002 à 13:09:30   

Reply

Marsh Posté le 29-08-2002 à 14:27:48    

Il n'y a pas une option du genre NO LOG (ou NO LOGGON je ne sais plus bien) qui permet d'effectuer une opération sur la base sans que cela soit inscrit dans le journal ?
 
Ca devrait être plus rapide je pense ?

Reply

Marsh Posté le 29-08-2002 à 15:03:56    

Je ne connais pas cette option mais si tu retrouves comment on l'utilise, je suis preneur.
 
J'ai plusieurs choses à faire en même temps et là j'ai un bug à corriger assez rapidement.
 
Merci pour ton aide.

Reply

Marsh Posté le 29-08-2002 à 15:22:30    

shyangel a écrit a écrit :

Je ne connais pas cette option mais si tu retrouves comment on l'utilise, je suis preneur.
 
J'ai plusieurs choses à faire en même temps et là j'ai un bug à corriger assez rapidement.
 
Merci pour ton aide.




Faut faire :
alter table nom_table nologging;

Reply

Marsh Posté le 29-08-2002 à 15:50:34    

Il s'effectue quand ton delete, en pleine journée avec
plein d'utilisateurs qui bosse sur ta table
ou le soir quand ya personne ?

Reply

Marsh Posté le 29-08-2002 à 16:30:59    

vttman2 > En ce moment on est en phase de test, je ne suis pas sur le site du client mais sur un serveur spécial qu'on a pour le projet. Je suis le seul à travailler dessus (PIII 866 avec RAM 256Mo) donc pas de surcharge d'autres utilisateurs.
 
tomlameche > Merci, j'essaierai dès demain, parce que pour le moment, j'ai ma procédure qui tourne.

Reply

Marsh Posté le 29-08-2002 à 16:32:29    

tom > Oracle master [:prosterne2]

Reply

Marsh Posté le 29-08-2002 à 16:45:23    

Ok  
En fait je te posais cette question parceque
dans certaines sociétés on préfère faire
au lieu d'un DELETE TAB1
un truc du style
 
CREATE table TEMP  
INSERT des enregistrements conservés à partir de TAB1
DROP table TAB1
RECOPIE de TEMP dans TAB1
DROP table TEMP
 
... et tout ça pour gagner pas mal de temps
 
Mais bon ça dépend de la liaison des tables, contraintes ...
 
 
 

Reply

Marsh Posté le 29-08-2002 à 16:49:20    

vttman2 a écrit a écrit :

Ok  
En fait je te posais cette question parceque
dans certaines sociétés on préfère faire
au lieu d'un DELETE TAB1
un truc du style
 
CREATE table TEMP  
INSERT des enregistrements conservés à partir de TAB1
DROP table TAB1
RECOPIE de TEMP dans TAB1
DROP table TEMP
 
... et tout ça pour gagner pas mal de temps
 
Mais bon ça dépend de la liaison des tables, contraintes ...




 
En plus autre avantage du drop Table : ça libère vraiment l'espace disque (contrairement au delete).
 
en ce qui concerne les contraintes, tu galère la première fois que tu fais le drop, mais en copiant dans un fichier les script d'inactivation (puis réactivation) des contraintes, ça redevient rapide.


Message édité par irulan le 29-08-2002 à 16:49:41
Reply

Marsh Posté le 02-09-2002 à 16:41:59    

J'ai essaye les 2 méthodes :
 
  - alter table nom_table nologging : pas très efficace, je n'ai pas vu de changement dans les temps ou alors c'était très faible.
 
  - create temp as select ... from nom_table
    drop table nom_table
    rename temp to nom_table  
    Cette solution est très rapide, beaucoup plus que ce que je pouvais espérer :)  
 
Merci pour tout  ;)  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed