DELETE très long sur grosse table partitionée
Bonsoir,
J'ai donc une table de plus de 336 millions de lignes, et lors de certains batchs, il se peut que j'ai besoin de supprimer environ 4 millions de ces lignes.
La table est remplie de 4 millions de lignes une à deux fois par semaine.
Cette table à des partitions par années, et chaque partitions a des sous partitions par mois. Idem pour l'index (partitioné lui aussi) sur le champ date.
J'ai utilisé DBMS_STATS pour faire les stats sur la table, les partitions, les sous partitions, l'index, tout est à jour !
Voici le premier delete et son plan :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
DELETE FROM S1_STOCKS_MAGASIN S1SM
WHERE DATESTOCK = '26/04/2008';
DELETE STATEMENT ALL_ROWS
Cost: 2,496 Bytes: 105,214,186 Cardinality: 4,782,463
5 DELETE REPORTING.S1_STOCKS_MAGASIN
4 PX COORDINATOR
3 PX SEND QC (RANDOM) PARALLEL_TO_SERIAL SYS.:TQ10000 :Q1000
Cost: 2,496 Bytes: 105,214,186 Cardinality: 4,782,463
2 PX BLOCK ITERATOR PARALLEL_COMBINED_WITH_CHILD :Q1000
Cost: 2,496 Bytes: 105,214,186 Cardinality: 4,782,463 Partition #: 4 Partitions accessed #4
1 TABLE ACCESS FULL TABLE PARALLEL_COMBINED_WITH_PARENT REPORTING.S1_STOCKS_MAGASIN :Q1000
Cost: 2,496 Bytes: 105,214,186 Cardinality: 4,782,463 Partition #: 5 Partitions accessed #22 |
et le deuxième :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
DELETE /*+INDEX (S1SM X_S1SM_DATESTOCK)*/ FROM S1_STOCKS_MAGASIN S1SM
WHERE DATESTOCK = '26/04/2008';
Plan
DELETE STATEMENT ALL_ROWS
Cost: 6,951 Bytes: 105,214,186 Cardinality: 4,782,463
4 DELETE REPORTING.S1_STOCKS_MAGASIN
3 PARTITION RANGE SINGLE
Cost: 6,951 Bytes: 105,214,186 Cardinality: 4,782,463 Partition #: 2 Partitions accessed #3
2 PARTITION RANGE SINGLE
Cost: 6,951 Bytes: 105,214,186 Cardinality: 4,782,463 Partition #: 3 Partitions accessed #4
1 INDEX RANGE SCAN INDEX REPORTING.X_S1SM_DATESTOCK
Cost: 6,951 Bytes: 105,214,186 Cardinality: 4,782,463 Partition #: 4 Partitions accessed #22 |
Est-ce que le plus simple est de recréer une table temporaire avec les données à garder, faire un truncate de la table source, et réinsérer le tout ? Ou ai-je mal pensé ma table et son partitionnement ?
Merci d'avance !