Tout est dit dans le titre : comment se fait-il qu'un import de table soit plus long lorsque l'on a fait au préalable un TRUNCATE que si on l'a droppée puis recréée ?
PS : je suis en 9i
Tout est dit dans le titre : comment se fait-il qu'un import de table soit plus long lorsque l'on a fait au préalable un TRUNCATE que si on l'a droppée puis recréée ?
PS : je suis en 9i
A priori il n'y a pas de raison... mais on peut imaginer qu'après le DROP tu ne recrées pas tout de suite les indexes et contraintes et que du coup l'import est plus rapide.
En fait je devais purger plusieurs tables non partitionnées qui faisaient chacune plusieurs millions de lignes, donc j'avais fait pour chaque table :
1) export partiel (clause where en ne gardant que les lignes que je veux garder)
2) truncate
3) drop indexes et désactivation contraintes
4) import du dump partiel
C'est bizarre à chaque fois c'était beaucoup plus long que si j'avais droppé puis recréé la table, en mettant les mêmes paramètres d'import (j'ai fait le test) ..
Autre question, pourquoi quand on truncate une table, sa taille dans la vue dba_segments reste à sa taille d'origine (avant le truncate) au lieu de revenir à la taille d'un extent ? Ca veut dire qu'elle occupe physiquement toujours le même espace dans le tablespace ? Y a-t-il un moyen d'y remédier ?
Merci d'avance
Mes tables n'étaient pas partitionnées (c'était justement pour ça que je devais faire des exports/imports partiels pour pouvoir les purger)
Hello,
BIzarre je pense que tu ne lis pas les bonnes infos...
Résultat
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 COL SEGMENT_NAME FORMAT A20 COL BLOCKS FORMAT 99 drop table BIGEXTENT; create table BIGEXTENT (a varchar2(255)); select SEGMENT_NAME, BLOCKS from dba_segments where SEGMENT_NAME = 'BIGEXTENT'; DECLARE a varchar2(254); i integer; BEGIN for i in 1..10000 LOOP insert into BIGEXTENT values ('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'); end loop; END; / select SEGMENT_NAME, BLOCKS from dba_segments where SEGMENT_NAME = 'BIGEXTENT'; truncate table BIGEXTENT; select SEGMENT_NAME, BLOCKS from dba_segments where SEGMENT_NAME = 'BIGEXTENT';
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
29 SQL> Table dropped. SQL> Table created. SQL> 2 3 SEGMENT_NAME BLOCKS -------------------- ------ BIGEXTENT 8 SQL> 2 3 4 5 6 7 8 9 PL/SQL procedure successfully completed. SQL> 2 3 SEGMENT_NAME BLOCKS -------------------- ------ BIGEXTENT 64 SQL> Table truncated. SQL> 2 3 SEGMENT_NAME BLOCKS -------------------- ------ BIGEXTENT 8 SQL>
Pour ceux qui auraient le même problème j'ai trouvé la solution pour éviter les problèmes lorsqu'on vide une table en vue de la réimporter (partiellement ou non), il faut faireJ'avais oublié le DROP STORAGE
Code : Sélectionner tout - Visualiser dans une fenêtre à part TRUNCATE TABLE matable DROP STORAGE;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager