Files
oracle/csierra/cs_dbms_stats_age.sql
2026-03-12 21:23:47 +01:00

188 lines
5.2 KiB
SQL

----------------------------------------------------------------------------------------
--
-- File name: cs_dbms_stats_age.sql
--
-- Purpose: DBMS_STATS Age as per "auto optimizer stats collection"
--
-- Author: Carlos Sierra
--
-- Version: 2021/09/23
--
-- Usage: Execute connected to CDB or PDB.
--
-- Example: $ sqlplus / as sysdba
-- SQL> @cs_dbms_stats_age.sql
--
-- Notes: Developed and tested on 12.1.0.2.
--
---------------------------------------------------------------------------------------
--
@@cs_internal/cs_primary.sql
--@@cs_internal/cs_cdb_warn.sql
@@cs_internal/cs_set.sql
@@cs_internal/cs_def.sql
@@cs_internal/cs_file_prefix.sql
--
DEF cs_script_name = 'cs_dbms_stats_age';
--
SELECT '&&cs_file_prefix._&&cs_script_name.' cs_file_name FROM DUAL;
--
@@cs_internal/cs_spool_head.sql
PRO SQL> @&&cs_script_name..sql
@@cs_internal/cs_spool_id.sql
--
PRO
PRO Latest Window Start Time (dba_autotask_job_history)
PRO ~~~~~~~~~~~~~~~~~~~~~~~~
COL con_id FOR 999999;
COL pdb_name FOR A30 TRUNC;
COL window_name FOR A20;
COL window_start_time FOR A35;
COL window_duration FOR A30;
COL job_start_time FOR A35;
COL job_duration FOR A20;
COL job_info FOR A80;
--
WITH
hist AS (
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
con_id, window_name, window_start_time, window_duration, job_start_time, job_duration,
EXTRACT(DAY FROM (job_start_time - window_start_time) * 24 * 60) AS delay_mins,
ROW_NUMBER() OVER (PARTITION BY con_id ORDER BY window_start_time DESC) AS rn,
job_error, job_status, job_info
FROM cdb_autotask_job_history
WHERE client_name = 'auto optimizer stats collection'
)
SELECT '|' AS "|",
h.con_id, c.name AS pdb_name,
h.window_name, h.window_start_time, h.window_duration, h.job_start_time, h.job_duration, h.delay_mins,
h.job_error, h.job_status, h.job_info
FROM hist h, v$containers c
WHERE h.rn = 1
AND c.con_id = h.con_id
ORDER BY h.con_id, h.window_start_time
/
--
COL con_id FOR 9999990;
COL pdb_name FOR A30 TRUNC;
COL last_good_date FOR A19;
COL days FOR 9,990.00;
--
PRO
PRO DBMS_STATS AGE (dba_autotask_task)
PRO ~~~~~~~~~~~~~~
WITH
last_exec AS (
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
t.con_id,
CAST(t.last_good_date AS DATE) AS last_good_date
FROM cdb_autotask_task t
WHERE t.client_name = 'auto optimizer stats collection'
)
SELECT '|' AS "|",
e.con_id, c.name AS pdb_name,
TO_CHAR(e.last_good_date, 'YYYY-MM-DD"T"HH24:MI:SS') AS last_good_date,
ROUND(SYSDATE - e.last_good_date, 2) AS days
FROM last_exec e, v$containers c
WHERE c.con_id = e.con_id
ORDER BY
e.con_id
/
--
COL con_id FOR 999990;
COL pdb_name FOR A30 TRUNC;
COL tables FOR 99,990;
COL days1 FOR 9,990.00;
COL days2 FOR 9,990.00;
COL max_last_analyzed FOR A19;
COL p90th_percentile FOR A19;
--
PRO
PRO DBMS_STATS AGE (dba_tables)
PRO ~~~~~~~~~~~~~~
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
'|' AS "|",
t.con_id,
c.name AS pdb_name,
MAX(t.last_analyzed) AS max_last_analyzed,
ROUND(SYSDATE - MAX(t.last_analyzed), 2) AS days1,
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC) AS p90th_percentile,
ROUND(SYSDATE - PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC), 2) AS days2,
COUNT(*) AS tables
FROM cdb_tables t, cdb_users u, v$containers c
WHERE t.con_id <> 2
AND u.con_id = t.con_id
AND u.username = t.owner
AND u.oracle_maintained = 'N'
AND u.common = 'NO'
AND c.con_id = t.con_id
GROUP BY
t.con_id, c.name
ORDER BY
t.con_id, c.name
/
--
COL con_id FOR 9999990;
COL pdb_name FOR A30 TRUNC;
COL last_good_date FOR A19;
COL days FOR 9,990.00;
COL tables FOR 99,990;
COL days1 FOR 9,990.00;
COL days2 FOR 9,990.00;
COL max_last_analyzed FOR A19;
COL p90th_percentile FOR A19;
PRO
PRO DBMS_STATS AGE (dba_autotask_task and dba_tables)
PRO ~~~~~~~~~~~~~~
WITH
autotask_task AS (
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
t.con_id,
TO_CHAR(t.last_good_date, 'YYYY-MM-DD"T"HH24:MI:SS') AS last_good_date,
ROUND(SYSDATE - CAST(t.last_good_date AS DATE), 2) AS days
FROM cdb_autotask_task t
WHERE t.client_name = 'auto optimizer stats collection'
),
tables AS (
SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') */
t.con_id,
MAX(t.last_analyzed) AS max_last_analyzed,
ROUND(SYSDATE - MAX(t.last_analyzed), 2) AS days1,
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC) AS p90th_percentile,
ROUND(SYSDATE - PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY t.last_analyzed ASC), 2) AS days2,
COUNT(*) AS tables
FROM cdb_tables t, cdb_users u
WHERE t.con_id <> 2
AND u.con_id = t.con_id
AND u.username = t.owner
AND u.oracle_maintained = 'N'
AND u.common = 'NO'
GROUP BY
t.con_id
)
SELECT '|' AS "|",
a.con_id,
c.name AS pdb_name,
a.last_good_date,
a.days,
'|' AS "|",
t.max_last_analyzed,
t.days1,
t.p90th_percentile,
t.days2,
t.tables
FROM autotask_task a, tables t, v$containers c
WHERE t.con_id = a.con_id
AND c.con_id = a.con_id
ORDER BY
a.con_id
/
--
PRO
PRO SQL> @&&cs_script_name..sql
--
@@cs_internal/cs_spool_tail.sql
@@cs_internal/cs_undef.sql
@@cs_internal/cs_reset.sql
--