1. 程式人生 > 其它 >Oracle 11G統計資訊自動收集及調整

Oracle 11G統計資訊自動收集及調整

Oracle 11G統計資訊自動收集及調整

Leshami 2017-03-25 11:05:35 11194 收藏 3
分類專欄: -----Oracle效能優化 文章標籤: 資料庫 oracle oracle 11g 商城 需求
版權

-----Oracle效能優化
專欄收錄該內容
62 篇文章5 訂閱
訂閱專欄
從Oracle 11G開始,資料庫統計資訊的自動收集被整合到自動維護任務中,滿足大多數情形下的執行需求。但對於線上商城,交易系統而言,可能需要調整其執行時間或者自行指定收集視窗。本文描述瞭如何檢視以及調整自動收集統計時間視窗等,供大家參考。

一、預設的統計資訊相關狀態檢視
1、檢視自動收集統計資訊對應的task(也就是program的名稱)及狀態
--當前狀態
SQL> select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

--如下查詢表明統計資訊的收集是位於gather_stats_prog這個task,當前狀態為enabled,即啟用
SELECT client_name,task_name, status
FROM dba_autotask_task
WHERE client_name = 'auto optimizer stats collection';

CLIENT_NAME TASK_NAME STATUS
----------------------------------- ---------------------- --------
auto optimizer stats collection gather_stats_prog ENABLED

--下面查詢dba_scheduler_programs
--在scheduler_programs中,程式GATHER_STATS_PROG呼叫
--dbms_stats.gather_database_stats_job_proc來實現統計資訊的自動收集,如下查詢
SQL> SELECT program_action, number_of_arguments, enabled
2 FROM dba_scheduler_programs
3 WHERE owner = 'SYS'
4 AND program_name = 'GATHER_STATS_PROG';

PROGRAM_ACTION NUMBER_OF_ARGUMENTS ENABL
------------------------------------------ ------------------- -----
dbms_stats.gather_database_stats_job_proc 0 TRUE

2、檢視自動收集統計資訊是否開啟
SELECT CLIENT_NAME,
STATUS
FROM DBA_AUTOTASK_CLIENT
WHERE CLIENT_NAME = 'auto optimizer stats collection';

CLIENT_NAME STATUS
----------------------------------- --------
auto optimizer stats collection ENABLED

3、統計資訊收集的視窗組,如下查詢
SQL> SELECT window_group
2 FROM dba_autotask_client
3 WHERE client_name = 'auto optimizer stats collection';

WINDOW_GROUP
----------------------------------------------------------------
ORA$AT_WGRP_OS

4、查詢統計資訊收集的具體視窗
--統計資訊收集的時間視窗
--如下查詢週一至週五時間為22點,週六日為6點
--此外持續也不相同,週一至週五為4小時,週六日為20個小時
--enabled為true表明當前的這些作業處於啟用狀態
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 ENABL
------------------------- ------------------------------ ------------------------- -----
MONDAY_WINDOW freq=daily;byday=MON;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0

TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0

WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0

THURSDAY_WINDOW freq=daily;byday=THU;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0

FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0

SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6; +000 20:00:00 TRUE
byminute=0; bysecond=0

SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6; +000 20:00:00 TRUE
byminute=0; bysecond=0

4、檢視自動收集統計資訊歷史執行情況
SELECT * --Author : Leshami
FROM dba_autotask_client_history --Blog : http://blog.csdn.net/leshami
WHERE client_name LIKE '%stats%';

二、統計資訊收集排程時間禁用及修改
1、啟用自動收集統計資訊
BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;

2、禁用自動收集統計資訊
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;

--執行上面的程式碼後,驗證是否被禁用
SELECT CLIENT_NAME,
STATUS
FROM DBA_AUTOTASK_CLIENT
WHERE CLIENT_NAME = 'auto optimizer stats collection';

CLIENT_NAME STATUS
----------------------------------- --------
auto optimizer stats collection DISABLED

3、關閉單個排程時間視窗
BEGIN
DBMS_AUTO_TASK_ADMIN.disable (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => 'MONDAY_WINDOW');
END;
/

--驗證關閉情況,如下,optimizer_stats列為DISABLED
SQL> SELECT window_name,
2 window_next_time,
3 window_active,
4 optimizer_stats
5 FROM dba_autotask_window_clients
6 WHERE window_name = 'MONDAY_WINDOW'
7 ORDER BY window_next_time;

WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE
------------------------- ------------------------------------ ----- --------
MONDAY_WINDOW 27-MAR-17 10.00.00.000000 PM PRC FALSE DISABLED

