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

Administration Oracle Discussion :

DBMS_STATS et GLOBAL_TEMPORARY_TABLE


Sujet :

Administration Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut DBMS_STATS et GLOBAL_TEMPORARY_TABLE
    Bonjour à tous,

    Tous les jours s'éxécute le script suivant sur ma base oracle 10g :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec DBMS_STATS.GATHER_SCHEMA_STATS('MABASE', GRANULARITY => 'ALL', CASCADE=>TRUE, METHOD_OPT=> 'FOR ALL COLUMNS SIZE 1');
    Ma base contient des tables temporaires (GLOBAL_TEMPORARY_TABLE).
    Les tables temporaires ne sont pas impactés par le script car quand j'execute la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select table_name, last_analyzed from dba_tables 
    where owner = 'PROF' 
    order by last_analyzed
    le résultat est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    TABLE_NAME               LAST_ANALYZED 
    -------------------- -------------------- 
    TABLE_TEMP_1         
    TABLE_TEMP_2         
    TABLE_TEMP_3         
    TABLE_TEMP_4         
    TABLE_TEMP_5         
    TABLE_1                  07-OCT-2009 12:15:04 
    TABLE_2                  07-OCT-2009 12:15:10 
    TABLE_3                  07-OCT-2009 12:15:22 
    TABLE_4                  07-OCT-2009 12:15:23
    Je voudrais savoir dans un premier temps si réussir à passer mon script sur les tables temporaires amélioreront les perf et si oui comment puis faire?

    Merci d'avance

  2. #2
    Membre régulier Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Points : 101
    Points
    101
    Par défaut
    Salut,

    Dans la mesure où les tables temporaires contiennent des données volatiles, il n'y a pas d'intérêt à calculer les statistiques sur ce type d'objet.

    Si tu veux optimiser tes plans, il est conseillé d'utiliser le dynamic sampling. Selon cette technique, l'optimiseur va jeter un oeil à tes données pour les évaluer dynamiquement, et tirer le meilleur plan possible.

    Si tu veux optimiser les perfs de tes requêtes qui réalisent des accès sur tables temporaires, plusieurs choix :
    - tu utilises le dynamic sampling (cf. http://download.oracle.com/docs/cd/B...ats.htm#i42991)
    - tu peux setter les stats de ta table avec la procédure DBMS_STATS.SET_TABLE_STATS
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    create global temporary table ttemp (id number, val1 varchar2(20)) on commit preserve rows
    
    Table creee.
    
    LAURENT@db10g > begin
      1  for i in 1..1000
      2  loop
      3  insert into ttemp values(i,dbms_random.string('X',20));
      4  end loop;
      5  commit;
      6* end;
      7   /
    
    Procedure PL/SQL terminee avec succes.
    
    LAURENT@db10g > select table_name,num_rows,last_analyzed from user_tables; 
    
    TABLE_NAME                       NUM_ROWS LAST_ANA
    ------------------------------ ---------- --------
    TTEMP
    
    LAURENT@db10g > exec dbms_stats.set_table_stats(ownname=>'LAURENT',tabname=>'TTEMP',numrows=>2);
    
    Procedure PL/SQL terminee avec succes.
    
    LAURENT@db10g > select table_name,num_rows,last_analyzed from user_tables; 
    
    TABLE_NAME                       NUM_ROWS LAST_ANA
    ------------------------------ ---------- --------
    TTEMP                                   2 08/10/09
    
    LAURENT@db10g > set autotrace trace exp stat
    LAURENT@db10g > select * from ttemp;
    
    1000 ligne(s) selectionnee(s).
    
    
    Plan d'execution
    ----------------------------------------------------------
    Plan hash value: 3755640973
    
    ---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |     2 |    50 |    24   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| TTEMP |     2 |    50 |    24   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    .../...
    - tu peux utiliser le hint CARDINALITY :

    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
    
    LAURENT@db10g > select table_name,num_rows,last_analyzed from user_tables; 
    
    TABLE_NAME                       NUM_ROWS LAST_ANA
    ------------------------------ ---------- --------
    TTEMP
    
    LAURENT@db10g > select /*+ CARDINALITY (ttemp 2) */*  from ttemp
    
    1000 ligne(s) selectionnee(s).
    
    
    Plan d'execution
    ----------------------------------------------------------
    Plan hash value: 3755640973
    
    ---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |     2 |    50 |    24   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| TTEMP |     2 |    50 |    24   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    Laurent

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    Selon la manière dont elles sont crées les tables temporary ne contiennent des données que le temps d'une transaction ou le temps d'une session. Donc ça ne sert à rien de calculer des stats dessus en dehors de ta transaction ou de ta session.

    Comme l'a dit Laurent tu peux soit faire du dynamic sampling, soit setter les stats (si t'insère tjr la même quantité de lignes dans ces tables) sinon tu peux calculer les stats lors de ton traitement avec une taille d'échantillon de ton choix.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DBMS_STATS][9i]Réaliser la même opération qu'avec ANALYZE.
    Par Le nain Attila dans le forum Oracle
    Réponses: 7
    Dernier message: 09/06/2006, 18h35
  2. utilisation de dbms_stats
    Par learn dans le forum Oracle
    Réponses: 3
    Dernier message: 03/05/2006, 10h36
  3. calcul des statistiques par dbms_stat
    Par learn dans le forum Oracle
    Réponses: 5
    Dernier message: 27/02/2006, 21h16
  4. [9.2.0.4 S.E. linux] dbms_stats
    Par learn dans le forum Oracle
    Réponses: 1
    Dernier message: 27/01/2006, 20h58
  5. utilisation de dbms_stats
    Par olabo dans le forum Oracle
    Réponses: 2
    Dernier message: 24/08/2005, 18h21

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