1)  先来看下oracle 10g中的自动统计任务的问题。 

从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息。


这个自动任务默认情况下在工作日晚上10:00-6:00和周末全天开启。调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。


可以通过以下查询这个JOB的运行情况:

select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'

其实同在10点运行的Job还有一个AUTO_SPACE_ADVISOR_JOB:

SQL> select JOB_NAME,LAST_START_DATE from dba_scheduler_jobs;

JOB_NAME LAST_START_DATE

------------------------------ ----------------------------------------

AUTO_SPACE_ADVISOR_JOB 04-DEC-07 10.00.00.692269 PM +08:00

GATHER_STATS_JOB 04-DEC-07 10.00.00.701152 PM +08:00

FGR$AUTOPURGE_JOB

PURGE_LOG 05-DEC-07 03.00.00.169059 AM PRC


然而这个自动化功能已经影响了很多系统的正常运行,晚上10点对于大部分生产系统也并非空闲时段。

而自动分析可能导致极为严重的闩锁竞争,进而可能导致数据库Hang或者Crash。


所以建议最好关闭这个自动统计信息收集功能:

exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');



2)oracle 11g的系统自动job



SQL> select job_name,comments from dba_scheduler_jobs;



3)10g关闭自动收集job

select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'

所以建议最好关闭自动统计信息收集功能:

exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

启动自动统计信息收集功能

exec DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');


手工收集统计信息:

SQL> exec dbms_stats.gather_schema_stats('detail',options=>'gather stale',estimate_percent =>10);


--收集没有分析过的表的统计信息

begin

dbms_stats.gather_schema_stats(ownname=>scott,options=>'gather empty');

end;

--重新分析修改量超过10%的表(这些修改包括插入、更新和删除)

begin

dbms_stats.gather_schema_stats(ownname=>scott,options=>'gather stale');

end;


4)11G关系自动收集job

对于11g版本的oracle 有三个自动维护定时任务。

1 自动优化器统计收集:为所有方案对象收集陈旧的或缺少的统计数据,所收集的统计信息将被用来提高sql的执行的性能,任务名是“auto optimizer stats collection”

2 自动分段顾问:标识数据库中的段是否有可以回收的空间,并以此信息统计为基础做出怎样整理段的碎片以节约空间。你也可以手动的执行此job来获取最新的建议信息,或者获取自动段advisor 不检测的但又可以回收的段的信息,任务名是“auto space advisor”

3 自动SQL调整顾问:自动标识并尝试调整高负载的SQL,任务名是“sql tuning advisor”

sys@RAC> select client_name ,status from DBA_AUTOTASK_CLIENT;

CLIENT_NAME STATUS

---------------------------------------------------------------- --------

auto optimizer stats collection ENABLED

auto space advisor ENABLED

sql tuning advisor ENABLED

管理自动维护的job

在oracle 10g中这些job被分别创建并且以DBA_SCHEDULER_JOBS.JOB_NAME的名称出现

然而在11g中则有所改变,通过视图DBA_AUTOTASK_WINDOW_CLIENTS可以查看他们一周七天的执行情况,包括

时间窗口,下次执行时间,job的名称,健康检查

sys@RAC> select * from DBA_AUTOTASK_WINDOW_CLIENTS;

WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ADVISOR SQL_TUNE HEALTH_M

------------------ ---------------------------------- ----- -------- -------- --------------- -------- --------

WEDNESDAY_WINDOW 28-SEP-11 10.00.00.000000 PM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

SATURDAY_WINDOW 01-OCT-11 06.00.00.000000 AM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

THURSDAY_WINDOW 29-SEP-11 10.00.00.000000 PM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

TUESDAY_WINDOW 27-SEP-11 10.00.00.000000 PM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

SUNDAY_WINDOW 02-OCT-11 06.00.00.000000 AM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

MONDAY_WINDOW 03-OCT-11 10.00.00.000000 PM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

FRIDAY_WINDOW 30-SEP-11 10.00.00.000000 PM PRC FALSE DISABLED ENABLED ENABLED ENABLED DISABLED

7 rows selected.


DBMS_AUTO_TASK_ADMIN包的ENABLE和DISABLE存储过程能够实现关闭或者开启的三种job(不要任何参数):

execute DBMS_AUTO_TASK_ADMIN.DISABLE;

execute DBMS_AUTO_TASK_ADMIN.ENABLE;



关闭指定的job

BEGIN

dbms_auto_task_admin.disable(

client_name => 'sql tuning advisor',

peration => NULL,

window_name => NULL);

END;

/

开启指定的job:

BEGIN

dbms_auto_task_admin.enable(

client_name => 'sql tuning advisor',

peration => NULL,

window_name => NULL);

END;

/

关闭周三sql优化器顾问的执行窗口

sys@RAC> BEGIN

2 dbms_auto_task_admin.disable(

3 client_name => 'sql tuning advisor',

4 peration => NULL,

5 window_name => 'MONDAY_WINDOW');

6 END;

7 /

PL/SQL procedure successfully completed.

sys@RAC> select * from DBA_AUTOTASK_WINDOW_CLIENTS;


WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ADVISOR SQL_TUNE HEALTH_M

------------------ ---------------------------------- ----- -------- -------- -------------------- -------- --------

WEDNESDAY_WINDOW 28-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

SATURDAY_WINDOW 01-OCT-11 06.00.00.000000 AM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

THURSDAY_WINDOW 29-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

TUESDAY_WINDOW 27-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

SUNDAY_WINDOW 02-OCT-11 06.00.00.000000 AM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

MONDAY_WINDOW 03-OCT-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED DISABLED DISABLED

FRIDAY_WINDOW 30-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

7 rows selected.

关闭星期天的自动段顾问job的时间窗口:

sys@RAC> BEGIN

2 dbms_auto_task_admin.disable(

3 client_name => 'auto space advisor',

4 peration => NULL,

5 window_name => 'SUNDAY_WINDOW');

6 END;

7 /

PL/SQL procedure successfully completed.


sys@RAC> select * from DBA_AUTOTASK_WINDOW_CLIENTS;


WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ADVISOR SQL_TUNE HEALTH_M

------------------ ---------------------------------- ----- -------- -------- -------------------- -------- --------

WEDNESDAY_WINDOW 28-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

SATURDAY_WINDOW 01-OCT-11 06.00.00.000000 AM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

THURSDAY_WINDOW 29-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

TUESDAY_WINDOW 27-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED

SUNDAY_WINDOW 02-OCT-11 06.00.00.000000 AM PRC FALSE ENABLED ENABLED DISABLED ENABLED DISABLED

MONDAY_WINDOW 03-OCT-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED DISABLED DISABLED

FRIDAY_WINDOW 30-SEP-11 10.00.00.000000 PM PRC FALSE ENABLED ENABLED ENABLED ENABLED DISABLED



5) 11G关闭自动job

SQL> select client_name,status from DBA_AUTOTASK_CLIENT;


CLIENT_NAME STATUS

---------------------------------------------------------------- --------

auto optimizer stats collection ENABLED

auto space advisor ENABLED

sql tuning advisor ENABLED


begin

DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto optimizer stats collection',

operation => NULL,

window_name => NULL);

end;

/

PL/SQL procedure successfully completed.


SQL> select client_name,status from DBA_AUTOTASK_CLIENT;


CLIENT_NAME STATUS

---------------------------------------------------------------- --------

auto optimizer stats collection DISABLED

auto space advisor ENABLED

sql tuning advisor ENABLED