CBO : les plans d'exécution selon la volumétrie cible

Lorsqu'une application est conçue, elle passe en général par plusieurs phases avant d'arriver dans l'environnement de production.

Afin de connaître les différents plan d'exécution, nous pouvons exporter les statistiques de l'environnement de production pour valider les plans sur un environnement de validation (pré-production - outil exp / imp avec le paramêtre rows=n) ; cependant, il arrive qu'une nouvelle fonctionnalité fasse apparaître une nouvelle table ou en modifie grandement la volumétrie.

Il existe alors une méthode afin qu'oracle utilise des valeurs de statistiques qu'on lui aura fourni : le package dbms_stats.

Exemple pratique


Ainsi la nouvelle table nv_service_data aura une volumétrie de 100000 tuples.
Pour l'instant, très peu de données sont présentes, Oracle préfère donc faire un FULL SCAN sur la table (voir les explications dans pourquoi mon index n'est pas utilisé ?). Or en production, la table comptera 100000 et non une dizaine.

On veut alors s'assurer que l'index PK_TE sera bien utilisé lors d'une requête sur la colonne cmd_id, on positionne alors la statistique concernant le nombre de lignes de la table à 100000 :

begin
DBMS_STATS.SET_TABLE_STATS('USEREX', 'NV_SERVICE_DATA', null, null, null, 100000);
DBMS_STATS.SET_INDEX_STATS('USEREX', 'PK_TE', null, null, null, 100000);
end;
/


On peut vérifier dans le dictionnaire la valeur num_rows :

SQL> select num_rows from user_tables where table_name='NV_SERVICE_DATA'
union select num_rows from user_indexes where index_name = 'PK_TE';

NUM_ROWS
--------
100000
100000


Et on vérifie enfin le plan d'exécution utilisé :

explain plan for
select * from nv_service_data where cmd_id = :1;


Les fonctions issues du package DBMS_STATS peuvent être plus complètes que dans l'exemple présenté, il est possible en effet, d'indiquer toutes les valeurs de statistiques existantes (nombre de blocs, nombre de valeurs distinctes, taille moyenne du champ, ...) ; se reporter à la documentation pour plus d'info.


Cette méthode est principalement utile lors de traitements concernant des tables temporaires (où les statistiques indiqueront aucune ligne et aucun index n'est utilisé) ; l'appelle au package peut alors être fait à l'intérieur d'une transaction ou à la fin du calcul des statisques.




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories