http://blog.guiona.com - Logo Sun Oracle

Mais qu’est ce que c’est que ça les statistiques Oracle?

Les statistiques Oracle sont en fait la récupération de diverses informations concernant la volumétrie des tables, la distribution des différentes valeurs des champs indexés, la taille moyenne des tuples,… . Cet ensemble d’informations génèrera via un algorithme propre à Oracle un coût pour chaque plan d’exécution. En mode CBO (Cost Based Optimization), Oracle choisira, pour une requête donnée, le plan d’exécution le moins coûteux (le plus rapide). Ces différentes données (statistiques) sont stockées dans des tables du dictionnaire de données, et visibles sous les vues dba_tables, dba_indexes, … Ces informations sont donc importantes.

Il existe 3 méthodes pour procéder au calcul des statistiques dans Oracle:

  • La commande ANALYZE,
  • Le package DBMS_UTILITY,
  • Le package DBMS_STATS.

Je vais vous présenter ici la méthode recommandée par Oracle depuis la version 8i: le package DBMS_STATS.
Il est possible d’utiliser le package sur une table, un index ou un schéma.
NB: Je travaille avec le compte applicatif Oracle « system » et un client sqlplus.

Comment récupérer la date de dernière analyze d’un index ou d’une table?

Pour se faire il faut requêter les vues dba_tables et dba_index.

Prenons l’exemple de table MYTABLE du schéma MYSCHEMA:

SQL> SELECT table_name, last_analyzed
2 FROM DBA_TABLES
3 WHERE table_name = ‘MYTABLE’
4 owner = ‘MYSCHEMA’;

Le résultat:


TABLE_NAME      LAST_ANALYZED
-----------------------------------------
MYTABLE         5-DEC-07

Dans le cas présent on constate que les informations commencent à dater…

Regardons maintenant les index de cette table:

SQL> SELECT index_name, last_analyzed
2 FROM DBA_INDEXES
3 WHERE table_name = 'MYTABLE'
4 AND OWNER = 'MYSCHEMA';

Résultat:


INDEX_NAME          LAST_ANALYZED
-----------------------------------------------
SYS_C0012343435     05-DEC-07
IDX_MYTABLE_DATE    16-MAY-08

Là aussi on constate que les données ne sont pas toutes jeunes…

Donc on va faire une analyse complète du schéma:

SQL> DBMS_STATS.gather_schema_stats( ownname => 'MYSCHEMA' , cascade => TRUE)

Et là il faut patienter…
Une fois fini si nous exécutons les requêtes précédentes (sur les vues DBA_INDEXES et DBA_TABLES) nous constaterons que la valeur de « last_analyzed » est la date du jour.

Mon retour d’expérience

Cette commande m’a permis de gagner 3 heures sur un trés gros traitement. Au fil des semaines le traitement prenait de plus en plus de temps (jusqu’à 6h) et un jour je me suis lancé avec le package DBMS_STATS et à partir de là j’ai divisé par 2 mon temps d’exécution donc l’opération de calcul des statistiques n’est pas anodine.