如果统计信息过旧会引起许多问题,而对于静态数据,反复收集统计信息又是没有意义的,所以注意统计信息的时效性非常重要。
数据库引擎通过SQL语句修改每一个对象的行数统计,可以通过如下查询得到:
SQL> select inserts,updates,deletes,truncated from dba_tab_modifications where table_name='EMP' and table_owner='SCOTT';
INSERTS UPDATES DELETES TRU
---------- ---------- ---------- ---
2 0 38 NO
注意*_tab_modifications视图并不是实时刷新的,而是oracle自己周期性的从内存中将修改的信息刷新进去,可以调用dbms_stats.flush_database_monitoring_info手动刷新。
oracle10g后dba_tab_statistics中stale_stats字段显示对象的统计信息是否过时,YES为过时。oracle10g以前修改超过10%的数据行,统计信息就被认为是过期的,到oracle11g,可以修改stale_percent参数来配置阀值。
oracle9i上,该技术只有在表级别指定时才会启用,在创建或修改表时,加monitoring关键字或通过dbms_stats提供的过程,语法如下:
DBMS_STATS.ALTER_SCHEMA_TAB_MONITORING (
ownname VARCHAR2 DEFAULT NULL,
monitoring BOOLEAN DEFAULT TRUE);
DBMS_STATS.ALTER_DATABASE_TAB_MONITORING (
monitoring BOOLEAN DEFAULT TRUE,
sysobjs BOOLEAN DEFAULT FALSE);
上述两个过程只影响已经存在的表,不影响之后创建的表,到oracle10g以后,弃用了monitoring选项,由数据库参数statistics_level决定是否启动统计修改次数的功能,当参数设置为typeical或者all时,启动计数。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10176825/viewspace-1032258/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10176825/viewspace-1032258/