Bonjour,
J'ai pour objectif de faire un trim (supprimer les espace blancs) de tous les champs varchar d'une table. J'ai d'abord testé avec un update tout bete, qui etait relativement performant (niveau temps) cependant des que je l'ais exectué sur un table avec beaucoup de lignes j'ai un depassement du tablespace undo.
Donc il faut que je trouve un moyen de faire un autocommit.
J'ai donc fait une boucle qui commit a un interval donné, mais maintenant ca mets presque 2min pour 10100 lignes (contre quelques milisecondes pour le code seul)
Voici le code:
Connaissez-vous un moyen d'accelerer ce morceau de code? (ou du moins la raison pour laquelle c'est plus lent?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 declare v_pas number := 0; commit_point number := 1000; begin LOOP UPDATE DIM_CLUSTER_SCD SET CLS_NAME = rtrim(ltrim(CLS_NAME)), CLS_SEGMENT_CODE = rtrim(ltrim(CLS_SEGMENT_CODE)), CLS_SEGMENT_NAME = rtrim(ltrim(CLS_SEGMENT_NAME)), CLS_SUB_SEGMENT_CODE = rtrim(ltrim(CLS_SUB_SEGMENT_CODE)), CLS_SUB_SEGMENT_NAME = rtrim(ltrim(CLS_SUB_SEGMENT_NAME)), CLS_LEVEL = rtrim(ltrim(CLS_LEVEL)) WHERE rownum = v_pas; v_pas := v_pas + 1; commit; IF v_pas > commit_point then commit; commit_point := commit_point + 1000; DBMS_OUTPUT.PUT_LINE ('commit'||commit_point ); end if; /* Sortie de la boucle quand ca depasse le nombre de record de la table */ IF v_pas = 10101 then exit; end IF; END LOOP; end;
J'ai aussi pensé a d'autre techniques, genre copier les données dans une autre table en faisant le trim, puis dropper l'ancienne table et renommer la nouvelle, mais j'ai pas les bons droits pour effectuer ca..
Idem pour augmenter la taille du tablespace undo...
Merci beaucoup pour votre aide!!
Partager