IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

DELETE très long sur grosse table partitionée


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table matable drop partition mapartition;
    alter table matable drop subpartition masouspartition;
    Ces commandes sont quasiment instantanées et beaucoup plus performantes qu'un delete (en plus tu récupères l'espace physique)
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre averti Avatar de glutock
    Inscrit en
    Mars 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 55
    Par défaut
    Et non car je ne souhaite pas supprimer toute une souspartition, il y a des données que je veux garder dedans !

    Bon pour le moment j'ai résolu le problème en supprimant un autre index qui était sur la table. Le delete prends BEAUCOUP moins de temps maintenant.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par glutock Voir le message
    Et non car je ne souhaite pas supprimer toute une souspartition, il y a des données que je veux garder dedans !
    Si tu gardes peu de lignes tu peux les sauver dans une table temporaire avant de faire le truncate et les réinjecter après

Discussions similaires

  1. [AC-2010] Requête action sur grosse table avec trigger LONG
    Par guen dans le forum Macros Access
    Réponses: 5
    Dernier message: 09/04/2015, 20h29
  2. count(*) extremement long sur grosse table
    Par mirak63 dans le forum DB2
    Réponses: 1
    Dernier message: 18/03/2008, 10h51
  3. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01
  4. left join multiple sur grosses tables
    Par hn2k5 dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/11/2005, 16h10
  5. delete très long
    Par slefevre01 dans le forum Oracle
    Réponses: 7
    Dernier message: 06/10/2005, 13h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo