在11g之前,当表的数据量修改超过总数据量的10%,就会晚上自动收集统计信息,如何判断10%,之前的帖子有研究过:Oracle自动统计信息的收集原理及实验。这个STALE_PERCENT=10%,是无法修改的,如果表非常大,10%是非常多的数据,非常有可能造成统计信息不准确。
在11g之后,STALE_PERCENT=10%是可以修改的,分为全局(DBMS_STATS.SET_GLOBAL_PREFS )和表级别(DBMS_STATS.SET_TABLE_PREFS)。表级别的设定:
修改为5%(范围从1-100): exec dbms_stats.set_table_prefs(null,'table_name','STALE_PERCENT',5); 恢复为10%: exec dbms_stats.set_table_prefs(null,'table_name','STALE_PERCENT',null); 查询百分比:select dbms_stats.get_prefs('STALE_PERCENT',null,'table_name') from dual;
---11g的是 周一到周五 22:00-2:00 周六周日 6:00-4:00
SELECT w.window_name, w.repeat_interval, w.duration, w.enabled FROM dba_autotask_window_clients c, dba_scheduler_windows w WHERE c.window_name = w.window_name AND c.optimizer_stats = 'ENABLED'; WINDOW_NAME REPEAT_INTERVAL DURATION -------------------- ------------------------------------------------------------ --------------- SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0 +000 20:00:00 FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22;byminute=0; bysecond=0 +000 04:00:00 WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00 SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0 +000 20:00:00 THURSDAY_WINDOW freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0 +000 04:00:00 TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0 +000 04:00:00 MONDAY_WINDOW freq=daily;byday=MON;byhour=22;byminute=0; bysecond=0 +000 04:00:00
--禁用自动收集 exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL); --启用自动收集 exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL); --查看job
select client_name,status from dba_autotask_client;
CLIENT_NAME STATUS ---------------------------------------------------------------- -------- auto optimizer stats collection ENABLED auto space advisor ENABLED sql tuning advisor ENABLED
--收集当前数据库下所有用户的统计信息 exec dbms_stats.gather_database_stats(user); --收集当前数据库用户下所有对象的统计信息 exec dbms_stats.gather_schema_stats(user); --收集数据字典的统计信息 exec dbms_stats.gather_dictionary_stats(); --当系统有很大的分区表时,如果总是全部收集则会比较慢,11g之后可以设置INCREMENTAL只对数据有变动的分区做收集
exec dbms_stats.set_table_prefs(user,'table_name','INCREMENTAL','TRUE');--只收集数据变动的分区
exec dbms_stats.set_table_prefs(user,'table_name','INCREMENTAL','FALSE');--都要收集
select dbms_stats.get_prefs('INCREMENTAL',null,'table_name') from dual;--查看分区表INCREMENTAL的值
--获取global的统计信息收集设置选项 select dbms_stats.get_prefs('method_opt') from dual; select dbms_stats.get_prefs('concurrent') from dual; select dbms_stats.get_prefs('GRANULARITY') from dual;
select dbms_stats.get_prefs('INCREMENTAL') from dual; --设置global的统计信息收集选项
exec DBMS_STATS.SET_PARAM('DEGREE',4);
exec DBMS_STATS.SET_PARAM('INCREMENTAL','TRUE');
Oracle 单实例 从32位 迁移到 64位 方法 http://www./Linux/2012-03/55759.htm
在CentOS 6.4下安装Oracle 11gR2(x64) http://www./Linux/2014-02/97374.htm
Oracle 11gR2 在VMWare虚拟机中安装步骤 http://www./Linux/2013-09/89579p2.htm
Debian 下 安装 Oracle 11g XE R2 http://www./Linux/2014-03/98881.htm
Oracle导入导出expdp IMPDP详解 http://www./Linux/2014-04/99932.htm
Oracle 10g expdp导出报错ORA-4031的解决方法 http://www./Linux/2014-04/99842.htm
更多Oracle相关信息见Oracle 专题页面 http://www./topicnews.aspx?tid=12
本文永久更新链接地址:http://www./Linux/2014-11/109691.htm
|