Step 1
Find the start and stop times of the maintenance window:
select window_name, cast(last_start_date as date) "Start Time", DURATION, cast(last_start_date+duration as date) "End Time"
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%');
Which results in:
WINDOW_NAME | Start Time | DURATION | End Time |
WEDNESDAY_WINDOW | 18.04.2018 23:59:00 | +00 04:00:00.000000 | 19.04.2018 03:59:00 |
So my Wednesday window starts at 23:59 and ends 4 hours later, at 03:59.
Step 2
Add the query above as a subquery in a query against DBA_OPTSTAT_OPERATIONS, to get all the IDs for the sub-steps that was executed during this window:
select ID
from DBA_OPTSTAT_OPERATIONS
where operation='gather_database_stats (auto)'
and CAST(start_time AS DATE) BETWEEN
( SELECT CAST (LAST_START_DATE AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
AND
(
SELECT CAST (LAST_START_DATE+DURATION AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
;
Step 3
Put everything together by querying DBA_OPTSTAT_OPERATION_TASKS, to see which tasks and which objects that were analyzed during the time window:
-- get the details for every task executed by "gather_database_stats (auto)"
SELECT opid,
target,
target_objn,
target_type,
target_size,
cast(start_time as date) "Start Time",
cast(end_time as date) "End Time",
status
FROM DBA_OPTSTAT_OPERATION_TASKS
WHERE OPID IN ( -- get the unique ID for the "gather_database_stats (auto)" jobs
SELECT ID FROM DBA_OPTSTAT_OPERATIONS
WHERE OPERATION='gather_database_stats (auto)'
AND CAST (START_TIME AS DATE) BETWEEN
-- get the start and stop times for the last window
-- for a particular weekday
(SELECT CAST(LAST_START_DATE AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
AND (
SELECT CAST(LAST_START_DATE+DURATION AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
)
order by CAST(start_time as DATE) asc;
Sample output (displaying the first and last 5 rows of the record set):
OPID | TARGET | TARGET_OBJN | TARGET_TYPE | TARGET_SIZE | Start Time | End Time | STATUS |
48848 | SYS.ET$16E30DF80001 | 6177051 | TABLE | 0 | 18.04.2018 23:59:30 | 18.04.2018 23:59:30 | FAILED |
48848 | SYS.I_SEQ1 | 79 | INDEX | 1 | 18.04.2018 23:59:30 | 18.04.2018 23:59:31 | COMPLETED |
48848 | SYS.SEQ$ | 74 | TABLE | 7 | 18.04.2018 23:59:30 | 18.04.2018 23:59:31 | COMPLETED |
48848 | SYS.OPTSTAT_HIST_CONTROL$ | 506 | TABLE | 1 | 18.04.2018 23:59:31 | 18.04.2018 23:59:31 | COMPLETED |
48848 | SYS.REG$ | 5775 | TABLE | 1 | 18.04.2018 23:59:31 | 18.04.2018 23:59:31 | COMPLETED |
... |
48885 | SYS.WRH$_SERVICE_STAT.WRH$_SERVICE_STAT_2490506650_826 | 11986128 | TABLE PARTITION | 5 | 19.04.2018 02:00:48 | 19.04.2018 02:00:48 | COMPLETED |
48885 | SYS.WRH$_SEG_STAT_PK.WRH$_SEG_STAT_2490506650_826 | 11986126 | INDEX PARTITION | 1 | 19.04.2018 02:00:48 | 19.04.2018 02:00:48 | COMPLETED |
48885 | SYS.WRH$_SGASTAT_U.WRH$_SGASTAT_2490506650_826 | 11986114 | INDEX PARTITION | 1 | 19.04.2018 02:00:48 | 19.04.2018 02:00:48 | COMPLETED |
48885 | SYS.WRH$_SEG_STAT.WRH$_SEG_STAT_2490506650_826 | 11986124 | TABLE PARTITION | 5 | 19.04.2018 02:00:48 | 19.04.2018 02:00:48 | COMPLETED |
48885 | SYS.WRH$_SEG_STAT.WRH$_SEG_STAT_2490506650_826 | 11986124 | TABLE PARTITION | 5 | 19.04.2018 02:00:48 | 19.04.2018 02:00:48 | COMPLETED |
Check the overall status of your run:
SELECT target_type,status,count(*)
FROM DBA_OPTSTAT_OPERATION_TASKS
WHERE OPID IN ( -- get the unique ID for the "gather_database_stats (auto)" jobs
SELECT ID FROM DBA_OPTSTAT_OPERATIONS
WHERE OPERATION='gather_database_stats (auto)'
AND CAST(START_TIME AS DATE) BETWEEN
-- get the start and stop times for the last window
-- for a particular weekday
(SELECT CAST(LAST_START_DATE AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
AND (
SELECT CAST(LAST_START_DATE+DURATION AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
)
group by target_type,status
order by status;
Result:
TARGET_TYPE | STATUS | COUNT(*) |
INDEX | COMPLETED | 501 |
INDEX PARTITION | COMPLETED | 177 |
TABLE | COMPLETED | 394 |
TABLE PARTITION | COMPLETED | 362 |
TABLE | FAILED | 54 |
To further filter out those objecs that failed, use:
SELECT distinct target,target_objn,target_type
FROM DBA_OPTSTAT_OPERATION_TASKS
WHERE OPID IN ( -- get the unique ID for the "gather_database_stats (auto)" jobs
SELECT ID FROM DBA_OPTSTAT_OPERATIONS
WHERE OPERATION='gather_database_stats (auto)'
AND CAST(START_TIME AS DATE) BETWEEN
-- get the start and stop times for the last window
-- for a particular weekday
(SELECT CAST(LAST_START_DATE AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
AND (
SELECT CAST(LAST_START_DATE+DURATION AS DATE)
FROM DBA_SCHEDULER_WINDOWS
WHERE ENABLED='TRUE'
AND WINDOW_NAME LIKE UPPER('%&&day%')
)
)
AND status = 'FAILED'
order by TARGET;
Which in my case revealed that the following objects need attention:
TARGET | TARGET_OBJN | TARGET_TYPE |
SYS.ET$16E30DF80001 | 6177051 | TABLE |
SYS.X$LOGMNR_CONTENTS | 4294951535 | TABLE |
SYS.X$LOGMNR_REGION | 4294951631 | TABLE |