每個行業都有自己的特點,比如金融行業,每天晚上10點左右會跑批,而自動收集統計信息默認週一到週五晚上10點,持續4個小時收集統計信息,週六週日每天6點,持續20個小時收集統計信息。顯然我們應該設計一個更加合適的時間點來收集統計信息。
這裏演示每天凌晨1點,持續5個小時收集統計信息的方法。
1.查看版本
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
SQL>
--默認值如下
set lines 200
col WINDOW_NAME for a20
col REPEAT_INTERVAL for a60
col DURATION for a20
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';
SQL> set lines 200
SQL> col WINDOW_NAME for a20
SQL> col REPEAT_INTERVAL for a60
SQL> col DURATION for a20
SQL> SELECT w.window_name,
2 w.repeat_interval,
3 w.duration,
4 w.enabled
5 FROM dba_autotask_window_clients c, dba_scheduler_windows w
6 WHERE c.window_name = w.window_name AND c.optimizer_stats = 'ENABLED';
WINDOW_NAME REPEAT_INTERVAL DURATION ENABL
-------------------- ------------------------------------------------------------ -------------------- -----
TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22;byminute=0; bysecond=0 +000 04:00:00 TRUE
WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22;byminute=0; bysecond=0 +000 04:00:00 TRUE
THURSDAY_WINDOW freq=daily;byday=THU;byhour=22;byminute=0; bysecond=0 +000 04:00:00 TRUE
FRIDAY_WINDOW FREQ=daily;BYDAY=FRI;BYHOUR=22;BYMINUTE=30;BYSECOND=0 +000 04:00:00 TRUE
SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6;byminute=0; bysecond=0 +000 20:00:00 TRUE
SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6;byminute=0; bysecond=0 +000 20:00:00 TRUE
6 rows selected.
--修改自動收集統計信息每天凌晨一點,持續5個小時。
--MONDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."MONDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=MON;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."MONDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--TUESDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."TUESDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=TUE;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."TUESDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--WEDNESDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."WEDNESDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=WED;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."WEDNESDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--THURSDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."THURSDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=THU;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."THURSDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--FRIDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."FRIDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=FRI;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."FRIDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--SATURDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."SATURDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=SAT;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."SATURDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
--SUNDAY
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."SUNDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=daily;BYDAY=SUN;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
/
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"SYS"."SUNDAY_WINDOW"',
attribute => 'DURATION',
value => numtodsinterval(300,'minute'));
END;
/
SQL> --驗證是否變更
SQL> set lines 200
SQL> col WINDOW_NAME for a20
SQL> col REPEAT_INTERVAL for a60
SQL> col DURATION for a20
SQL> SELECT w.window_name,
2 w.repeat_interval,
3 w.duration,
4 w.enabled
5 FROM dba_autotask_window_clients c, dba_scheduler_windows w
6 WHERE c.window_name = w.window_name AND c.optimizer_stats = 'ENABLED';
WINDOW_NAME REPEAT_INTERVAL DURATION ENABL
-------------------- ------------------------------------------------------------ -------------------- -----
MONDAY_WINDOW FREQ=daily;BYDAY=MON;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
TUESDAY_WINDOW FREQ=daily;BYDAY=TUE;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
WEDNESDAY_WINDOW FREQ=daily;BYDAY=WED;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
THURSDAY_WINDOW FREQ=daily;BYDAY=THU;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
FRIDAY_WINDOW FREQ=daily;BYDAY=FRI;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
SATURDAY_WINDOW FREQ=daily;BYDAY=SAT;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
SUNDAY_WINDOW FREQ=daily;BYDAY=SUN;BYHOUR=1;BYMINUTE=0;BYSECOND=0 +000 05:00:00 TRUE
7 rows selected.
SQL>