11.20.2011

Suivre les modifications sur une table avec DBA_TAB_MODIFICATIONS

Avec Oracle, il est possible d'avoir une mesure approximative des modifications ayant eu lieu sur une table depuis la dernière prise des statistiques. La vue SYS.DBA_TAB_MODIFICATIONS (et ses déclinaisons ALL_* et USER_*) est alimentée par la méthode DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO. Cette procédure est invoquée à certains moments clés par Oracle (10g et 11g). Le niveau de statistique (paramètre statistics_level) doit être à TYPICAL ou ALL pour que le monitoring s'effectue.
*On doit préfixer la vue de type DBA_... par SYS puisque le synonyme public est absent en 10g.

Même si les mesures sont approximatives, elles permettent de constater la charge que peut avoir une table en quelques jours/semaines/mois. Et comme Oracle désigne une table comme étant STALE lorsque 10% de ces données ont été modifiées (Insert, Update, Delete), on peut prévoir une prochaine collecte de statistiques pour cet objet par la job interne GATHER_STATS_JOB.

Afin de simplifier, voici un exemple avec la vue USER_TAB_MODIFICATIONS:

19:27:16 ORACLE@orcl > create table test_tab_modif(id number, nom varchar2(30));

Table créée.

19:27:28 ORACLE@orcl > select * from user_tab_modifications;

aucune ligne sélectionnée

19:27:55 ORACLE@orcl > exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO;

Procédure PL/SQL terminée avec succès.

19:28:21 ORACLE@orcl > select * from user_tab_modifications;

aucune ligne sélectionnée

19:28:23 ORACLE@orcl > insert into test_tab_modif(id,nom)
19:28:38 2 select rownum, 'nom ' || to_char(rownum) from dual connect by level<10001;

10000 lignes créées.

19:28:44 ORACLE@orcl > commit;

Validation effectuée.

19:28:47 ORACLE@orcl > select * from user_tab_modifications;

aucune ligne sélectionnée

19:28:52 ORACLE@orcl > exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO;

Procédure PL/SQL terminée avec succès.

19:28:56 ORACLE@orcl > select * from user_tab_modifications;


TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
SUBPARTITION_NAME INSERTS UPDATES DELETES
------------------------------ ---------- ---------- ----------
TIMESTAMP TRU DROP_SEGMENTS
------------------- --- -------------
TEST_TAB_MODIF
10000 0 0
2011-11-20 19:28:56 NO 0


19:32:13 ORACLE@orcl > exec dbms_stats.gather_table_stats(ownname=>'ORACLE',tabname=>'TEST_TAB_MODIF');

Procédure PL/SQL terminée avec succès.

19:32:22 ORACLE@orcl > select * from user_tab_modifications;

aucune ligne sélectionnée

19:32:22 ORACLE@orcl >


N.B. Les transactions annulées de type "rollback" incrémentent tout de même les différents compteurs de cette vue. Ainsi, si vous modifiez 10 000 rangées et ensuite annulez le tout (rollback), vous aurez 10 000 UPDATES de plus lors du prochain appel de DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO.

Pour plus d'informations sur la vue ALL_TAB_MODIFICATIONS, consultez la documentation officielle.

Aucun commentaire:

Mes items partagés de Google Reader