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

Oracle Discussion :

Mauvaise performance sur table partitionnée


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut Mauvaise performance sur table partitionnée
    Bonjour,


    Dans mon datawarehouse (Oracle 10g), j'ai une table de 8 millions (4Go) d'enregistrements. Pour optimiser les requêtes j'ai décidé de partitionner ma table sur une colonne date comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PARTITION BY RANGE(DATE) 
    (
    PARTITION PART1 values less than (TO_DATE('01/01/2009','DD/MM/YYYY')), 
    PARTITION PART2 values less than (TO_DATE('01/01/2010','DD/MM/YYYY')),  
    PARTITION PART3 values less than (TO_DATE('01/01/2011','DD/MM/YYYY')), 
    PARTITION PART4 values less than (TO_DATE('01/01/2012','DD/MM/YYYY')),
    PARTITION PART5 values less than (TO_DATE('01/01/2013','DD/MM/YYYY')),  
    PARTITION PART6 values less than (MAXVALUE)
    );
    Dans ma table j'ai une PK qui inclus la date, un index sur {date, magasin} et un autre sur la date uniquement.
    Ces index sont locaux.
    Ce qui m'étonne c'est que les performances sur la table partitionnée sont moins bonnes que sur la table non partitionnée.

    En effet, la requête ci dessous met 1 minute sur la table partionnée vs 10 secondes sur la table normale.
    Ci-dessous les requêtes ainsi que les plans d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select date,sum(indicator) from PARTITIONNED_TABLE 
    where date between '01/01/2010' and '31/01/2010'
    group by date
     
     
    Plan
    SELECT STATEMENT  FIRST_ROWSCost: 11  Bytes: 100  Cardinality: 10  CPU Cost: 61,864  IO Cost: 11  Time: 1  				
    	4 PARTITION RANGE SINGLE  Cost: 11  Bytes: 100  Cardinality: 10  CPU Cost: 61,864  IO Cost: 11  Time: 1  Partition #: 1  Partitions accessed #3			
    		3 SORT GROUP BY NOSORT  Cost: 11  Bytes: 100  Cardinality: 10  CPU Cost: 61,864  IO Cost: 11  Time: 1  		
    			2 TABLE ACCESS BY LOCAL INDEX ROWID TABLE DWH.PARTITIONNED_TABLE  Cost: 11  Bytes: 100  Cardinality: 10  CPU Cost: 61,864  IO Cost: 11  Time: 1  Partition #: 3  Partitions accessed #3	
    				1 INDEX RANGE SCAN INDEX DWH.INDEX_DATE Cost: 3  CPU Cost: 23,364  IO Cost: 3  Time: 1  Partition #: 4  Partitions accessed #3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select date,sum(indicator) from NON_PARTITIONNED_TABLE 
    where date between '01/01/2010' and '31/01/2010'
    group by date
     
    Plan
    SELECT STATEMENT  FIRST_ROWSCost: 10  Bytes: 108  Cardinality: 12  CPU Cost: 76,614  IO Cost: 10  Time: 1  			
    	3 SORT GROUP BY NOSORT  Cost: 10  Bytes: 108  Cardinality: 12  CPU Cost: 76,614  IO Cost: 10  Time: 1  		
    		2 TABLE ACCESS BY INDEX ROWID TABLE DWH.NON_PARTITIONNED_TABLE Cost: 10  Bytes: 2,030,544  Cardinality: 225,616  CPU Cost: 76,614  IO Cost: 10  Time: 1  	
    			1 INDEX RANGE SCAN INDEX DWH.INDEX_DATE Cost: 3  Cardinality: 12  CPU Cost: 23,764  IO Cost: 3  Time: 1
    Pour être complet j'ai lancé un calcul de statistiques sur la table avec le script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    exec dbms_stats.gather_table_stats ( -
         ownname          => 'DWH', -
         tabname          => 'PARTITIONNED_TABLE', -
         estimate_percent => dbms_stats.auto_sample_size, -
         method_opt       => 'FOR ALL INDEXED COLUMNS SIZE SKEWONLY', -
         cascade          => true, -
         granularity => 'ALL' , -
         degree           => 5 -
    )
    /
    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne vois rien de fondamentalement faux dans ce que vous avez écrit, sauf peut-être la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT date, sum(indicator)
        FROM PARTITIONNED_TABLE 
       WHERE date BETWEEN to_date('01/01/2010', 'dd/mm/yyyy')
                      AND to_date('31/01/2010', 'dd/mm/yyyy')
    GROUP BY date;
    Mais votre NLS_DATE_FORMAT doit être bien positionné puisque le plan me paraît correct.

    Pour savoir où disparaît le temps, il faut une trace serveur + TKPROF.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut
    Est ce que tu as regardé les aio ? Une piste pourrait être que la partition interrogée se trouve sur un disque peu performant ou sujet à contention...

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    OPTIMIZER_MODE à FIRST-ROWS pour du DSS ?????

    fait dun test avec ta table partitionnée en ajoutant ce hint /*+ ALL_ROWS */

    si les résultats sont probants - modifie la valeur de ce paramétre

Discussions similaires

  1. [9.3] Mauvaises performances sur SELECT
    Par marsup077 dans le forum Administration
    Réponses: 4
    Dernier message: 26/03/2015, 15h26
  2. export avec query sur table partitionnée
    Par pat29 dans le forum Import/Export
    Réponses: 2
    Dernier message: 19/01/2009, 19h07
  3. Création index + stat sur table partitionnée
    Par ouinih dans le forum Administration
    Réponses: 4
    Dernier message: 13/08/2008, 09h53
  4. [9i] Count sur table partitionnées
    Par saysay dans le forum Oracle
    Réponses: 4
    Dernier message: 26/12/2005, 15h33
  5. Pb de truncate sur table partitionnée
    Par Mateo dans le forum Oracle
    Réponses: 14
    Dernier message: 29/11/2004, 10h58

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