發(fā)布于:2021-02-21 00:00:33
0
614
0
調(diào)用DBMS_STATS包的自動優(yōu)化器統(tǒng)計信息收集作業(yè)在預定義的維護窗口中運行,這些維護窗口每天打開一次,在此期間執(zhí)行各種作業(yè),包括收集統(tǒng)計信息。
對于volatile表,在連續(xù)兩次執(zhí)行此類自動統(tǒng)計信息收集作業(yè)之間,統(tǒng)計信息可能會過時。過時統(tǒng)計信息的存在可能會導致性能問題,因為優(yōu)化器正在選擇次優(yōu)的執(zhí)行計劃。
在oracle19c中引入的新特性稱為高頻自動優(yōu)化器統(tǒng)計數(shù)據(jù)收集(High Frequency Automatic Optimizer Statistics Collection),它補充了標準的自動統(tǒng)計數(shù)據(jù)收集作業(yè)。
默認情況下,高頻統(tǒng)計信息收集每15分鐘進行一次,因此,即使對于那些數(shù)據(jù)不斷變化的表,也不太可能有過時的統(tǒng)計信息。
所述DBMS_STATS.SET_GLOBAL_PREFS程序用于啟用和禁用高頻統(tǒng)計收集任務以及改變執(zhí)行間隔(默認值15分鐘)和最大運行時間(60分鐘)。
讓我們看一個使用這個新的oracle19c特性的例子。
我們可以看到MYOBJECTS_19C表的統(tǒng)計信息是過時的,現(xiàn)在我們使用DBMS_STATS.SET_GLOBAL_PREFS過程啟用每隔5分鐘收集一次高頻統(tǒng)計信息。
SQL> select stale_stats from user_tab_statistics where table_name='MYOBJECTS_19C';
STALE_S
-------
YES
SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_TASK_STATUS','ON');
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_TASK_INTERVAL','300');
PL/SQL procedure successfully completed.
我們可以查詢DBA_AUTO_STAT_EXECUTIONS數(shù)據(jù)字典表以獲取有關(guān)每日標準自動統(tǒng)計執(zhí)行作業(yè)的狀態(tài)的信息。我們可以看到該工作在工作日的夜間維護時段中運行,而在晚上的維護時段運行中這一天。
SQL> SELECT OPID, ORIGIN, STATUS, TO_CHAR(START_TIME, 'DD/MM HH24:MI:SS' ) AS BEGIN_TIME,
TO_CHAR(END_TIME, 'DD/MM HH24:MI:SS') AS END_TIME, COMPLETED, FAILED,
TIMED_OUT AS TIMEOUT, IN_PROGRESS AS INPROG
FROM DBA_AUTO_STAT_EXECUTIONS
ORDER BY OPID;
OPID ORIGIN STATUS BEGIN_TIME END_TIME COMPLETED FAILED TIMEOUT INPROG
----- -------------------- ----------- -------------- -------------- --------- ------ ------- ------
659 AUTO_TASK COMPLETED 10/06 23:00:50 10/06 23:02:02 569 2 0 0
681 AUTO_TASK COMPLETED 11/06 00:10:58 11/06 00:11:20 296 2 0 0
684 AUTO_TASK COMPLETED 11/06 00:20:59 11/06 00:21:11 62 2 0 0
687 AUTO_TASK COMPLETED 11/06 00:31:00 11/06 00:31:04 43 2 0 0
690 AUTO_TASK COMPLETED 11/06 00:41:01 11/06 00:41:05 46 2 0 0
693 AUTO_TASK COMPLETED 11/06 00:51:02 11/06 00:51:05 44 2 0 0
699 AUTO_TASK COMPLETED 11/06 01:01:04 11/06 01:01:12 148 2 0 0
702 AUTO_TASK COMPLETED 11/06 01:11:05 11/06 01:11:08 43 2 0 0
705 AUTO_TASK COMPLETED 11/06 01:21:06 11/06 01:21:08 31 2 0 0
708 AUTO_TASK COMPLETED 11/06 01:31:07 11/06 01:31:10 39 2 0 0
711 AUTO_TASK COMPLETED 11/06 01:41:09 11/06 01:41:12 39 2 0 0
1045 AUTO_TASK COMPLETED 12/06 22:00:09 12/06 22:02:47 644 1 0 0
1085 AUTO_TASK COMPLETED 13/06 22:00:03 13/06 22:02:09 467 1 0 0
1125 AUTO_TASK COMPLETED 15/06 08:23:50 15/06 08:25:46 362 1 0 0
14 rows selected.
如果再次運行同一查詢,大約5分鐘后,我們可以運行另一個“自動任務”統(tǒng)計作業(yè),這就是高頻統(tǒng)計信息收集作業(yè)。
我們還可以看到,以前將統(tǒng)計數(shù)據(jù)報告為過時的表現(xiàn)在收集了新的統(tǒng)計數(shù)據(jù)。
SQL> SELECT OPID, ORIGIN, STATUS, TO_CHAR(START_TIME, 'DD/MM HH24:MI:SS' ) AS BEGIN_TIME,
TO_CHAR(END_TIME, 'DD/MM HH24:MI:SS') AS END_TIME, COMPLETED, FAILED,
TIMED_OUT AS TIMEOUT, IN_PROGRESS AS INPROG
FROM DBA_AUTO_STAT_EXECUTIONS
ORDER BY OPID;
OPID ORIGIN STATUS BEGIN_TIME END_TIME COMPLETED FAILED TIMEOUT INPROG
----- -------------------- ----------- -------------- -------------- --------- ------ ------- ------
659 AUTO_TASK COMPLETED 10/06 23:00:50 10/06 23:02:02 569 2 0 0
681 AUTO_TASK COMPLETED 11/06 00:10:58 11/06 00:11:20 296 2 0 0
684 AUTO_TASK COMPLETED 11/06 00:20:59 11/06 00:21:11 62 2 0 0
687 AUTO_TASK COMPLETED 11/06 00:31:00 11/06 00:31:04 43 2 0 0
690 AUTO_TASK COMPLETED 11/06 00:41:01 11/06 00:41:05 46 2 0 0
693 AUTO_TASK COMPLETED 11/06 00:51:02 11/06 00:51:05 44 2 0 0
699 AUTO_TASK COMPLETED 11/06 01:01:04 11/06 01:01:12 148 2 0 0
702 AUTO_TASK COMPLETED 11/06 01:11:05 11/06 01:11:08 43 2 0 0
705 AUTO_TASK COMPLETED 11/06 01:21:06 11/06 01:21:08 31 2 0 0
708 AUTO_TASK COMPLETED 11/06 01:31:07 11/06 01:31:10 39 2 0 0
711 AUTO_TASK COMPLETED 11/06 01:41:09 11/06 01:41:12 39 2 0 0
1045 AUTO_TASK COMPLETED 12/06 22:00:09 12/06 22:02:47 644 1 0 0
1085 AUTO_TASK COMPLETED 13/06 22:00:03 13/06 22:02:09 467 1 0 0
1125 AUTO_TASK COMPLETED 15/06 08:23:50 15/06 08:25:46 362 1 0 0
1287 AUTO_TASK IN PROGRESS 15/06 17:38:25 15/06 17:38:25 83 0 0 1
15 rows selected.
SQL>
SQL> select stale_stats from user_tab_statistics where table_name='MYOBJECTS_19C';
STALE_S
-------
NO