On considère que l'on a une base de Production, avec plein de données dedans (...), et une base de développement, quasiment vide; ce qu'on souhaite, c'est faire en sorte que les plans d'exécutions de nos requêtes soient identiques. Comme on utilise l'optimiseur statistique (ben oui, on est en 10g, hé!), on va pouvoir gruger les traitements de la base de développements en leur faisant croire qu'il y a tout plein de données.
Exemple ici pour une table MATABLE, identique sur les 2 bases. On peut bien-sûr faire la même chose au niveau d'un schéma (dbms_stats.export_schema_stats).
Sur la base de données source - calcul des stats
> analyze table matable compute statistics;
- création de la table de statistiques
> exec dbms_stats.create_stat_table('MONUSER','MATABLEDESTATS','USERS_TBS');
- sauvegarde des stats dans la table MATABLEDESTATS
> exec dbms_stats.EXPORT_TABLE_STATS(ownname=>'MONUSER',tabname=>'MATABLE',stattab=>'MATABLEDESTATS');
- export de la table de sauvegarde des statistiques
$ exp protect/protect file=exp_matabledestats log=exp_matabledestats tables=matabledestats
Sur la base de données cible- import de la table de sauvegarde des statistiques
$ imp protect/protect file=exp_matabledestats log=exp_matabledestats tables=matabledestats
- restauration des statistiques
> exec dbms_stats.import_table_stats(ownname=>'MONUSER',tabname=>'MATABLE',stattab=>'MATABLEDESTATS');
Trucs & astuces
- suppression d'une table de statistiques
> exec dbms_stats.drop_stat_table('MONUSER','MATABLEDESTATS);
- suppression du
contenu d'une table de statistiques
> exec dbms_stats.delete_table_stats(ownname=>'MONUSER',tabname=>'MATABLE',stattab=>'MATABLEDESTATS');