4、關閉所有時間排程視窗,驗證略
BEGIN
DBMS_AUTO_TASK_ADMIN.disable (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

5、開啟單個排程時間視窗及所有時間排程視窗,只需要使用enable過程
-- 注:單個應指定視窗名字,如window_name => 'MONDAY_WINDOW'
BEGIN
DBMS_AUTO_TASK_ADMIN.enable (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

6、修改時間視窗到特定的時間
--如下示例,將週五時間視窗時間到晚間23點30分
BEGIN
DBMS_SCHEDULER.DISABLE (name => '"SYS"."FRIDAY_WINDOW"', force => TRUE);
END;

BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => '"SYS"."FRIDAY_WINDOW"',
attribute => 'REPEAT_INTERVAL',
VALUE => 'FREQ=WEEKLY;BYDAY=FRI;BYHOUR=23;BYMINUTE=30;BYSECOND=0');
END;

BEGIN
DBMS_SCHEDULER.ENABLE (name => '"SYS"."FRIDAY_WINDOW"');
END;

--驗證修改
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'
AND c.window_name = 'FRIDAY_WINDOW';


WINDOW_NAME REPEAT_INTERVAL DURATION ENABL
--------------- ------------------------------------------------------------ ------------ --------
FRIDAY_WINDOW FREQ=WEEKLY;BYDAY=FRI;BYHOUR=23;BYMINUTE=30;BYSECOND=0 +000 04:00:0 TRUE

7、新增維護時間視窗
-- 假定我們要處理的是修改週一的時間視窗
-- 首先關閉週一的時間視窗
BEGIN
DBMS_AUTO_TASK_ADMIN.disable (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => 'MONDAY_WINDOW');
END;
/

--接下來建立一個視窗並設定時間排程間隔
--如下,每週一5點執行,持續時間為1小時
BEGIN
DBMS_SCHEDULER.create_window (
window_name => 'STATS_WINDOW',
resource_plan => 'DEFAULT_MAINTENANCE_PLAN',
repeat_interval => 'freq=daily;byday=MON;byhour=5;byminute=0; bysecond=0',
duration => INTERVAL '1' HOUR,
comments => 'Test window for stats task');
EXCEPTION
WHEN OTHERS
THEN
IF SQLCODE = -27477
THEN
NULL;
ELSE
RAISE;
END IF;
END;

BEGIN
DBMS_SCHEDULER.set_attribute ('STATS_WINDOW', 'SYSTEM', TRUE);
DBMS_SCHEDULER.set_attribute ('STATS_WINDOW',
'FOLLOW_DEFAULT_TIMEZONE',
TRUE);
EXCEPTION
WHEN OTHERS
THEN
IF SQLCODE = -27477
THEN
NULL;
ELSE
RAISE;
END IF;
END;
/

SQL> SELECT window_name, repeat_interval, enabled
2 FROM dba_scheduler_windows
3 WHERE window_name = 'STATS_WINDOW';

WINDOW_NAME REPEAT_INTERVAL ENABL
------------------------------ ------------------------------------------------------------ -----
STATS_WINDOW freq=daily;byday=MON;byhour=5;byminute=0; bysecond=0 TRUE

--接下來將視窗STATS_WINDOW新增到維護視窗組

BEGIN
DBMS_SCHEDULER.add_window_group_member ('MAINTENANCE_WINDOW_GROUP',
'STATS_WINDOW');
END;
/

SQL> SELECT WINDOW_NAME,
2 WINDOW_NEXT_TIME,
3 WINDOW_ACTIVE,
4 OPTIMIZER_STATS
5 FROM DBA_AUTOTASK_WINDOW_CLIENTS
6 WHERE WINDOW_NAME in ('STATS_WINDOW','MONDAY_WINDOW')
7 ORDER BY WINDOW_NEXT_TIME;

WINDOW_NAME WINDOW_NEXT_TIME WINDO OPTIMIZE
------------------------------ -------------------------------------- ----- --------
STATS_WINDOW 27-MAR-17 05.00.00.000000 AM PRC FALSE ENABLED --允許
MONDAY_WINDOW 27-MAR-17 10.00.00.000000 PM PRC FALSE DISABLED --當前被disabled

三、手工執行統計資訊的自動收集
SQL> create table scott.tb_objs as select * from dba_objects;

SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from dba_tables where TABLE_NAME='TB_OBJS';

TABLE_NAME NUM_ROWS BLOCKS LAST_ANAL
------------------------------ ---------- ---------- ---------
TB_OBJS

--執行下面的這個儲存過程
SQL> EXEC DBMS_AUTO_TASK_IMMEDIATE.GATHER_OPTIMIZER_STATS;

PL/SQL procedure successfully completed.

--如下查詢,scott表上的統計資訊已更新
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from dba_tables where TABLE_NAME='TB_OBJS';

TABLE_NAME NUM_ROWS BLOCKS LAST_ANAL
------------------------------ ---------- ---------- ---------
TB_OBJS 75548 1103 25-MAR-17

四、參考連結
How to use an own Maintenance Window for the Statistics Collection in 11g [ID 1300313.1]
MOS相關文件: FAQ: Automatic Statistics Collection [ID 1233203.1]
[dbms_stats 匯入匯出 schema 級別統計資訊](http://blog.csdn.net/leshami/article/details/8938201)
————————————————
版權宣告:本文為CSDN博主「Leshami」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/leshami/article/details/65935325